Chris@16: /* Chris@16: Copyright 2008 Intel Corporation Chris@16: Chris@16: Use, modification and distribution are subject to the Boost Software License, Chris@16: Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt). Chris@16: */ Chris@16: #ifndef BOOST_POLYGON_GMP_OVERRIDE_HPP Chris@16: #define BOOST_POLYGON_GMP_OVERRIDE_HPP Chris@16: #include Chris@16: namespace boost { namespace polygon { Chris@16: Chris@16: class gmp_int { Chris@16: private: Chris@16: inline gmp_int(const mpq_class& input) : v_(input) {} Chris@16: public: Chris@16: inline gmp_int() {} Chris@16: explicit inline gmp_int(long input) : v_(input) {} Chris@16: inline gmp_int(const gmp_int& input) : v_(input.v_) {} Chris@16: inline gmp_int& operator=(const gmp_int& that) { Chris@16: v_ = that.v_; Chris@16: return (*this); Chris@16: } Chris@16: inline gmp_int& operator=(long that) { Chris@16: v_ = that; Chris@16: return (*this); Chris@16: } Chris@16: inline operator int() const { Chris@16: std::cout << "cast\n"; Chris@16: mpz_class num = v_.get_num(); Chris@16: mpz_class den = v_.get_den(); Chris@16: num /= den; Chris@16: return num.get_si(); Chris@16: } Chris@16: inline double get_d() const { Chris@16: return v_.get_d(); Chris@16: } Chris@16: inline int get_num() const { Chris@16: return v_.get_num().get_si(); Chris@16: } Chris@16: inline int get_den() const { Chris@16: return v_.get_den().get_si(); Chris@16: } Chris@16: inline bool operator==(const gmp_int& that) const { Chris@16: return v_ == that.v_; Chris@16: } Chris@16: inline bool operator!=(const gmp_int& that) const { Chris@16: return v_ != that.v_; Chris@16: } Chris@16: inline bool operator<(const gmp_int& that) const { Chris@16: bool retval = v_ < that.v_; Chris@16: return retval; Chris@16: } Chris@16: inline bool operator<=(const gmp_int& that) const { Chris@16: return v_ <= that.v_; Chris@16: } Chris@16: inline bool operator>(const gmp_int& that) const { Chris@16: return v_ > that.v_; Chris@16: } Chris@16: inline bool operator>=(const gmp_int& that) const { Chris@16: return v_ >= that.v_; Chris@16: } Chris@16: inline gmp_int operator+(const gmp_int& b) { Chris@16: return gmp_int((*this).v_ + b.v_); Chris@16: } Chris@16: inline gmp_int operator-(const gmp_int& b) { Chris@16: return gmp_int((*this).v_ - b.v_); Chris@16: } Chris@16: inline gmp_int operator*(const gmp_int& b) { Chris@16: return gmp_int((*this).v_ * b.v_); Chris@16: } Chris@16: inline gmp_int operator/(const gmp_int& b) { Chris@16: return gmp_int((*this).v_ / b.v_); Chris@16: } Chris@16: inline gmp_int& operator+=(const gmp_int& b) { Chris@16: (*this).v_ += b.v_; Chris@16: return (*this); Chris@16: } Chris@16: inline gmp_int& operator-=(const gmp_int& b) { Chris@16: (*this).v_ -= b.v_; Chris@16: return (*this); Chris@16: } Chris@16: inline gmp_int& operator*=(const gmp_int& b) { Chris@16: (*this).v_ *= b.v_; Chris@16: return (*this); Chris@16: } Chris@16: inline gmp_int& operator/=(const gmp_int& b) { Chris@16: (*this).v_ /= b.v_; Chris@16: return (*this); Chris@16: } Chris@16: inline gmp_int& operator++() { Chris@16: ++v_; Chris@16: return (*this); Chris@16: } Chris@16: inline gmp_int& operator--() { Chris@16: --v_; Chris@16: return (*this); Chris@16: } Chris@16: inline gmp_int operator++(int) { Chris@16: gmp_int retval(*this); Chris@16: ++(*this); Chris@16: return retval; Chris@16: } Chris@16: inline gmp_int operator--(int) { Chris@16: gmp_int retval(*this); Chris@16: --(*this); Chris@16: return retval; Chris@16: } Chris@16: private: Chris@16: mpq_class v_; Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct high_precision_type { Chris@16: typedef mpq_class type; Chris@16: }; Chris@16: Chris@16: template <> Chris@16: int convert_high_precision_type(const mpq_class& v) { Chris@16: mpz_class num = v.get_num(); Chris@16: mpz_class den = v.get_den(); Chris@16: num /= den; Chris@16: return num.get_si(); Chris@16: }; Chris@16: Chris@16: } Chris@16: } Chris@16: #endif