00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SEMIRING_RATIONAL_NUMBER_HH
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_SEMIRING_RATIONAL_NUMBER_HH
00019 
00020 # include <iostream>
00021 
00022 # include <vaucanson/misc/limits.hh>
00023 
00037 namespace vcsn
00038 {
00039   namespace algebra
00040   {
00041 
00044 
00059     class RationalNumber
00060     {
00061       public:
00062 
00064 
00065 
00066         RationalNumber (int num, unsigned int denom);
00068         RationalNumber ();
00070         RationalNumber (const RationalNumber& nb);
00080         template <typename T>
00081         explicit RationalNumber (const T num);
00083 
00085 
00086 
00087         const int&      num () const;
00089         const unsigned& denom () const;
00091 
00092         std::ostream&   print (std::ostream& ostr) const;
00093 
00095 
00096 
00097         RationalNumber  operator+ (const RationalNumber& nb) const;
00098         RationalNumber  operator- (const RationalNumber& nb) const;
00099         RationalNumber  operator- () const;
00100         RationalNumber  operator* (const RationalNumber& nb) const;
00101         RationalNumber  operator/ (const RationalNumber& nb) const;
00102         RationalNumber& operator+= (const RationalNumber& nb);
00103         RationalNumber& operator-= (const RationalNumber& nb);
00104         RationalNumber& operator*= (const RationalNumber& nb);
00105         RationalNumber& operator/= (const RationalNumber& nb);
00106         bool    operator< (const RationalNumber& nb) const;
00107         bool    operator> (const RationalNumber& nb) const;
00108         bool    operator<= (const RationalNumber& nb) const;
00109         bool    operator>= (const RationalNumber& nb) const;
00110         bool    operator== (const RationalNumber& nb) const;
00111         bool    operator!= (const RationalNumber& nb) const;
00113 
00115 
00116 
00124         int             to_int () const;
00125         double          to_double () const;
00127 
00128       protected:
00129         int             num_;
00130         unsigned int    denom_;
00131 
00133 
00134 
00142         RationalNumber& set_result ();
00143         RationalNumber& set_result (int num, unsigned int denom);
00145     };
00146 
00147     
00148     
00149 # define RATIONAL_NUMBER_OPERATOR(type, op)                     \
00150     template <class T>                                          \
00151     type operator op (const RationalNumber& nb, const T nb2)    \
00152     {                                                           \
00153       return nb op RationalNumber (nb2);                        \
00154     }                                                           \
00155                                                                 \
00156         template <class T>                                      \
00157         type operator op (const T nb2, const RationalNumber& nb)\
00158         {                                                       \
00159           return RationalNumber (nb2) op nb;                    \
00160         }
00161 
00162 # define RATIONAL_NUMBER_IN_PLACE_OPERATOR(op)                          \
00163     template <class T>                                                  \
00164     RationalNumber& operator op (RationalNumber& nb, const T nb2)       \
00165     {                                                                   \
00166       return nb op RationalNumber (nb2);                                \
00167     }
00168 
00169     RATIONAL_NUMBER_OPERATOR (bool, <);
00170     RATIONAL_NUMBER_OPERATOR (bool, <=);
00171     RATIONAL_NUMBER_OPERATOR (bool, >);
00172     RATIONAL_NUMBER_OPERATOR (bool, >=);
00173     RATIONAL_NUMBER_OPERATOR (bool, ==);
00174     RATIONAL_NUMBER_OPERATOR (bool, !=);
00175     RATIONAL_NUMBER_OPERATOR (RationalNumber, +);
00176     RATIONAL_NUMBER_OPERATOR (RationalNumber, -);
00177     RATIONAL_NUMBER_OPERATOR (RationalNumber, *);
00178     RATIONAL_NUMBER_OPERATOR (RationalNumber, /);
00179     RATIONAL_NUMBER_IN_PLACE_OPERATOR (+=);
00180     RATIONAL_NUMBER_IN_PLACE_OPERATOR (-=);
00181     RATIONAL_NUMBER_IN_PLACE_OPERATOR (*=);
00182     RATIONAL_NUMBER_IN_PLACE_OPERATOR (/=);
00183 
00184 # undef RATIONAL_NUMBER_OPERATOR
00185 # undef RATIONAL_NUMBER_IN_PLACE_OPERATOR
00186 
00187     
00188     std::ostream& operator<< (std::ostream& ostr, const RationalNumber& nb);
00189 
00190     
00191     int         gcd (int a, unsigned int b);
00192     int         lcm (int a, unsigned int b);
00193 
00197   } 
00198 } 
00199 
00200 namespace std
00201 {
00202   template <>
00203   struct numeric_limits< ::vcsn::algebra::RationalNumber >
00204   {
00205       static ::vcsn::algebra::RationalNumber min ();
00206       static ::vcsn::algebra::RationalNumber max ();
00207   };
00208 
00209 } 
00210 
00213 namespace vcsn
00214 {
00215   namespace misc
00216   {
00217     template <>
00218     struct limits< ::vcsn::algebra::RationalNumber > :
00219         public std::numeric_limits< ::vcsn::algebra::RationalNumber >
00220     {
00221     };
00222   } 
00223 } 
00224 
00225 # ifndef VCSN_USE_INTERFACE_ONLY
00226 #  include <vaucanson/algebra/implementation/semiring/rational_number.hxx>
00227 # endif // VCSN_USE_INTERFACE_ONLY
00228 
00229 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SEMIRING_RATIONAL_NUMBER_HH