Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:47:58

0001 /*
0002   Copyright 2008 Intel Corporation
0003 
0004   Use, modification and distribution are subject to the Boost Software License,
0005   Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
0006   http://www.boost.org/LICENSE_1_0.txt).
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