diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2012-06-09 16:18:52 +0200 |
---|---|---|
committer | Marc Glisse <marc.glisse@inria.fr> | 2012-06-09 16:18:52 +0200 |
commit | 50aaf1b1a926d80393e6a502ed24fe4eafce05c0 (patch) | |
tree | 6fabc7e25380c404e74013ce5b1882091fcb2823 /gmpxx.h | |
parent | 2a96fd81f6899e9d1f1f397a34f6ef7198c52fe5 (diff) | |
download | gmp-50aaf1b1a926d80393e6a502ed24fe4eafce05c0.tar.gz |
Unify handling of mpf with mpz/mpq. Function eval had 2 arguments for mpf:
p and prec, but prec was always equal to mpf_get_prec(p), so I am removing it.
Diffstat (limited to 'gmpxx.h')
-rw-r--r-- | gmpxx.h | 118 |
1 files changed, 43 insertions, 75 deletions
@@ -1292,6 +1292,7 @@ struct __gmp_resolve_expr<mpz_t> { typedef mpz_t value_type; typedef mpz_ptr ptr_type; + typedef mpz_srcptr srcptr_type; }; template <> @@ -1299,6 +1300,7 @@ struct __gmp_resolve_expr<mpq_t> { typedef mpq_t value_type; typedef mpq_ptr ptr_type; + typedef mpq_srcptr srcptr_type; }; template <> @@ -1306,6 +1308,7 @@ struct __gmp_resolve_expr<mpf_t> { typedef mpf_t value_type; typedef mpf_ptr ptr_type; + typedef mpf_srcptr srcptr_type; }; template <> @@ -2128,10 +2131,33 @@ inline void __gmp_set_expr(mpf_ptr f, const mpf_class &g) template <class T> inline void __gmp_set_expr(mpf_ptr f, const __gmp_expr<mpf_t, T> &expr) { - expr.eval(f, mpf_get_prec(f)); + expr.eval(f); } +/* Temporary objects */ + +template <class T> +class __gmp_temp +{ + __gmp_expr<T, T> val; + public: + template<class U, class V> + __gmp_temp(U const& u, V) : val (u) {} + typename __gmp_resolve_expr<T>::srcptr_type + __get_mp() const { return val.__get_mp(); } +}; + +template <> +class __gmp_temp <mpf_t> +{ + mpf_class val; + public: + template<class U> + __gmp_temp(U const& u, mpf_ptr res) : val (u, mpf_get_prec(res)) {} + mpf_srcptr __get_mp() const { return val.__get_mp(); } +}; + /**************** Specializations of __gmp_expr ****************/ /* The eval() method of __gmp_expr<T, U> evaluates the corresponding expression and assigns the result to its argument, which is either an @@ -2160,8 +2186,7 @@ private: __gmp_unary_expr<val_type, Op> expr; public: explicit __gmp_expr(const val_type &val) : expr(val) { } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t = 0) const + void eval(typename __gmp_resolve_expr<T>::ptr_type p) const { Op::eval(p, expr.val.__get_mp()); } const val_type & get_val() const { return expr.val; } mp_bitcnt_t get_prec() const { return expr.val.get_prec(); } @@ -2181,9 +2206,6 @@ public: explicit __gmp_expr(const val_type &val) : expr(val) { } void eval(typename __gmp_resolve_expr<T>::ptr_type p) const { expr.val.eval(p); Op::eval(p, p); } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t prec) const - { expr.val.eval(p, prec); Op::eval(p, p); } const val_type & get_val() const { return expr.val; } mp_bitcnt_t get_prec() const { return expr.val.get_prec(); } }; @@ -2213,8 +2235,7 @@ private: public: __gmp_expr(const val1_type &val1, const val2_type &val2) : expr(val1, val2) { } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t = 0) const + void eval(typename __gmp_resolve_expr<T>::ptr_type p) const { Op::eval(p, expr.val1.__get_mp(), expr.val2.__get_mp()); } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } @@ -2240,8 +2261,7 @@ private: public: __gmp_expr(const val1_type &val1, const val2_type &val2) : expr(val1, val2) { } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t = 0) const + void eval(typename __gmp_resolve_expr<T>::ptr_type p) const { Op::eval(p, expr.val1.__get_mp(), expr.val2); } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } @@ -2259,8 +2279,7 @@ private: public: __gmp_expr(const val1_type &val1, const val2_type &val2) : expr(val1, val2) { } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t = 0) const + void eval(typename __gmp_resolve_expr<T>::ptr_type p) const { Op::eval(p, expr.val1, expr.val2.__get_mp()); } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } @@ -2291,16 +2310,10 @@ public: } else { - __gmp_expr<T, T> temp(expr.val2); + __gmp_temp<T> temp(expr.val2, p); Op::eval(p, expr.val1.__get_mp(), temp.__get_mp()); } } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t prec) const - { - __gmp_expr<T, T> temp(expr.val2, prec); - Op::eval(p, expr.val1.__get_mp(), temp.__get_mp()); - } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } mp_bitcnt_t get_prec() const @@ -2332,16 +2345,10 @@ public: } else { - __gmp_expr<T, T> temp(expr.val1); + __gmp_temp<T> temp(expr.val1, p); Op::eval(p, temp.__get_mp(), expr.val2.__get_mp()); } } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t prec) const - { - __gmp_expr<T, T> temp(expr.val1, prec); - Op::eval(p, temp.__get_mp(), expr.val2.__get_mp()); - } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } mp_bitcnt_t get_prec() const @@ -2373,16 +2380,10 @@ public: } else { - __gmp_expr<T, T> temp(expr.val2); + __gmp_temp<T> temp(expr.val2, p); Op::eval(p, expr.val1.__get_mp(), temp.__get_mp()); } } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t prec) const - { - __gmp_expr<T, T> temp(expr.val2, prec); - Op::eval(p, expr.val1.__get_mp(), temp.__get_mp()); - } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } mp_bitcnt_t get_prec() const @@ -2414,16 +2415,10 @@ public: } else { - __gmp_expr<T, T> temp(expr.val1); + __gmp_temp<T> temp(expr.val1, p); Op::eval(p, temp.__get_mp(), expr.val2.__get_mp()); } } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t prec) const - { - __gmp_expr<T, T> temp(expr.val1, prec); - Op::eval(p, temp.__get_mp(), expr.val2.__get_mp()); - } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } mp_bitcnt_t get_prec() const @@ -2453,12 +2448,6 @@ public: expr.val1.eval(p); Op::eval(p, p, expr.val2); } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t prec) const - { - expr.val1.eval(p, prec); - Op::eval(p, p, expr.val2); - } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } mp_bitcnt_t get_prec() const { return expr.val1.get_prec(); } @@ -2480,12 +2469,6 @@ public: expr.val2.eval(p); Op::eval(p, expr.val1, p); } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t prec) const - { - expr.val2.eval(p, prec); - Op::eval(p, expr.val1, p); - } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } mp_bitcnt_t get_prec() const { return expr.val2.get_prec(); } @@ -2508,16 +2491,10 @@ public: : expr(val1, val2) { } void eval(typename __gmp_resolve_expr<T>::ptr_type p) const { - __gmp_expr<T, T> temp2(expr.val2); + __gmp_temp<T> temp2(expr.val2, p); expr.val1.eval(p); Op::eval(p, p, temp2.__get_mp()); } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t prec) const - { - __gmp_expr<T, T> temp1(expr.val1, prec), temp2(expr.val2, prec); - Op::eval(p, temp1.__get_mp(), temp2.__get_mp()); - } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } mp_bitcnt_t get_prec() const @@ -2542,16 +2519,10 @@ public: : expr(val1, val2) { } void eval(typename __gmp_resolve_expr<T>::ptr_type p) const { - __gmp_expr<T, T> temp1(expr.val1); + __gmp_temp<T> temp1(expr.val1, p); expr.val2.eval(p); Op::eval(p, temp1.__get_mp(), p); } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t prec) const - { - __gmp_expr<T, T> temp1(expr.val1, prec), temp2(expr.val2, prec); - Op::eval(p, temp1.__get_mp(), temp2.__get_mp()); - } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } mp_bitcnt_t get_prec() const @@ -2576,16 +2547,10 @@ public: : expr(val1, val2) { } void eval(typename __gmp_resolve_expr<T>::ptr_type p) const { - __gmp_expr<T, T> temp2(expr.val2); + __gmp_temp<T> temp2(expr.val2, p); expr.val1.eval(p); Op::eval(p, p, temp2.__get_mp()); } - void eval(typename __gmp_resolve_expr<T>::ptr_type p, - mp_bitcnt_t prec) const - { - __gmp_expr<T, T> temp1(expr.val1, prec), temp2(expr.val2, prec); - Op::eval(p, temp1.__get_mp(), temp2.__get_mp()); - } const val1_type & get_val1() const { return expr.val1; } const val2_type & get_val2() const { return expr.val2; } mp_bitcnt_t get_prec() const @@ -3192,8 +3157,11 @@ private: mp_bitcnt_t bits; public: __gmp_expr(gmp_randstate_t s, mp_bitcnt_t l) : state(s), bits(l) { } - void eval(mpf_ptr f, mp_bitcnt_t prec) const - { __gmp_rand_function::eval(f, state, (bits>0) ? get_prec() : prec); } + void eval(mpf_ptr f) const + { + __gmp_rand_function::eval(f, state, + (bits>0) ? bits : mpf_get_prec(f)); + } mp_bitcnt_t get_prec() const { if (bits == 0) |