Changeset 541dbc09 for libcfa/src/rational.hfa
- Timestamp:
- Jun 6, 2023, 8:44:14 AM (13 months ago)
- Branches:
- ast-experimental, master
- Children:
- 77afbb4
- Parents:
- 6a93e4d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/rational.hfa
r6a93e4d r541dbc09 12 12 // Created On : Wed Apr 6 17:56:25 2016 13 13 // Last Modified By : Peter A. Buhr 14 // Last Modified On : Tue Jul 20 17:45:29 202115 // Update Count : 11 814 // Last Modified On : Mon Jun 5 22:49:05 2023 15 // Update Count : 119 16 16 // 17 17 … … 19 19 20 20 #include "iostream.hfa" 21 #include "math.trait.hfa" // Arithmetic21 #include "math.trait.hfa" // arithmetic 22 22 23 23 // implementation 24 24 25 forall( T | Arithmetic( T ) ) {26 struct Rational {25 forall( T | arithmetic( T ) ) { 26 struct rational { 27 27 T numerator, denominator; // invariant: denominator > 0 28 }; // Rational28 }; // rational 29 29 30 30 // constructors 31 31 32 void ?{}( Rational(T) & r );33 void ?{}( Rational(T) & r, zero_t );34 void ?{}( Rational(T) & r, one_t );35 void ?{}( Rational(T) & r, T n );36 void ?{}( Rational(T) & r, T n, T d );32 void ?{}( rational(T) & r ); 33 void ?{}( rational(T) & r, zero_t ); 34 void ?{}( rational(T) & r, one_t ); 35 void ?{}( rational(T) & r, T n ); 36 void ?{}( rational(T) & r, T n, T d ); 37 37 38 38 // numerator/denominator getter 39 39 40 T numerator( Rational(T) r );41 T denominator( Rational(T) r );42 [ T, T ] ?=?( & [ T, T ] dest, Rational(T) src );40 T numerator( rational(T) r ); 41 T denominator( rational(T) r ); 42 [ T, T ] ?=?( & [ T, T ] dest, rational(T) src ); 43 43 44 44 // numerator/denominator setter 45 45 46 T numerator( Rational(T) r, T n );47 T denominator( Rational(T) r, T d );46 T numerator( rational(T) r, T n ); 47 T denominator( rational(T) r, T d ); 48 48 49 49 // comparison 50 50 51 int ?==?( Rational(T) l, Rational(T) r );52 int ?!=?( Rational(T) l, Rational(T) r );53 int ?!=?( Rational(T) l, zero_t ); // => !54 int ?<?( Rational(T) l, Rational(T) r );55 int ?<=?( Rational(T) l, Rational(T) r );56 int ?>?( Rational(T) l, Rational(T) r );57 int ?>=?( Rational(T) l, Rational(T) r );51 int ?==?( rational(T) l, rational(T) r ); 52 int ?!=?( rational(T) l, rational(T) r ); 53 int ?!=?( rational(T) l, zero_t ); // => ! 54 int ?<?( rational(T) l, rational(T) r ); 55 int ?<=?( rational(T) l, rational(T) r ); 56 int ?>?( rational(T) l, rational(T) r ); 57 int ?>=?( rational(T) l, rational(T) r ); 58 58 59 59 // arithmetic 60 60 61 Rational(T) +?( Rational(T) r );62 Rational(T) -?( Rational(T) r );63 Rational(T) ?+?( Rational(T) l, Rational(T) r );64 Rational(T) ?+=?( Rational(T) & l, Rational(T) r );65 Rational(T) ?+=?( Rational(T) & l, one_t ); // => ++?, ?++66 Rational(T) ?-?( Rational(T) l, Rational(T) r );67 Rational(T) ?-=?( Rational(T) & l, Rational(T) r );68 Rational(T) ?-=?( Rational(T) & l, one_t ); // => --?, ?--69 Rational(T) ?*?( Rational(T) l, Rational(T) r );70 Rational(T) ?*=?( Rational(T) & l, Rational(T) r );71 Rational(T) ?/?( Rational(T) l, Rational(T) r );72 Rational(T) ?/=?( Rational(T) & l, Rational(T) r );61 rational(T) +?( rational(T) r ); 62 rational(T) -?( rational(T) r ); 63 rational(T) ?+?( rational(T) l, rational(T) r ); 64 rational(T) ?+=?( rational(T) & l, rational(T) r ); 65 rational(T) ?+=?( rational(T) & l, one_t ); // => ++?, ?++ 66 rational(T) ?-?( rational(T) l, rational(T) r ); 67 rational(T) ?-=?( rational(T) & l, rational(T) r ); 68 rational(T) ?-=?( rational(T) & l, one_t ); // => --?, ?-- 69 rational(T) ?*?( rational(T) l, rational(T) r ); 70 rational(T) ?*=?( rational(T) & l, rational(T) r ); 71 rational(T) ?/?( rational(T) l, rational(T) r ); 72 rational(T) ?/=?( rational(T) & l, rational(T) r ); 73 73 74 74 // I/O 75 75 forall( istype & | istream( istype ) | { istype & ?|?( istype &, T & ); } ) 76 istype & ?|?( istype &, Rational(T) & );76 istype & ?|?( istype &, rational(T) & ); 77 77 78 78 forall( ostype & | ostream( ostype ) | { ostype & ?|?( ostype &, T ); } ) { 79 ostype & ?|?( ostype &, Rational(T) );80 void ?|?( ostype &, Rational(T) );79 ostype & ?|?( ostype &, rational(T) ); 80 void ?|?( ostype &, rational(T) ); 81 81 } // distribution 82 82 } // distribution 83 83 84 forall( T | Arithmetic( T ) | { T ?\?( T, unsigned long ); } ) {85 Rational(T) ?\?( Rational(T) x, long int y );86 Rational(T) ?\=?( Rational(T) & x, long int y );84 forall( T | arithmetic( T ) | { T ?\?( T, unsigned long ); } ) { 85 rational(T) ?\?( rational(T) x, long int y ); 86 rational(T) ?\=?( rational(T) & x, long int y ); 87 87 } // distribution 88 88 89 89 // conversion 90 forall( T | Arithmetic( T ) | { double convert( T ); } )91 double widen( Rational(T) r );92 forall( T | Arithmetic( T ) | { double convert( T ); T convert( double );} )93 Rational(T) narrow( double f, T md );90 forall( T | arithmetic( T ) | { double convert( T ); } ) 91 double widen( rational(T) r ); 92 forall( T | arithmetic( T ) | { double convert( T ); T convert( double );} ) 93 rational(T) narrow( double f, T md ); 94 94 95 95 // Local Variables: //
Note: See TracChangeset
for help on using the changeset viewer.