File indexing completed on 2025-01-18 09:47:58
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_POLYGON_GMP_OVERRIDE_HPP
0009 #define BOOST_POLYGON_GMP_OVERRIDE_HPP
0010 #include <gmpxx.h>
0011 namespace boost { namespace polygon {
0012
0013 class gmp_int {
0014 private:
0015 inline gmp_int(const mpq_class& input) : v_(input) {}
0016 public:
0017 inline gmp_int() {}
0018 explicit inline gmp_int(long input) : v_(input) {}
0019 inline gmp_int(const gmp_int& input) : v_(input.v_) {}
0020 inline gmp_int& operator=(const gmp_int& that) {
0021 v_ = that.v_;
0022 return (*this);
0023 }
0024 inline gmp_int& operator=(long that) {
0025 v_ = that;
0026 return (*this);
0027 }
0028 inline operator int() const {
0029 std::cout << "cast\n";
0030 mpz_class num = v_.get_num();
0031 mpz_class den = v_.get_den();
0032 num /= den;
0033 return num.get_si();
0034 }
0035 inline double get_d() const {
0036 return v_.get_d();
0037 }
0038 inline int get_num() const {
0039 return v_.get_num().get_si();
0040 }
0041 inline int get_den() const {
0042 return v_.get_den().get_si();
0043 }
0044 inline bool operator==(const gmp_int& that) const {
0045 return v_ == that.v_;
0046 }
0047 inline bool operator!=(const gmp_int& that) const {
0048 return v_ != that.v_;
0049 }
0050 inline bool operator<(const gmp_int& that) const {
0051 bool retval = v_ < that.v_;
0052 return retval;
0053 }
0054 inline bool operator<=(const gmp_int& that) const {
0055 return v_ <= that.v_;
0056 }
0057 inline bool operator>(const gmp_int& that) const {
0058 return v_ > that.v_;
0059 }
0060 inline bool operator>=(const gmp_int& that) const {
0061 return v_ >= that.v_;
0062 }
0063 inline gmp_int operator+(const gmp_int& b) {
0064 return gmp_int((*this).v_ + b.v_);
0065 }
0066 inline gmp_int operator-(const gmp_int& b) {
0067 return gmp_int((*this).v_ - b.v_);
0068 }
0069 inline gmp_int operator*(const gmp_int& b) {
0070 return gmp_int((*this).v_ * b.v_);
0071 }
0072 inline gmp_int operator/(const gmp_int& b) {
0073 return gmp_int((*this).v_ / b.v_);
0074 }
0075 inline gmp_int& operator+=(const gmp_int& b) {
0076 (*this).v_ += b.v_;
0077 return (*this);
0078 }
0079 inline gmp_int& operator-=(const gmp_int& b) {
0080 (*this).v_ -= b.v_;
0081 return (*this);
0082 }
0083 inline gmp_int& operator*=(const gmp_int& b) {
0084 (*this).v_ *= b.v_;
0085 return (*this);
0086 }
0087 inline gmp_int& operator/=(const gmp_int& b) {
0088 (*this).v_ /= b.v_;
0089 return (*this);
0090 }
0091 inline gmp_int& operator++() {
0092 ++v_;
0093 return (*this);
0094 }
0095 inline gmp_int& operator--() {
0096 --v_;
0097 return (*this);
0098 }
0099 inline gmp_int operator++(int) {
0100 gmp_int retval(*this);
0101 ++(*this);
0102 return retval;
0103 }
0104 inline gmp_int operator--(int) {
0105 gmp_int retval(*this);
0106 --(*this);
0107 return retval;
0108 }
0109 private:
0110 mpq_class v_;
0111 };
0112
0113 template <>
0114 struct high_precision_type<int> {
0115 typedef mpq_class type;
0116 };
0117
0118 template <>
0119 int convert_high_precision_type<int>(const mpq_class& v) {
0120 mpz_class num = v.get_num();
0121 mpz_class den = v.get_den();
0122 num /= den;
0123 return num.get_si();
0124 };
0125
0126 }
0127 }
0128 #endif