[GIT] ppl/ppl(floating_point): Converted helpers to work also for native numbers.

Module: ppl/ppl Branch: floating_point Commit: 01dab9748259cee736256a446e6e7451bf0992c0 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=01dab9748259c...
Author: Abramo Bagnara abramo.bagnara@gmail.com Date: Sat Sep 19 09:51:20 2009 +0200
Converted helpers to work also for native numbers.
---
src/math_utilities.defs.hh | 25 ++++++++++++------------- src/math_utilities.inlines.hh | 33 ++++++++++++++++----------------- 2 files changed, 28 insertions(+), 30 deletions(-)
diff --git a/src/math_utilities.defs.hh b/src/math_utilities.defs.hh index 2b082ce..be685c5 100644 --- a/src/math_utilities.defs.hh +++ b/src/math_utilities.defs.hh @@ -32,17 +32,17 @@ namespace Parma_Polyhedra_Library { #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS //! Extract the numerator and denominator components of \p from. #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) -template <typename T, typename Policy> -void -numer_denom(const Checked_Number<T, Policy>& from, +template <typename T> +typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type +numer_denom(const T& from, Coefficient& num, Coefficient& den);
#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS //! Divides \p x by \p y into \p to, rounding the result towards plus infinity. #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) -template <typename T, typename Policy> -void -div_round_up(Checked_Number<T, Policy>& to, +template <typename T> +typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type +div_round_up(T& to, Coefficient_traits::const_reference x, Coefficient_traits::const_reference y);
@@ -63,17 +63,16 @@ max_assign(N& x, const N& y); #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS //! Returns <CODE>true</CODE> if and only if \p x is an even number. #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) -template <typename T, typename Policy> -bool -is_even(const Checked_Number<T, Policy>& x); +template <typename T> +typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type +is_even(const T& x);
#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS //! Returns <CODE>true</CODE> if and only if \f$x = -y\f$. #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) -template <typename T, typename Policy> -bool -is_additive_inverse(const Checked_Number<T, Policy>& x, - const Checked_Number<T, Policy>& y); +template <typename T> +typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type +is_additive_inverse(const T& x, const T& y);
#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS /*! \brief diff --git a/src/math_utilities.inlines.hh b/src/math_utilities.inlines.hh index 14b0f5f..dfa3fc6 100644 --- a/src/math_utilities.inlines.hh +++ b/src/math_utilities.inlines.hh @@ -46,9 +46,9 @@ low_bits_mask(const unsigned n) { return n == 0 ? 0 : ~(~(T(0u)) << n); }
-template <typename T, typename Policy> -inline void -numer_denom(const Checked_Number<T, Policy>& from, +template <typename T> +inline typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type +numer_denom(const T& from, Coefficient& num, Coefficient& den) { PPL_ASSERT(!is_not_a_number(from) && !is_minus_infinity(from) @@ -59,9 +59,9 @@ numer_denom(const Checked_Number<T, Policy>& from, den = q.get_den(); }
-template <typename T, typename Policy> -inline void -div_round_up(Checked_Number<T, Policy>& to, +template <typename T> +inline typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type +div_round_up(T& to, Coefficient_traits::const_reference x, Coefficient_traits::const_reference y) { PPL_DIRTY_TEMP0(mpq_class, qx); @@ -88,19 +88,18 @@ max_assign(N& x, const N& y) { x = y; }
-template <typename T, typename Policy> -inline bool -is_even(const Checked_Number<T, Policy>& x) { - Checked_Number<T, Policy> half_x; - return div_2exp_assign_r(half_x, x, 1, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ - && is_integer(half_x); +template <typename T> +inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type +is_even(const T& x) { + T mod; + return umod_2exp_assign_r(mod, x, 1, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ + && mod == 0; }
-template <typename T, typename Policy> -inline bool -is_additive_inverse(const Checked_Number<T, Policy>& x, - const Checked_Number<T, Policy>& y) { - Checked_Number<T, Policy> negated_x; +template <typename T> +inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type +is_additive_inverse(const T& x, const T& y) { + T negated_x; return neg_assign_r(negated_x, x, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ && negated_x == y; }
participants (1)
-
Abramo Bagnara