[GIT] ppl/ppl(master): Added Weightwatch_Traits class (from Abramo). Modified maybe_abandon().

Module: ppl/ppl Branch: master Commit: 4cb9790c6f741a636aa6bbd0e4619acbcfa34305 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=4cb9790c6f741...
Author: Enea Zaffanella zaffanella@cs.unipr.it Date: Sun Jul 12 09:14:52 2009 +0200
Added Weightwatch_Traits class (from Abramo). Modified maybe_abandon().
---
src/globals.cc | 3 +++ src/globals.defs.hh | 38 ++++++++++++++++++++++++++++++++++++++ src/globals.inlines.hh | 19 +++++++++++++++++++ 3 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/src/globals.cc b/src/globals.cc index 9325c4e..7511d17 100644 --- a/src/globals.cc +++ b/src/globals.cc @@ -30,3 +30,6 @@ namespace PPL = Parma_Polyhedra_Library;
const PPL::Throwable* volatile PPL::abandon_expensive_computations = 0;
+// Initialize Weightwatch_Traits static data members. +PPL::Weightwatch_Traits::Threshold PPL::Weightwatch_Traits::weight = 0; +void (*PPL::Weightwatch_Traits::check_function)(void) = 0; diff --git a/src/globals.defs.hh b/src/globals.defs.hh index a6e943c..6bfe173 100644 --- a/src/globals.defs.hh +++ b/src/globals.defs.hh @@ -84,6 +84,44 @@ dimension_type compute_capacity(dimension_type requested_size, dimension_type maximum_size);
+ +#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS +//! Traits class for the deterministic timeout mechanism. +/*! \ingroup PPL_CXX_interface + This abstract base class should be instantiated by those users + willing to provide a polynomial upper bound to the time spent + by any invocation of a library operator. +*/ +#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS) +struct Weightwatch_Traits { + //! The type used to specify thresholds for computational weight. + typedef unsigned int Threshold; + + //! The type used to specify increments of computational weight. + typedef unsigned int Delta; + + //! Returns the current computational weight. + static const Threshold& get(); + + //! Compares the two weights \p a and \p b. + static bool less_than(const Threshold& a, const Threshold& b); + + //! Sets \p threshold to be \p delta units bigger than the current weigth. + static void from_delta(Threshold& threshold, const Delta& delta); + + //! The current computational weight. + static Threshold weight; + + /*! \brief + A pointer to the function that has to be called when checking + the reaching of thresholds. + + The pointer can be null if no threshold are set. + */ + static void (*check_function)(void); +}; + + //! User objects the PPL can throw. /*! \ingroup PPL_CXX_interface This abstract base class should be instantiated by those users diff --git a/src/globals.inlines.hh b/src/globals.inlines.hh index f35672a..75d104e 100644 --- a/src/globals.inlines.hh +++ b/src/globals.inlines.hh @@ -33,12 +33,31 @@ not_a_dimension() { return std::numeric_limits<dimension_type>::max(); }
+inline const Weightwatch_Traits::Threshold& +Weightwatch_Traits::get() { + return weight; +} + +inline bool +Weightwatch_Traits::less_than(const Threshold& a, const Threshold& b) { + return b - a < 1U << (sizeof(Threshold)*8-1); +} + +inline void +Weightwatch_Traits::from_delta(Threshold& threshold, const Delta& delta) { + threshold = weight + delta; +} + inline Throwable::~Throwable() { }
inline void maybe_abandon() { + if (Weightwatch_Traits::check_function) { + ++Weightwatch_Traits::weight; + Weightwatch_Traits::check_function(); + } if (const Throwable* p = abandon_expensive_computations) p->throw_me(); }
participants (1)
-
Enea Zaffanella