[GIT] ppl/ppl(master): Added helper function to compute the hash code from a space dimension.

Module: ppl/ppl Branch: master Commit: dbd30b078d19997cdfeef23663310025fd8113a0 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=dbd30b078d199...
Author: Enea Zaffanella zaffanella@cs.unipr.it Date: Wed Feb 15 16:34:30 2012 +0100
Added helper function to compute the hash code from a space dimension. Added missing has_code() method to class Box<ITV> and generate corresponding method in Java interface for boxes.
---
...nterface_generator_java_procedure_generators.m4 | 2 +- src/BD_Shape.inlines.hh | 2 +- src/Box.defs.hh | 8 ++++++++ src/Box.inlines.hh | 6 ++++++ src/Grid.inlines.hh | 2 +- src/Octagonal_Shape.inlines.hh | 2 +- src/Partially_Reduced_Product.inlines.hh | 2 +- src/Pointset_Ask_Tell.inlines.hh | 2 +- src/Pointset_Powerset.inlines.hh | 2 +- src/Polyhedron.inlines.hh | 2 +- src/globals.defs.hh | 4 ++++ src/globals.inlines.hh | 6 ++++++ 12 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4 b/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4 index b86af30..b81340a 100644 --- a/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4 +++ b/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4 @@ -42,7 +42,7 @@ dnl The <name> must be exactly as written here. m4_define(`m4_procedure_list', `m4_echo_unquoted(`m4_common_procedure_list', ppl_free_@CLASS@/1 +all, -ppl_@CLASS@_hashcode/2 +all -box, +ppl_@CLASS@_hashcode/2 +all, ppl_@CLASS@_string/1 +all, ppl_termination_test_@TERMINATION_ID@_@TOPOLOGY@@CLASS@/1 +simple, ppl_one_affine_ranking_function_@TERMINATION_ID@_@TOPOLOGY@@CLASS@/2 +simple, diff --git a/src/BD_Shape.inlines.hh b/src/BD_Shape.inlines.hh index 2b95b2e..bb83e46 100644 --- a/src/BD_Shape.inlines.hh +++ b/src/BD_Shape.inlines.hh @@ -838,7 +838,7 @@ BD_Shape<T>::total_memory_in_bytes() const { template <typename T> inline int32_t BD_Shape<T>::hash_code() const { - return space_dimension() & 0x7fffffff; + return hash_code_from_dimension(space_dimension()); }
template <typename T> diff --git a/src/Box.defs.hh b/src/Box.defs.hh index 8c1ccd5..695d7d4 100644 --- a/src/Box.defs.hh +++ b/src/Box.defs.hh @@ -1692,6 +1692,14 @@ public: //! Returns the size in bytes of the memory managed by \p *this. memory_size_type external_memory_in_bytes() const;
+ /*! \brief + Returns a 32-bit hash code for \p *this. + + If <CODE>x</CODE> and <CODE>y</CODE> are such that <CODE>x == y</CODE>, + then <CODE>x.hash_code() == y.hash_code()</CODE>. + */ + int32_t hash_code() const; + PPL_OUTPUT_DECLARATIONS
#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS diff --git a/src/Box.inlines.hh b/src/Box.inlines.hh index b7b0f7e..b38e30f 100644 --- a/src/Box.inlines.hh +++ b/src/Box.inlines.hh @@ -133,6 +133,12 @@ Box<ITV>::max_space_dimension() { }
template <typename ITV> +inline int32_t +Box<ITV>::hash_code() const { + return hash_code_from_dimension(space_dimension()); +} + +template <typename ITV> inline const ITV& Box<ITV>::operator[](const dimension_type k) const { PPL_ASSERT(k < seq.size()); diff --git a/src/Grid.inlines.hh b/src/Grid.inlines.hh index 222e42a..3500339 100644 --- a/src/Grid.inlines.hh +++ b/src/Grid.inlines.hh @@ -228,7 +228,7 @@ Grid::total_memory_in_bytes() const {
inline int32_t Grid::hash_code() const { - return space_dimension() & 0x7fffffff; + return hash_code_from_dimension(space_dimension()); }
inline Constraint_System diff --git a/src/Octagonal_Shape.inlines.hh b/src/Octagonal_Shape.inlines.hh index c42379e..12357e8 100644 --- a/src/Octagonal_Shape.inlines.hh +++ b/src/Octagonal_Shape.inlines.hh @@ -864,7 +864,7 @@ Octagonal_Shape<T>::total_memory_in_bytes() const { template <typename T> inline int32_t Octagonal_Shape<T>::hash_code() const { - return space_dimension() & 0x7fffffff; + return hash_code_from_dimension(space_dimension()); }
template <typename T> diff --git a/src/Partially_Reduced_Product.inlines.hh b/src/Partially_Reduced_Product.inlines.hh index 8239bd2..a9e53cf 100644 --- a/src/Partially_Reduced_Product.inlines.hh +++ b/src/Partially_Reduced_Product.inlines.hh @@ -709,7 +709,7 @@ Partially_Reduced_Product<D1, D2, R>::ascii_dump(std::ostream& s) const { template <typename D1, typename D2, typename R> inline int32_t Partially_Reduced_Product<D1, D2, R>::hash_code() const { - return space_dimension() & 0x7fffffff; + return hash_code_from_dimension(space_dimension()); }
/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */ diff --git a/src/Pointset_Ask_Tell.inlines.hh b/src/Pointset_Ask_Tell.inlines.hh index 61b46fc..b4676b3 100644 --- a/src/Pointset_Ask_Tell.inlines.hh +++ b/src/Pointset_Ask_Tell.inlines.hh @@ -173,7 +173,7 @@ Pointset_Ask_Tell<PSET>::total_memory_in_bytes() const { template <typename PSET> inline int32_t Pointset_Ask_Tell<PSET>::hash_code() const { - return space_dimension() & 0x7fffffff; + return hash_code_from_dimension(space_dimension()); }
template <> diff --git a/src/Pointset_Powerset.inlines.hh b/src/Pointset_Powerset.inlines.hh index 94d787b..4076cb2 100644 --- a/src/Pointset_Powerset.inlines.hh +++ b/src/Pointset_Powerset.inlines.hh @@ -275,7 +275,7 @@ Pointset_Powerset<PSET>::total_memory_in_bytes() const { template <typename PSET> inline int32_t Pointset_Powerset<PSET>::hash_code() const { - return space_dimension() & 0x7fffffff; + return hash_code_from_dimension(space_dimension()); }
template <typename PSET> diff --git a/src/Polyhedron.inlines.hh b/src/Polyhedron.inlines.hh index eacb411..ff35596 100644 --- a/src/Polyhedron.inlines.hh +++ b/src/Polyhedron.inlines.hh @@ -43,7 +43,7 @@ Polyhedron::space_dimension() const {
inline int32_t Polyhedron::hash_code() const { - return space_dimension() & 0x7fffffff; + return hash_code_from_dimension(space_dimension()); }
inline dimension_type diff --git a/src/globals.defs.hh b/src/globals.defs.hh index 9b59ba1..e564878 100644 --- a/src/globals.defs.hh +++ b/src/globals.defs.hh @@ -42,6 +42,10 @@ namespace Parma_Polyhedra_Library { dimension_type not_a_dimension();
+//! Returns the hash code for space dimension \p dim. +int32_t +hash_code_from_dimension(dimension_type dim); + #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS /*! \brief Make sure swap() is specialized when needed. diff --git a/src/globals.inlines.hh b/src/globals.inlines.hh index 93d2ba7..9047d1c 100644 --- a/src/globals.inlines.hh +++ b/src/globals.inlines.hh @@ -34,6 +34,12 @@ not_a_dimension() { return std::numeric_limits<dimension_type>::max(); }
+inline int32_t +hash_code_from_dimension(dimension_type dim) { + const dimension_type divisor = 1U << (32 - 1); + return static_cast<int32_t>(dim % divisor); +} + inline const Weightwatch_Traits::Threshold& Weightwatch_Traits::get() { return weight;
participants (1)
-
Enea Zaffanella