diff --git a/rational.cpp b/rational.cpp index b7f8611d..51ed3d43 100644 --- a/rational.cpp +++ b/rational.cpp @@ -54,8 +54,50 @@ rational::operator double (void) const { } +//----------------------------------------------------------------------------- +template +rational::operator int (void) const { + return n / d; +} + + +//----------------------------------------------------------------------------- +template +rational +rational::inverse (void) const { + return rational { d, n }; +} + + +//----------------------------------------------------------------------------- +template +template +rational +rational::operator* (const U &rhs) const { + return { rhs * n, d }; +} + + +//----------------------------------------------------------------------------- +template +template +rational +rational::operator/ (const U &rhs) const { + return { n, rhs * d }; +} + + +//----------------------------------------------------------------------------- +template +rational +util::operator/ (U lhs, rational rhs) { + return rhs.inverse () * lhs; +} + //----------------------------------------------------------------------------- namespace util { template struct rational; template struct rational; + + template rational operator/ (int, rational); } diff --git a/rational.hpp b/rational.hpp index 0ccf141b..3ce3a380 100644 --- a/rational.hpp +++ b/rational.hpp @@ -30,10 +30,20 @@ namespace util { explicit operator float (void) const; explicit operator double (void) const; + explicit operator int (void) const; + + rational inverse (void) const; + rational& invert (void); + + template rational operator* (const U&) const; + template rational operator/ (const U&) const; T n; T d; }; + + template + rational operator/ (U, rational); } #endif