[PPL-devel] [GIT] ppl/ppl(bounded_arithmetic): Added Bounded_Integer_Coefficient_Policy .
Roberto Bagnara
bagnara at cs.unipr.it
Wed May 13 20:01:40 CEST 2009
Module: ppl/ppl
Branch: bounded_arithmetic
Commit: a8f95c123cd384619f2be9584dad762930352426
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=a8f95c123cd384619f2be9584dad762930352426
Author: Roberto Bagnara <bagnara at cs.unipr.it>
Date: Wed May 13 20:00:32 2009 +0200
Added Bounded_Integer_Coefficient_Policy.
---
src/Coefficient.inlines.hh | 13 +++++-
src/Coefficient.types.hh | 90 ++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 97 insertions(+), 6 deletions(-)
diff --git a/src/Coefficient.inlines.hh b/src/Coefficient.inlines.hh
index 1e02b8a..4a7f68b 100644
--- a/src/Coefficient.inlines.hh
+++ b/src/Coefficient.inlines.hh
@@ -25,6 +25,15 @@ site: http://www.cs.unipr.it/ppl/ . */
namespace Parma_Polyhedra_Library {
+#ifdef PPL_CHECKED_INTEGERS
+inline void
+Bounded_Integer_Coefficient_Policy::handle_result(Result r) {
+ if (result_overflow(r))
+ throw_result_exception(r);
+}
+#endif // PPL_CHECKED_INTEGERS
+
+
#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
inline Coefficient_traits::const_reference
Coefficient_zero() {
@@ -39,7 +48,7 @@ Coefficient_one() {
static Coefficient one(1);
return one;
}
-#endif
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
#ifdef PPL_GMP_INTEGERS
inline Coefficient_traits::const_reference
@@ -54,7 +63,7 @@ Coefficient_one() {
assert(*Coefficient_one_p != 0);
return *Coefficient_one_p;
}
-#endif
+#endif // PPL_GMP_INTEGERS
} // namespace Parma_Polyhedra_Library
diff --git a/src/Coefficient.types.hh b/src/Coefficient.types.hh
index bb4f7d1..f785663 100644
--- a/src/Coefficient.types.hh
+++ b/src/Coefficient.types.hh
@@ -18,6 +18,88 @@ PURPOSE. */
namespace Parma_Polyhedra_Library {
+//! A policy for checked bounded integer coefficients.
+/*! \ingroup PPL_CXX_interface */
+struct Bounded_Integer_Coefficient_Policy {
+ //! Check for overflowed result.
+ const_bool_nodef(check_overflow, true);
+
+ //! Do not check for attempts to add infinities with different sign.
+ const_bool_nodef(check_inf_add_inf, false);
+
+ //! Do not check for attempts to subtract infinities with same sign.
+ const_bool_nodef(check_inf_sub_inf, false);
+
+ //! Do not check for attempts to multiply infinities by zero.
+ const_bool_nodef(check_inf_mul_zero, false);
+
+ //! Do not check for attempts to divide by zero.
+ const_bool_nodef(check_div_zero, false);
+
+ //! Do not check for attempts to divide infinities.
+ const_bool_nodef(check_inf_div_inf, false);
+
+ //! Do not check for attempts to compute remainder of infinities.
+ const_bool_nodef(check_inf_mod, false);
+
+ //! Do not checks for attempts to take the square root of a negative number.
+ const_bool_nodef(check_sqrt_neg, false);
+
+ //! Do not handle not-a-number special value.
+ const_bool_nodef(has_nan, false);
+
+ //! Handle infinity special values if \p T have them.
+ const_bool_nodef(has_infinity, false);
+
+ /*! \brief
+ The checked number can always be safely converted to the
+ underlying type \p T and vice-versa.
+ */
+ const_bool_nodef(convertible, true);
+
+ //! Do not honor requests to check for FPU inexact results.
+ const_bool_nodef(fpu_check_inexact, false);
+
+ //! Do not make extra checks to detect FPU NaN results.
+ const_bool_nodef(check_nan_result, true);
+
+ /*! \brief
+ For constructors, by default use the same rounding used by
+ underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+
+ /*! \brief
+ For overloaded operators (operator+(), operator-(), ...), by
+ default use the same rounding used by the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+
+ /*! \brief
+ For input functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+
+ /*! \brief
+ For output functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+
+ /*! \brief
+ For all other functions, by default use the same rounding used by
+ the underlying type.
+ */
+ static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+
+ /*! \brief
+ Handles \p r: called by all constructors, operators and functions that
+ do not return a Result value.
+ */
+ static void handle_result(Result r);
+};
+
#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
//! Coefficient traits specialization for 8 bits checked integers.
/*! \ingroup PPL_CXX_interface */
@@ -72,14 +154,14 @@ namespace Parma_Polyhedra_Library {
/*! \ingroup PPL_CXX_interface
Objects of type Coefficient are used to implement the integral valued
coefficients occurring in linear expressions, constraints, generators,
- intervals, bounding boxes and so on. Depending on the chosen
+ intervals, bounding boxes and so on. Depending on the chosen
configuration options (see file <CODE>README.configure</CODE>),
a Coefficient may actually be:
- The GMP_Integer type, which in turn is an alias for the
<CODE>mpz_class</CODE> type implemented by the C++ interface
- of the GMP library (this is the default configuration);
- - An instance of the Checked_Number class template: with its default
- policy (Checked_Number_Default_Policy), this implements overflow
+ of the GMP library (this is the default configuration).
+ - An instance of the Checked_Number class template: with the policy
+ Bounded_Integer_Coefficient_Policy, this implements overflow
detection on top of a native integral type (available template
instances include checked integers having 8, 16, 32 or 64 bits);
with the Checked_Number_Transparent_Policy, this is a wrapper
More information about the PPL-devel
mailing list