Chris@16
|
1 /*
|
Chris@16
|
2 Copyright 2008 Intel Corporation
|
Chris@16
|
3
|
Chris@16
|
4 Use, modification and distribution are subject to the Boost Software License,
|
Chris@16
|
5 Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
6 http://www.boost.org/LICENSE_1_0.txt).
|
Chris@16
|
7 */
|
Chris@16
|
8 #ifndef BOOST_POLYGON_GMP_OVERRIDE_HPP
|
Chris@16
|
9 #define BOOST_POLYGON_GMP_OVERRIDE_HPP
|
Chris@16
|
10 #include <gmpxx.h>
|
Chris@16
|
11 namespace boost { namespace polygon {
|
Chris@16
|
12
|
Chris@16
|
13 class gmp_int {
|
Chris@16
|
14 private:
|
Chris@16
|
15 inline gmp_int(const mpq_class& input) : v_(input) {}
|
Chris@16
|
16 public:
|
Chris@16
|
17 inline gmp_int() {}
|
Chris@16
|
18 explicit inline gmp_int(long input) : v_(input) {}
|
Chris@16
|
19 inline gmp_int(const gmp_int& input) : v_(input.v_) {}
|
Chris@16
|
20 inline gmp_int& operator=(const gmp_int& that) {
|
Chris@16
|
21 v_ = that.v_;
|
Chris@16
|
22 return (*this);
|
Chris@16
|
23 }
|
Chris@16
|
24 inline gmp_int& operator=(long that) {
|
Chris@16
|
25 v_ = that;
|
Chris@16
|
26 return (*this);
|
Chris@16
|
27 }
|
Chris@16
|
28 inline operator int() const {
|
Chris@16
|
29 std::cout << "cast\n";
|
Chris@16
|
30 mpz_class num = v_.get_num();
|
Chris@16
|
31 mpz_class den = v_.get_den();
|
Chris@16
|
32 num /= den;
|
Chris@16
|
33 return num.get_si();
|
Chris@16
|
34 }
|
Chris@16
|
35 inline double get_d() const {
|
Chris@16
|
36 return v_.get_d();
|
Chris@16
|
37 }
|
Chris@16
|
38 inline int get_num() const {
|
Chris@16
|
39 return v_.get_num().get_si();
|
Chris@16
|
40 }
|
Chris@16
|
41 inline int get_den() const {
|
Chris@16
|
42 return v_.get_den().get_si();
|
Chris@16
|
43 }
|
Chris@16
|
44 inline bool operator==(const gmp_int& that) const {
|
Chris@16
|
45 return v_ == that.v_;
|
Chris@16
|
46 }
|
Chris@16
|
47 inline bool operator!=(const gmp_int& that) const {
|
Chris@16
|
48 return v_ != that.v_;
|
Chris@16
|
49 }
|
Chris@16
|
50 inline bool operator<(const gmp_int& that) const {
|
Chris@16
|
51 bool retval = v_ < that.v_;
|
Chris@16
|
52 return retval;
|
Chris@16
|
53 }
|
Chris@16
|
54 inline bool operator<=(const gmp_int& that) const {
|
Chris@16
|
55 return v_ <= that.v_;
|
Chris@16
|
56 }
|
Chris@16
|
57 inline bool operator>(const gmp_int& that) const {
|
Chris@16
|
58 return v_ > that.v_;
|
Chris@16
|
59 }
|
Chris@16
|
60 inline bool operator>=(const gmp_int& that) const {
|
Chris@16
|
61 return v_ >= that.v_;
|
Chris@16
|
62 }
|
Chris@16
|
63 inline gmp_int operator+(const gmp_int& b) {
|
Chris@16
|
64 return gmp_int((*this).v_ + b.v_);
|
Chris@16
|
65 }
|
Chris@16
|
66 inline gmp_int operator-(const gmp_int& b) {
|
Chris@16
|
67 return gmp_int((*this).v_ - b.v_);
|
Chris@16
|
68 }
|
Chris@16
|
69 inline gmp_int operator*(const gmp_int& b) {
|
Chris@16
|
70 return gmp_int((*this).v_ * b.v_);
|
Chris@16
|
71 }
|
Chris@16
|
72 inline gmp_int operator/(const gmp_int& b) {
|
Chris@16
|
73 return gmp_int((*this).v_ / b.v_);
|
Chris@16
|
74 }
|
Chris@16
|
75 inline gmp_int& operator+=(const gmp_int& b) {
|
Chris@16
|
76 (*this).v_ += b.v_;
|
Chris@16
|
77 return (*this);
|
Chris@16
|
78 }
|
Chris@16
|
79 inline gmp_int& operator-=(const gmp_int& b) {
|
Chris@16
|
80 (*this).v_ -= b.v_;
|
Chris@16
|
81 return (*this);
|
Chris@16
|
82 }
|
Chris@16
|
83 inline gmp_int& operator*=(const gmp_int& b) {
|
Chris@16
|
84 (*this).v_ *= b.v_;
|
Chris@16
|
85 return (*this);
|
Chris@16
|
86 }
|
Chris@16
|
87 inline gmp_int& operator/=(const gmp_int& b) {
|
Chris@16
|
88 (*this).v_ /= b.v_;
|
Chris@16
|
89 return (*this);
|
Chris@16
|
90 }
|
Chris@16
|
91 inline gmp_int& operator++() {
|
Chris@16
|
92 ++v_;
|
Chris@16
|
93 return (*this);
|
Chris@16
|
94 }
|
Chris@16
|
95 inline gmp_int& operator--() {
|
Chris@16
|
96 --v_;
|
Chris@16
|
97 return (*this);
|
Chris@16
|
98 }
|
Chris@16
|
99 inline gmp_int operator++(int) {
|
Chris@16
|
100 gmp_int retval(*this);
|
Chris@16
|
101 ++(*this);
|
Chris@16
|
102 return retval;
|
Chris@16
|
103 }
|
Chris@16
|
104 inline gmp_int operator--(int) {
|
Chris@16
|
105 gmp_int retval(*this);
|
Chris@16
|
106 --(*this);
|
Chris@16
|
107 return retval;
|
Chris@16
|
108 }
|
Chris@16
|
109 private:
|
Chris@16
|
110 mpq_class v_;
|
Chris@16
|
111 };
|
Chris@16
|
112
|
Chris@16
|
113 template <>
|
Chris@16
|
114 struct high_precision_type<int> {
|
Chris@16
|
115 typedef mpq_class type;
|
Chris@16
|
116 };
|
Chris@16
|
117
|
Chris@16
|
118 template <>
|
Chris@16
|
119 int convert_high_precision_type<int>(const mpq_class& v) {
|
Chris@16
|
120 mpz_class num = v.get_num();
|
Chris@16
|
121 mpz_class den = v.get_den();
|
Chris@16
|
122 num /= den;
|
Chris@16
|
123 return num.get_si();
|
Chris@16
|
124 };
|
Chris@16
|
125
|
Chris@16
|
126 }
|
Chris@16
|
127 }
|
Chris@16
|
128 #endif
|