# source:src/libcfa/rational@a493682

Last change on this file since a493682 was a493682, checked in by Rob Schluntz <rschlunt@…>, 7 years ago

Update several library files to use references

• Property mode set to 100644
File size: 4.9 KB
Line
1//
2// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// rational -- Rational numbers are numbers written as a ratio, i.e., as a fraction, where the numerator (top number)
8//     and the denominator (bottom number) are whole numbers. When creating and computing with rational numbers, results
9//     are constantly reduced to keep the numerator and denominator as small as possible.
10//
11// Author           : Peter A. Buhr
12// Created On       : Wed Apr  6 17:56:25 2016
15// Update Count     : 93
16//
17
18#pragma once
19
20#include "iostream"
21
22trait scalar( otype T ) {
23};
24
25trait arithmetic( otype T | scalar( T ) ) {
26        int !?( T );
27        int ?==?( T, T );
28        int ?!=?( T, T );
29        int ?<?( T, T );
30        int ?<=?( T, T );
31        int ?>?( T, T );
32        int ?>=?( T, T );
33        void ?{}( T &, zero_t );
34        void ?{}( T &, one_t );
35        T +?( T );
36        T -?( T );
37        T ?+?( T, T );
38        T ?-?( T, T );
39        T ?*?( T, T );
40        T ?/?( T, T );
41        T ?%?( T, T );
42        T ?/=?( T *, T );
43        T abs( T );
44};
45
46// implementation
47
48forall( otype RationalImpl | arithmetic( RationalImpl ) )
49struct Rational {
50        RationalImpl numerator, denominator;                            // invariant: denominator > 0
51}; // Rational
52
53// constructors
54
55forall( otype RationalImpl | arithmetic( RationalImpl ) )
56void ?{}( Rational(RationalImpl) & r );
57
58forall( otype RationalImpl | arithmetic( RationalImpl ) )
59void ?{}( Rational(RationalImpl) & r, RationalImpl n );
60
61forall( otype RationalImpl | arithmetic( RationalImpl ) )
62void ?{}( Rational(RationalImpl) & r, RationalImpl n, RationalImpl d );
63
64forall( otype RationalImpl | arithmetic( RationalImpl ) )
65void ?{}( Rational(RationalImpl) & r, zero_t );
66
67forall( otype RationalImpl | arithmetic( RationalImpl ) )
68void ?{}( Rational(RationalImpl) & r, one_t );
69
70// numerator/denominator getter
71
72forall( otype RationalImpl | arithmetic( RationalImpl ) )
73RationalImpl numerator( Rational(RationalImpl) r );
74
75forall( otype RationalImpl | arithmetic( RationalImpl ) )
76RationalImpl denominator( Rational(RationalImpl) r );
77
78forall( otype RationalImpl | arithmetic( RationalImpl ) )
79[ RationalImpl, RationalImpl ] ?=?( & [ RationalImpl, RationalImpl ] dest, Rational(RationalImpl) src );
80
81// numerator/denominator setter
82
83forall( otype RationalImpl | arithmetic( RationalImpl ) )
84RationalImpl numerator( Rational(RationalImpl) r, RationalImpl n );
85
86forall( otype RationalImpl | arithmetic( RationalImpl ) )
87RationalImpl denominator( Rational(RationalImpl) r, RationalImpl d );
88
89// comparison
90
91forall( otype RationalImpl | arithmetic( RationalImpl ) )
92int ?==?( Rational(RationalImpl) l, Rational(RationalImpl) r );
93
94forall( otype RationalImpl | arithmetic( RationalImpl ) )
95int ?!=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
96
97forall( otype RationalImpl | arithmetic( RationalImpl ) )
98int ?<?( Rational(RationalImpl) l, Rational(RationalImpl) r );
99
100forall( otype RationalImpl | arithmetic( RationalImpl ) )
101int ?<=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
102
103forall( otype RationalImpl | arithmetic( RationalImpl ) )
104int ?>?( Rational(RationalImpl) l, Rational(RationalImpl) r );
105
106forall( otype RationalImpl | arithmetic( RationalImpl ) )
107int ?>=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
108
109// arithmetic
110
111forall( otype RationalImpl | arithmetic( RationalImpl ) )
112Rational(RationalImpl) +?( Rational(RationalImpl) r );
113
114forall( otype RationalImpl | arithmetic( RationalImpl ) )
115Rational(RationalImpl) -?( Rational(RationalImpl) r );
116
117forall( otype RationalImpl | arithmetic( RationalImpl ) )
118Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r );
119
120forall( otype RationalImpl | arithmetic( RationalImpl ) )
121Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r );
122
123forall( otype RationalImpl | arithmetic( RationalImpl ) )
124Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r );
125
126forall( otype RationalImpl | arithmetic( RationalImpl ) )
127Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r );
128
129// conversion
130forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )
131double widen( Rational(RationalImpl) r );
132forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl );  RationalImpl convert( double );} )
133Rational(RationalImpl) narrow( double f, RationalImpl md );
134
135// I/O
136forall( otype RationalImpl | arithmetic( RationalImpl ) )
137forall( dtype istype | istream( istype ) | { istype * ?|?( istype *, RationalImpl * ); } )
138istype * ?|?( istype *, Rational(RationalImpl) * );
139
140forall( otype RationalImpl | arithmetic( RationalImpl ) )
141forall( dtype ostype | ostream( ostype ) | { ostype * ?|?( ostype *, RationalImpl ); } )
142ostype * ?|?( ostype *, Rational(RationalImpl ) );
143
144// Local Variables: //
145// mode: c //
146// tab-width: 4 //
147// End: //
Note: See TracBrowser for help on using the repository browser.