diff --git a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h index 5abb39fff25..4b1cad10d07 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h @@ -736,6 +736,7 @@ void test_Type_functions( const CGAL::Euclidean_ring_tag&) { b = AS(5); r = CGAL_NTS mod(a,b); q = CGAL_NTS div(a,b); + std::cout << r << std::endl << q << std::endl; assert( a == b*q+r); CGAL_NTS div_mod(a,b,q,r); assert( a == b*q+r); @@ -876,7 +877,9 @@ void test_algebraic_structure(){ c = b * AS (-3); assert( c == AS (-15)); c = a; + c += b; + assert( c == AS (6)); c = a; c -= b; diff --git a/CGAL_Core/include/CGAL/CORE/BigFloat.h b/CGAL_Core/include/CGAL/CORE/BigFloat.h index 97183f63e50..176de0b1997 100644 --- a/CGAL_Core/include/CGAL/CORE/BigFloat.h +++ b/CGAL_Core/include/CGAL/CORE/BigFloat.h @@ -69,6 +69,7 @@ public: : RCBigFloat(new BigFloatRep(i)) {} BigFloat(long& x, const extLong& /*r*/, const extLong& /*a*/) : RCBigFloat(new BigFloatRep(x)) {} + /// constructor from BigInt, error and exponent values BigFloat(const BigInt& I, unsigned long er, long ex) : RCBigFloat(new BigFloatRep(I, er, ex)) {} @@ -77,6 +78,7 @@ public: : RCBigFloat(new BigFloatRep(I, ex)) {} BigFloat(const BigInt& I) : RCBigFloat(new BigFloatRep(I)) {} + /// constructor for BigRat BigFloat(const BigRat& R, const extLong& r = get_static_defRelPrec(), const extLong& a = get_static_defAbsPrec()) @@ -214,10 +216,12 @@ public: double doubleValue() const { return rep->toDouble(); } + /// return BigInt value BigInt BigIntValue() const { return rep->toBigInt(); } + /// return BigRat value BigRat BigRatValue() const { return rep->BigRatize(); @@ -262,6 +266,7 @@ public: const BigInt& m() const { return rep->m; } + /// get error bits unsigned long err() const { return rep->err; @@ -359,10 +364,12 @@ public: /// \name Utility Functions //@{ /// approximate BigInt number + void approx(const BigInt& I, const extLong& r, const extLong& a) { makeCopy(); rep->trunc(I, r, a); } + /// approximate BigFloat number void approx(const BigFloat& B, const extLong& r, const extLong& a) { makeCopy(); diff --git a/CGAL_Core/include/CGAL/CORE/BigInt.h b/CGAL_Core/include/CGAL/CORE/BigInt.h index 7b16a960ac3..5db2b9880cf 100644 --- a/CGAL_Core/include/CGAL/CORE/BigInt.h +++ b/CGAL_Core/include/CGAL/CORE/BigInt.h @@ -24,6 +24,7 @@ #ifndef _CORE_BIGINT_H_ #define _CORE_BIGINT_H_ +#include #include #include #include @@ -31,79 +32,104 @@ namespace CORE { + typedef boost::multiprecision::cpp_int Z; -class BigIntRep : public RCRepImpl { + + + class BigIntRep : public RCRepImpl { public: - BigIntRep() { - mpz_init(mp); - } - // Note : should the copy-ctor be alloed at all ? [Sylvain Pion] - BigIntRep(const BigIntRep& z) : RCRepImpl() { - mpz_init_set(mp, z.mp); - } - BigIntRep(signed char c) { - mpz_init_set_si(mp, c); - } - BigIntRep(unsigned char c) { - mpz_init_set_ui(mp, c); - } - BigIntRep(signed int i) { - mpz_init_set_si(mp, i); - } - BigIntRep(unsigned int i) { - mpz_init_set_ui(mp, i); - } - BigIntRep(signed short int s) { - mpz_init_set_si(mp, s); - } - BigIntRep(unsigned short int s) { - mpz_init_set_ui(mp, s); - } - BigIntRep(signed long int l) { - mpz_init_set_si(mp, l); - } - BigIntRep(unsigned long int l) { - mpz_init_set_ui(mp, l); - } - BigIntRep(float f) { - mpz_init_set_d(mp, f); - } - BigIntRep(double d) { - mpz_init_set_d(mp, d); - } - BigIntRep(const char* s, int base=0) { - mpz_init_set_str(mp, s, base); - } - BigIntRep(const std::string& s, int base=0) { - mpz_init_set_str(mp, s.c_str(), base); - } - explicit BigIntRep(mpz_srcptr z) { - mpz_init_set(mp, z); - } + BigIntRep() + : mp() + {} + + + // Note : should the copy-ctor be allowed at all ? [Sylvain Pion] + BigIntRep(const BigIntRep& z) : RCRepImpl(), mp(z.mp) + {} + + BigIntRep(signed char c) + : mp(c) + {} + + BigIntRep(unsigned char c) + : mp(c) + {} + + BigIntRep(signed int i) + : mp(i) + {} + + BigIntRep(unsigned int i) + : mp(i) + {} + + + BigIntRep(signed short int s) + : mp(s) + {} + BigIntRep(unsigned short int s) + : mp(s) + {} + + BigIntRep(signed long int l) + : mp(l) + {} + + BigIntRep(unsigned long int l) + : mp(l) + {} + + BigIntRep(float f) + : mp(f) + {} + + BigIntRep(double d) + : mp(d) + {} + + BigIntRep(const char* s, int base=0) + : mp(s) + {} + + BigIntRep(const std::string& s, int base=0) + : mp(s) + {} + + + explicit BigIntRep(const Z& z) + : mp(z) + {} + /* ~BigIntRep() { mpz_clear(mp); } + */ - CGAL_CORE_EXPORT CORE_NEW(BigIntRep) - CGAL_CORE_EXPORT CORE_DELETE(BigIntRep) + //CGAL_CORE_EXPORT CORE_NEW(BigIntRep) + //CGAL_CORE_EXPORT CORE_DELETE(BigIntRep) - mpz_srcptr get_mp() const { + const Z& get_mp() const { return mp; } - mpz_ptr get_mp() { + Z& get_mp() { return mp; } private: - mpz_t mp; + Z mp; }; -typedef RCImpl RCBigInt; -class CGAL_CORE_EXPORT BigInt : public RCBigInt { + //typedef RCImpl RCBigInt; + +class CGAL_CORE_EXPORT BigInt : public RCImpl { public: + + typedef RCImpl RCBigInt; + /// \name Constructors //@{ /// default constructor BigInt() : RCBigInt(new BigIntRep()) {} + BigInt(const Z& z) : RCBigInt(new BigIntRep(z)) {} /// constructor for signed char BigInt(signed char x) : RCBigInt(new BigIntRep(x)) {} /// constructor for unsigned char @@ -128,8 +154,9 @@ public: BigInt(const char* s, int base=0) : RCBigInt(new BigIntRep(s, base)) {} /// constructor for std::string with base BigInt(const std::string& s, int base=0) : RCBigInt(new BigIntRep(s, base)) {} + /// constructor for mpz_srcptr - explicit BigInt(mpz_srcptr z) : RCBigInt(new BigIntRep(z)) {} + // explicit BigInt(mpz_srcptr z) : RCBigInt(new BigIntRep(z)) {} //@} /// \name Copy-Assignment-Destructor @@ -157,52 +184,53 @@ public: //@{ BigInt& operator +=(const BigInt& rhs) { makeCopy(); - mpz_add(get_mp(), get_mp(), rhs.get_mp()); + get_mp() += rhs.get_mp(); return *this; } + BigInt& operator -=(const BigInt& rhs) { makeCopy(); - mpz_sub(get_mp(), get_mp(), rhs.get_mp()); + get_mp() -= rhs.get_mp(); return *this; } BigInt& operator *=(const BigInt& rhs) { makeCopy(); - mpz_mul(get_mp(), get_mp(), rhs.get_mp()); + get_mp() *= rhs.get_mp(); return *this; } BigInt& operator /=(const BigInt& rhs) { makeCopy(); - mpz_tdiv_q(get_mp(), get_mp(), rhs.get_mp()); + get_mp() /= rhs.get_mp(); return *this; } BigInt& operator %=(const BigInt& rhs) { makeCopy(); - mpz_tdiv_r(get_mp(), get_mp(), rhs.get_mp()); + get_mp() %= rhs.get_mp(); return *this; } BigInt& operator &=(const BigInt& rhs) { makeCopy(); - mpz_and(get_mp(), get_mp(), rhs.get_mp()); + get_mp() &= rhs.get_mp(); return *this; } BigInt& operator |=(const BigInt& rhs) { makeCopy(); - mpz_ior(get_mp(), get_mp(), rhs.get_mp()); + get_mp() |= rhs.get_mp(); return *this; } BigInt& operator ^=(const BigInt& rhs) { makeCopy(); - mpz_xor(get_mp(), get_mp(), rhs.get_mp()); + get_mp() ^= rhs.get_mp(); return *this; } BigInt& operator <<=(unsigned long ul) { makeCopy(); - mpz_mul_2exp(get_mp(), get_mp(), ul); + get_mp() <<= ul; return *this; } BigInt& operator >>=(unsigned long ul) { makeCopy(); - mpz_tdiv_q_2exp(get_mp(), get_mp(), ul); + get_mp() >>= ul; return *this; } //@} @@ -214,17 +242,17 @@ public: } BigInt operator-() const { BigInt r; - mpz_neg(r.get_mp(), get_mp()); + r.get_mp() = -get_mp(); return r; } BigInt& operator++() { makeCopy(); - mpz_add_ui(get_mp(), get_mp(), 1); + ++get_mp(); return *this; } BigInt& operator--() { makeCopy(); - mpz_sub_ui(get_mp(), get_mp(), 1); + --get_mp(); return *this; } BigInt operator++(int) { @@ -246,11 +274,11 @@ public: return false; } /// get mpz pointer (const) - mpz_srcptr get_mp() const { + const Z& get_mp() const { return rep->get_mp(); } /// get mpz pointer - mpz_ptr get_mp() { + Z& get_mp() { return rep->get_mp(); } //@} @@ -260,16 +288,12 @@ public: /// set value from const char* int set_str(const char* s, int base = 0) { makeCopy(); - return mpz_set_str(get_mp(), s, base); + get_mp() = Z(s); + return 0; // should be -1 if not correct in the base (we ignore) } /// convert to std::string std::string get_str(int base = 10) const { - int n = mpz_sizeinbase (get_mp(), base) + 2; - char *buffer = new char[n]; - mpz_get_str(buffer, base, get_mp()); - std::string result(buffer); - delete [] buffer; - return result; + return get_mp().convert_to(); } //@} @@ -277,130 +301,152 @@ public: //@{ /// intValue int intValue() const { - return static_cast(mpz_get_si(get_mp())); + return get_mp().convert_to(); } /// longValue long longValue() const { - return mpz_get_si(get_mp()); + return get_mp().convert_to(); } /// ulongValue unsigned long ulongValue() const { - return mpz_get_ui(get_mp()); + return get_mp().convert_to(); } /// doubleValue double doubleValue() const { - return mpz_get_d(get_mp()); + return get_mp().convert_to(); } //@} }; inline BigInt operator+(const BigInt& a, const BigInt& b) { BigInt r; - mpz_add(r.get_mp(), a.get_mp(), b.get_mp()); - return r; -} -inline BigInt operator-(const BigInt& a, const BigInt& b) { - BigInt r; - mpz_sub(r.get_mp(), a.get_mp(), b.get_mp()); - return r; -} -inline BigInt operator*(const BigInt& a, const BigInt& b) { - BigInt r; - mpz_mul(r.get_mp(), a.get_mp(), b.get_mp()); - return r; -} -inline BigInt operator/(const BigInt& a, const BigInt& b) { - BigInt r; - mpz_tdiv_q(r.get_mp(), a.get_mp(), b.get_mp()); - return r; -} -inline BigInt operator%(const BigInt& a, const BigInt& b) { - BigInt r; - mpz_tdiv_r(r.get_mp(), a.get_mp(), b.get_mp()); - return r; -} -inline BigInt operator&(const BigInt& a, const BigInt& b) { - BigInt r; - mpz_and(r.get_mp(), a.get_mp(), b.get_mp()); - return r; -} -inline BigInt operator|(const BigInt& a, const BigInt& b) { - BigInt r; - mpz_ior(r.get_mp(), a.get_mp(), b.get_mp()); - return r; -} -inline BigInt operator^(const BigInt& a, const BigInt& b) { - BigInt r; - mpz_xor(r.get_mp(), a.get_mp(), b.get_mp()); - return r; -} -inline BigInt operator<<(const BigInt& a, unsigned long ul) { - BigInt r; - mpz_mul_2exp(r.get_mp(), a.get_mp(), ul); - return r; -} -inline BigInt operator>>(const BigInt& a, unsigned long ul) { - BigInt r; - mpz_tdiv_q_2exp(r.get_mp(), a.get_mp(), ul); + r.get_mp() = a.get_mp() + b.get_mp(); return r; } -inline int cmp(const BigInt& x, const BigInt& y) { - return mpz_cmp(x.get_mp(), y.get_mp()); +inline BigInt operator-(const BigInt& a, const BigInt& b) { + BigInt r; + r.get_mp() = a.get_mp() - b.get_mp(); + return r; } + +inline BigInt operator*(const BigInt& a, const BigInt& b) { + BigInt r; + r.get_mp() = a.get_mp() * b.get_mp(); + return r; +} + +inline BigInt operator/(const BigInt& a, const BigInt& b) { + BigInt r; + r.get_mp() = a.get_mp() / b.get_mp(); + return r; +} + +inline BigInt operator%(const BigInt& a, const BigInt& b) { + BigInt r; + r.get_mp() = a.get_mp() % b.get_mp(); + return r; +} + +inline BigInt operator&(const BigInt& a, const BigInt& b) { + BigInt r; + r.get_mp() = a.get_mp() & b.get_mp(); + return r; +} + +inline BigInt operator|(const BigInt& a, const BigInt& b) { + BigInt r; + r.get_mp() = a.get_mp()| b.get_mp(); + return r; +} + +inline BigInt operator^(const BigInt& a, const BigInt& b) { + BigInt r; + r.get_mp() = a.get_mp() ^ b.get_mp(); + return r; +} + +inline BigInt operator<<(const BigInt& a, unsigned long ul) { + BigInt r; + r.get_mp() = a.get_mp() << ul; + return r; +} + +inline BigInt operator>>(const BigInt& a, unsigned long ul) { + BigInt r; + r.get_mp() = a.get_mp() >> ul; + return r; +} + + +inline int cmp(const BigInt& x, const BigInt& y) { + return x.get_mp().compare(y.get_mp()); +} + + inline bool operator==(const BigInt& a, const BigInt& b) { return cmp(a, b) == 0; } + inline bool operator!=(const BigInt& a, const BigInt& b) { return cmp(a, b) != 0; } + inline bool operator>=(const BigInt& a, const BigInt& b) { return cmp(a, b) >= 0; } + inline bool operator>(const BigInt& a, const BigInt& b) { return cmp(a, b) > 0; } + inline bool operator<=(const BigInt& a, const BigInt& b) { return cmp(a, b) <= 0; } + inline bool operator<(const BigInt& a, const BigInt& b) { return cmp(a, b) < 0; } inline std::ostream& operator<<(std::ostream& o, const BigInt& x) { - //return CORE::operator<<(o, x.get_mp()); - return CORE::io_write(o, x.get_mp()); + return o <>(std::istream& i, BigInt& x) { x.makeCopy(); - //return CORE::operator>>(i, x.get_mp()); - return CORE::io_read(i, x.get_mp()); + return i >> x.get_mp(); } /// sign inline int sign(const BigInt& a) { - return mpz_sgn(a.get_mp()); + return sign(a.get_mp()); } + /// abs inline BigInt abs(const BigInt& a) { BigInt r; - mpz_abs(r.get_mp(), a.get_mp()); + r.get_mp() = abs(a.get_mp()); return r; } + /// neg inline BigInt neg(const BigInt& a) { BigInt r; - mpz_neg(r.get_mp(), a.get_mp()); + r.get_mp() = - a.get_mp(); return r; } + /// negate inline void negate(BigInt& a) { a.makeCopy(); - mpz_neg(a.get_mp(), a.get_mp()); + a.get_mp() = - a.get_mp(); } + /// cmpabs inline int cmpabs(const BigInt& a, const BigInt& b) { - return mpz_cmpabs(a.get_mp(), b.get_mp()); + assert(false); + // return mpz_cmpabs(a.get_mp(), b.get_mp()); AF: todo + return 0; } /// \name Conversion Functions @@ -409,63 +455,80 @@ inline int cmpabs(const BigInt& a, const BigInt& b) { inline long longValue(const BigInt& a) { return a.longValue(); } + /// ulongValue inline unsigned long ulongValue(const BigInt& a) { return a.ulongValue(); } + /// doubleValue inline double doubleValue(const BigInt& a) { return a.doubleValue(); } //@} +/* + /// \name File I/O Functions //@{ /// read from file + void readFromFile(BigInt& z, std::istream& in, long maxLength = 0); /// write to file void writeToFile(const BigInt& z, std::ostream& in, int base=10, int charsPerLine=80); //@} +*/ + /// \name Misc Functions //@{ /// isEven inline bool isEven(const BigInt& z) { - return mpz_even_p(z.get_mp()); + return bit_test(z.get_mp(),0) == 0; } /// isOdd inline bool isOdd(const BigInt& z) { - return mpz_odd_p(z.get_mp()); + return bit_test(z.get_mp(),0) == 1; } /// get exponent of power 2 inline unsigned long getBinExpo(const BigInt& z) { - return mpz_scan1(z.get_mp(), 0); + return lsb(abs(z.get_mp())); } + /// get exponent of power k inline void getKaryExpo(const BigInt& z, BigInt& m, int& e, unsigned long k) { + assert(false); // AF: todo + /* mpz_t f; mpz_init_set_ui(f, k); m.makeCopy(); e = mpz_remove(m.get_mp(), z.get_mp(), f); mpz_clear(f); + */ } /// divisible(x,y) = "x | y" inline bool isDivisible(const BigInt& x, const BigInt& y) { - return mpz_divisible_p(x.get_mp(), y.get_mp()) != 0; + assert(false); + return true; // AF mpz_divisible_p(x.get_mp(), y.get_mp()) != 0; } + inline bool isDivisible(int x, int y) { return x % y == 0; } + inline bool isDivisible(long x, long y) { return x % y == 0; + } /// exact div inline void divexact(BigInt& z, const BigInt& x, const BigInt& y) { z.makeCopy(); - mpz_divexact(z.get_mp(), x.get_mp(), y.get_mp()); + assert(false); + // AF: todo mpz_divexact(z.get_mp(), x.get_mp(), y.get_mp()); } + // Chee (1/12/2004) The definition of div_exact(x,y) next // ensure that in Polynomials works with both NT=BigInt and NT=int: inline BigInt div_exact(const BigInt& x, const BigInt& y) { @@ -473,9 +536,11 @@ inline BigInt div_exact(const BigInt& x, const BigInt& y) { divexact(z, x, y); // z is set to x/y; return z; } + inline int div_exact(int x, int y) { return x/y; // precondition: isDivisible(x,y) } + inline long div_exact(long x, long y) { return x/y; // precondition: isDivisible(x,y) } @@ -484,19 +549,21 @@ inline long div_exact(long x, long y) { /// gcd inline BigInt gcd(const BigInt& a, const BigInt& b) { BigInt r; - mpz_gcd(r.get_mp(), a.get_mp(), b.get_mp()); + r.get_mp() = gcd(a.get_mp(), b.get_mp()); return r; } + /// div_rem inline void div_rem(BigInt& q, BigInt& r, const BigInt& a, const BigInt& b) { q.makeCopy(); r.makeCopy(); - mpz_tdiv_qr(q.get_mp(), r.get_mp(), a.get_mp(), b.get_mp()); + divide_qr(a.get_mp(), b.get_mp(), q.get_mp(), r.get_mp()); } + /// power inline void power(BigInt& c, const BigInt& a, unsigned long ul) { c.makeCopy(); - mpz_pow_ui(c.get_mp(), a.get_mp(), ul); + c.get_mp() = pow(a.get_mp(), ul); } // pow @@ -508,8 +575,9 @@ inline BigInt pow(const BigInt& a, unsigned long ui) { // bit length inline int bitLength(const BigInt& a) { - return mpz_sizeinbase(a.get_mp(), 2); + return msb(abs(a.get_mp())); /// AF todo was mpz_sizeinbase(a.get_mp(), 2); } + /// floorLg -- floor of log_2(a) /** Convention: a=0, floorLg(a) returns -1. * This makes sense for integer a. @@ -517,6 +585,7 @@ inline int bitLength(const BigInt& a) { inline long floorLg(const BigInt& a) { return (sign(a) == 0) ? (-1) : (bitLength(a)-1); } + /// ceilLg -- ceiling of log_2(a) where a=BigInt, int or long /** Convention: a=0, ceilLg(a) returns -1. * This makes sense for integer a. @@ -525,11 +594,14 @@ inline long ceilLg(const BigInt& a) { if (sign(a) == 0) return -1; unsigned long len = bitLength(a); - return (mpz_scan1(a.get_mp(), 0) == len-1) ? (len-1) : len; + + return (lsb(a.get_mp()) == len - 1) ? (len - 1) : len; } + inline long ceilLg(long a) { // need this for Polynomial return ceilLg(BigInt(a)); } + inline long ceilLg(int a) { // need this for Polynomial return ceilLg(BigInt(a)); } diff --git a/CGAL_Core/include/CGAL/CORE/BigRat.h b/CGAL_Core/include/CGAL/CORE/BigRat.h index 29b99509d40..1d980394301 100644 --- a/CGAL_Core/include/CGAL/CORE/BigRat.h +++ b/CGAL_Core/include/CGAL/CORE/BigRat.h @@ -29,93 +29,87 @@ namespace CORE { + typedef boost::multiprecision::cpp_rational Q; + class BigRatRep : public RCRepImpl { public: - BigRatRep() { - mpq_init(mp); - } + BigRatRep() + : mp() + {} + // Note : should the copy-ctor be alloed at all ? [Sylvain Pion] - BigRatRep(const BigRatRep& z) : RCRepImpl() { - mpq_init(mp); - mpq_set(mp, z.mp); - } - BigRatRep(signed char c) { - mpq_init(mp); - mpq_set_si(mp, c, 1); - } - BigRatRep(unsigned char c) { - mpq_init(mp); - mpq_set_ui(mp, c, 1); - } - BigRatRep(signed int i) { - mpq_init(mp); - mpq_set_si(mp, i, 1); - } - BigRatRep(unsigned int i) { - mpq_init(mp); - mpq_set_ui(mp, i, 1); - } - BigRatRep(signed short int s) { - mpq_init(mp); - mpq_set_si(mp, s, 1); - } - BigRatRep(unsigned short int s) { - mpq_init(mp); - mpq_set_ui(mp, s, 1); - } - BigRatRep(signed long int l) { - mpq_init(mp); - mpq_set_si(mp, l, 1); - } - BigRatRep(unsigned long int l) { - mpq_init(mp); - mpq_set_ui(mp, l, 1); - } - BigRatRep(float f) { - mpq_init(mp); - mpq_set_d(mp, f); - } - BigRatRep(double d) { - mpq_init(mp); - mpq_set_d(mp, d); - } - BigRatRep(const char* s) { - mpq_init(mp); - mpq_set_str(mp, s, 0); - } - BigRatRep(const std::string& s) { - mpq_init(mp); - mpq_set_str(mp, s.c_str(), 0); - } - explicit BigRatRep(mpq_srcptr q) { - mpq_init(mp); - mpq_set(mp, q); - } - BigRatRep(mpz_srcptr z) { - mpq_init(mp); - mpq_set_z(mp, z); - } - BigRatRep(mpz_srcptr n, mpz_srcptr d) { - mpq_init(mp); - mpz_set(mpq_numref(mp), n); - mpz_set(mpq_denref(mp), d); - mpq_canonicalize(mp); - } - ~BigRatRep() { - mpq_clear(mp); - } + BigRatRep(const BigRatRep& z) : RCRepImpl(), mp(z.mp) + {} + - CGAL_CORE_EXPORT CORE_NEW(BigRatRep) - CGAL_CORE_EXPORT CORE_DELETE(BigRatRep) + BigRatRep(signed char c) + : mp(c) + {} - mpq_srcptr get_mp() const { + BigRatRep(unsigned char c) + : mp(c) + {} + + BigRatRep(signed int i) + : mp(i) + {} + + BigRatRep(unsigned int i) + : mp(i) + {} + + BigRatRep(signed short int s) + : mp(s) + {} + + BigRatRep(unsigned short int s) + : mp(s) + {} + + BigRatRep(signed long int l) + : mp(l) + {} + + BigRatRep(unsigned long int l) + : mp(l) + {} + + BigRatRep(float f) + : mp(f) + {} + + BigRatRep(double d) + : mp(d) + {} + + BigRatRep(const char* s) + : mp(s) + {} + + BigRatRep(const std::string& s) + : mp(s) + {} + + explicit BigRatRep(const Z& q) + : mp(q) + {} + + BigRatRep(const Z& n, const Z& d) + : mp(n,d) + {} + + + //CGAL_CORE_EXPORT CORE_NEW(BigRatRep) +// CGAL_CORE_EXPORT CORE_DELETE(BigRatRep) + + const Q& get_mp() const { return mp; } - mpq_ptr get_mp() { + Q& get_mp() { return mp; } private: - mpq_t mp; + Q mp; }; //BigRatRep class BigFloat; @@ -152,7 +146,7 @@ public: /// constructor for std::string with base BigRat(const std::string& s) : RCBigRat(new BigRatRep(s)) {} /// constructor for mpq_srcptr - explicit BigRat(mpq_srcptr z) : RCBigRat(new BigRatRep(z)) {} + explicit BigRat(const Z& z) : RCBigRat(new BigRatRep(z)) {} /// constructor for BigInt BigRat(const BigInt& z) : RCBigRat(new BigRatRep(z.get_mp())) {} /// constructor for two BigInts @@ -187,32 +181,34 @@ public: //@{ BigRat& operator +=(const BigRat& rhs) { makeCopy(); - mpq_add(get_mp(), get_mp(), rhs.get_mp()); + get_mp() += rhs.get_mp(); return *this; } BigRat& operator -=(const BigRat& rhs) { makeCopy(); - mpq_sub(get_mp(), get_mp(), rhs.get_mp()); + get_mp() -= rhs.get_mp(); return *this; } BigRat& operator *=(const BigRat& rhs) { makeCopy(); - mpq_mul(get_mp(), get_mp(), rhs.get_mp()); + get_mp() *= rhs.get_mp(); return *this; } BigRat& operator /=(const BigRat& rhs) { makeCopy(); - mpq_div(get_mp(), get_mp(), rhs.get_mp()); + get_mp() /= rhs.get_mp(); return *this; } BigRat& operator <<=(unsigned long ul) { makeCopy(); - mpq_mul_2exp(get_mp(), get_mp(), ul); + assert(false); + // AF no shift for Q get_mp() <<= ul; return *this; } BigRat& operator >>=(unsigned long ul) { makeCopy(); - mpq_div_2exp(get_mp(), get_mp(), ul); + assert(false); + // AF no >> for Q get_mp() >>= ul; return *this; } //@} @@ -223,7 +219,7 @@ public: /// exact division by 2 (this method is provided for compatibility) BigRat div2() const { BigRat r; BigRat t(2); // probably not most efficient way - mpq_div(r.get_mp(), get_mp(), t.get_mp()); + r.get_mp() /= t.get_mp(); return r; } BigRat operator+() const { @@ -231,17 +227,17 @@ public: } BigRat operator-() const { BigRat r; - mpq_neg(r.get_mp(), get_mp()); + r.get_mp() = - get_mp(); return r; } BigRat& operator++() { makeCopy(); - mpz_add(get_num_mp(),get_num_mp(),get_den_mp()); + get_num_mp() += get_den_mp(); return *this; } BigRat& operator--() { makeCopy(); - mpz_sub(get_num_mp(),get_num_mp(),get_den_mp()); + get_num_mp() -= get_den_mp(); return *this; } BigRat operator++(int) { @@ -261,7 +257,8 @@ public: /// Canonicalize void canonicalize() { makeCopy(); - mpq_canonicalize(get_mp()); + assert(false); + // AF todo mpq_canonicalize(get_mp()); } /// Has Exact Division static bool hasExactDivision() { @@ -269,28 +266,28 @@ public: } /// return mpz pointer of numerator (const) - mpz_srcptr get_num_mp() const { - return mpq_numref(get_mp()); + Z get_num_mp() const { + return numerator(get_mp()); } - /// return mpz pointer of numerator - mpz_ptr get_num_mp() { - return mpq_numref(get_mp()); + /// return mpz pointer of numerator // no references as numerator() returns a copy + Z get_num_mp() { + return numerator(get_mp()); } /// return mpz pointer of denominator - mpz_srcptr get_den_mp() const { - return mpq_denref(get_mp()); + Z get_den_mp() const { + return denominator(get_mp()); } /// return mpz pointer of denominator - mpz_ptr get_den_mp() { - return mpq_denref(get_mp()); + Z get_den_mp() { + return denominator(get_mp()); } /// get mpq pointer (const) - mpq_srcptr get_mp() const { + const Q& get_mp() const { return rep->get_mp(); } /// get mpq pointer - mpq_ptr get_mp() { + Q& get_mp() { return rep->get_mp(); } //@} @@ -300,16 +297,12 @@ public: /// set value from const char* int set_str(const char* s, int base = 0) { makeCopy(); - return mpq_set_str(get_mp(), s, base); + get_mp() = Q(s); + return 0; } /// convert to std::string std::string get_str(int base = 10) const { - int n = mpz_sizeinbase(mpq_numref(get_mp()), base) + mpz_sizeinbase(mpq_denref(get_mp()), base)+ 3; - char *buffer = new char[n]; - mpq_get_str(buffer, base, get_mp()); - std::string result(buffer); - delete [] buffer; - return result; + return get_mp().convert_to(); } //@} @@ -317,20 +310,21 @@ public: //@{ /// intValue int intValue() const { - return static_cast(doubleValue()); + return get_mp().convert_to(); } /// longValue long longValue() const { - return static_cast(doubleValue()); + return get_mp().convert_to(); } + /// doubleValue double doubleValue() const { - return mpq_get_d(get_mp()); + return get_mp().convert_to(); } /// BigIntValue BigInt BigIntValue() const { BigInt r; - mpz_tdiv_q(r.get_mp(), get_num_mp(), get_den_mp()); + r.get_mp() = Z( get_num_mp() / get_den_mp()); // AF check that this is the integer divsion without rest return r; } //@} @@ -338,22 +332,22 @@ public: inline BigRat operator+(const BigRat& a, const BigRat& b) { BigRat r; - mpq_add(r.get_mp(), a.get_mp(), b.get_mp()); + r.get_mp() = a.get_mp() + b.get_mp(); return r; } inline BigRat operator-(const BigRat& a, const BigRat& b) { BigRat r; - mpq_sub(r.get_mp(), a.get_mp(), b.get_mp()); + r.get_mp() = a.get_mp() - b.get_mp(); return r; } inline BigRat operator*(const BigRat& a, const BigRat& b) { BigRat r; - mpq_mul(r.get_mp(), a.get_mp(), b.get_mp()); + r.get_mp() = a.get_mp() * b.get_mp(); return r; } inline BigRat operator/(const BigRat& a, const BigRat& b) { BigRat r; - mpq_div(r.get_mp(), a.get_mp(), b.get_mp()); + r.get_mp() = a.get_mp() / b.get_mp(); return r; } // Chee (3/19/2004): @@ -362,7 +356,7 @@ inline BigRat operator/(const BigRat& a, const BigRat& b) { /// divisible(x,y) = "x | y" inline BigRat div_exact(const BigRat& x, const BigRat& y) { BigRat z; - mpq_div(z.get_mp(), x.get_mp(), y.get_mp()); + z.get_mp() = x.get_mp() / y.get_mp(); return z; } /// numerator @@ -396,22 +390,22 @@ inline bool isInteger(const BigRat& x) { } inline bool isDivisible(const BigRat& x, const BigRat& y) { BigRat r; - mpq_div(r.get_mp(), x.get_mp(), y.get_mp()); + r.get_mp() = x.get_mp() / y.get_mp(); return isInteger(r); } inline BigRat operator<<(const BigRat& a, unsigned long ul) { BigRat r; - mpq_mul_2exp(r.get_mp(), a.get_mp(), ul); + //AF todo no << for Q r.get_mp() = a.get_mp() << int(ul) ; return r; } inline BigRat operator>>(const BigRat& a, unsigned long ul) { BigRat r; - mpq_div_2exp(r.get_mp(), a.get_mp(), ul); + // AF todo no >> for Q r.get_mp() = a.get_mp() >> ul; return r; } inline int cmp(const BigRat& x, const BigRat& y) { - return mpq_cmp(x.get_mp(), y.get_mp()); + return x.get_mp().compare(y.get_mp()); } inline bool operator==(const BigRat& a, const BigRat& b) { return cmp(a, b) == 0; @@ -433,29 +427,27 @@ inline bool operator<(const BigRat& a, const BigRat& b) { } inline std::ostream& operator<<(std::ostream& o, const BigRat& x) { - //return CORE::operator<<(o, x.get_mp()); - return CORE::io_write(o, x.get_mp()); + return o << x.get_mp(); } inline std::istream& operator>>(std::istream& i, BigRat& x) { x.makeCopy(); - //return CORE::operator>>(i, x.get_mp()); - return CORE::io_read(i, x.get_mp()); + return i >> x.get_mp(); } /// sign inline int sign(const BigRat& a) { - return mpq_sgn(a.get_mp()); + return sign(a.get_mp()); } /// abs inline BigRat abs(const BigRat& a) { BigRat r; - mpq_abs(r.get_mp(), a.get_mp()); + r.get_mp() = abs( a.get_mp()); return r; } /// neg inline BigRat neg(const BigRat& a) { BigRat r; - mpq_neg(r.get_mp(), a.get_mp()); + r.get_mp() = - a.get_mp(); return r; } /// div2 diff --git a/CGAL_Core/include/CGAL/CORE/CoreIO_impl.h b/CGAL_Core/include/CGAL/CORE/CoreIO_impl.h index 0e4a2044e74..785f6cc5cd6 100644 --- a/CGAL_Core/include/CGAL/CORE/CoreIO_impl.h +++ b/CGAL_Core/include/CGAL/CORE/CoreIO_impl.h @@ -268,6 +268,9 @@ void readFromFile(BigInt& z, std::istream& in, long maxLength) { CGAL_INLINE_FUNCTION void writeToFile(const BigInt& z, std::ostream& out, int base, int charsPerLine) { + + assert(false); + /* BigInt c = abs(z); // get the absoulte value string @@ -286,10 +289,14 @@ void writeToFile(const BigInt& z, std::ostream& out, int base, int charsPerLine) write_base_number(out, buffer, length, base, charsPerLine); out << "\n"; delete[] buffer; + */ } CGAL_INLINE_FUNCTION void readFromFile(BigFloat& bf, std::istream& in, long maxLength) { + + assert(false); + /* char *buffer; long length; long exponent; @@ -326,10 +333,14 @@ void readFromFile(BigFloat& bf, std::istream& in, long maxLength) { // construct BigFloat bf = BigFloat(mantissa, 0, exponent); + */ } CGAL_INLINE_FUNCTION void writeToFile(const BigFloat& bf, std::ostream& out, int base, int charsPerLine) { + + assert(false); + /* BigInt c(CORE::abs(bf.m())); // get the absoulte value string @@ -351,6 +362,7 @@ void writeToFile(const BigFloat& bf, std::ostream& out, int base, int charsPerLi write_base_number(out, buffer, length, base, charsPerLine); out << '\n'; delete[] buffer; + */ } /* Underconstruction ---- diff --git a/CGAL_Core/include/CGAL/CORE/Expr_impl.h b/CGAL_Core/include/CGAL/CORE/Expr_impl.h index 72dc46015bf..6b036d31544 100644 --- a/CGAL_Core/include/CGAL/CORE/Expr_impl.h +++ b/CGAL_Core/include/CGAL/CORE/Expr_impl.h @@ -1215,8 +1215,8 @@ void BinOpRep::debugTree(int level, int indent, int depthLimit) const { second->debugTree(level, indent + 2, depthLimit - 1); } -CORE_MEMORY_IMPL(BigIntRep) -CORE_MEMORY_IMPL(BigRatRep) +// AF CORE_MEMORY_IMPL(BigIntRep) +// AF CORE_MEMORY_IMPL(BigRatRep) CORE_MEMORY_IMPL(ConstDoubleRep) CORE_MEMORY_IMPL(ConstRealRep) diff --git a/Number_types/include/CGAL/CORE_BigInt.h b/Number_types/include/CGAL/CORE_BigInt.h index 0b599543164..bdeaddd10e1 100644 --- a/Number_types/include/CGAL/CORE_BigInt.h +++ b/Number_types/include/CGAL/CORE_BigInt.h @@ -48,7 +48,7 @@ template <> class Algebraic_structure_traits< CORE::BigInt > //! computes the largest NT not larger than the square root of \a a. Type operator()( const Type& x) const { Type result; - mpz_sqrt(result.get_mp(), x.get_mp()); + result.get_mp() = sqrt( x.get_mp()); return result; } }; @@ -63,7 +63,7 @@ template <> class Algebraic_structure_traits< CORE::BigInt > if ( x == Type(0) && y == Type(0) ) return Type(0); Type result; - mpz_gcd(result.get_mp(), x.get_mp(), y.get_mp()); + result.get_mp() = gcd( x.get_mp(), y.get_mp()); return result; } };