00001 00028 // ################################################################## 00029 // frac ... calculating with fractions 00030 // ################################################################## 00031 00032 #ifndef FRAC_H 00033 #define FRAC_H 00034 00035 #include "Defs.h" 00036 #include "wx/string.h" 00037 00038 #ifdef HAVE_BOOST_RATIONAL_HPP 00039 #include <boost/rational.hpp> 00040 00041 typedef boost::rational<long> frac; 00042 00043 inline wxString TowxString(frac f) 00044 { 00045 return wxString::Format(_T("%ld/%ld"),f.numerator(),f.denominator()); 00046 } 00047 00048 00049 #else 00050 00051 00052 #include <iostream> 00053 00054 class frac 00055 { 00056 00057 private: 00058 long n, d; 00059 00060 public: 00061 frac() 00062 { 00063 n = 0; 00064 d = 1; 00065 } 00066 00067 frac(long integerval) 00068 { 00069 n = integerval; 00070 d = 0; 00071 } 00072 00073 frac(long numerator, long denominator) 00074 { 00075 n = numerator; 00076 d = denominator; 00077 } 00078 00079 long numerator() const {return n;} 00080 00081 long denominator() const {return d;} 00082 00083 frac& operator =(const frac& f); 00084 00085 frac& operator +=(const frac& f); 00086 00087 frac& operator -=(const frac& f); 00088 00089 frac& operator *=(const frac& f); 00090 00091 frac& operator /=(const frac& f); 00092 00093 frac operator +(const frac s); 00094 00095 frac operator -(const frac s); 00096 00097 frac operator *(const frac s); 00098 00099 frac operator /(const frac s); 00100 00101 int operator <(const frac &f); 00102 00103 int operator <=(const frac &f); 00104 00105 int operator ==(const frac &f); 00106 00107 int operator !=(const frac &f); 00108 00109 int operator >=(const frac &f); 00110 00111 int operator >(const frac &f); 00112 00113 operator bool() 00114 { 00115 return n; 00116 } 00117 00118 bool operator !() 00119 00120 { 00121 return !n; 00122 } 00123 00124 frac& operator =(const int &i); 00125 00126 long gcd(long a, long b); 00127 00128 friend STD_PRE::ostream& operator << (STD_PRE::ostream& os, const frac f); 00129 00130 #ifdef WX 00131 operator wxString() const 00132 { 00133 return wxString::Format(_T("%ld/%ld"),n,d); 00134 } 00135 00136 #endif 00137 }; 00138 00139 #ifdef WX 00140 inline wxString TowxString(const frac &f) 00141 { 00142 return (wxString) f; 00143 } 00144 00145 inline STD_PRE::ostream& operator<<(STD_PRE::ostream& os, const frac f) 00146 { 00147 return os << "(" << f.n << "/" << f.d << ")"; 00148 } 00149 #endif 00150 00151 #endif /* HAVE_BOOST_RATIONAL_H */ 00152 00153 #endif 00154 00155 00156