• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

pbori_routines_hash.h

Go to the documentation of this file.
00001 // -*- c++ -*-
00002 //*****************************************************************************
00048 //*****************************************************************************
00049 
00050 #ifndef pbori_routines_hash_h_
00051 #define pbori_routines_hash_h_
00052 // include basic definitions
00053 #include "pbori_defs.h"
00054 #include <boost/functional/hash.hpp>
00055 
00056 
00057 BEGIN_NAMESPACE_PBORI
00058 
00059 
00060 
00061 template <class HashType, class NaviType>
00062 void
00063 stable_hash_range(HashType& seed, NaviType navi) {
00064 
00065   if (navi.isConstant()) {
00066     if (navi.terminalValue())
00067       boost::hash_combine(seed, CTypes::max_index());
00068     return;
00069   }
00070 
00071   boost::hash_combine(seed, *navi);
00072 
00073   stable_hash_range(seed, navi.thenBranch());
00074   stable_hash_range(seed, navi.elseBranch());
00075 }
00076 
00077 template <class NaviType>
00078 std::size_t
00079 stable_hash_range(NaviType navi) {
00080 
00081   std::size_t seed = 0;
00082   stable_hash_range(seed, navi);
00083 
00084   return seed;
00085 }
00086 
00087 template <class HashType>
00088 void
00089 finalize_term_hash(HashType& seed) {
00090   boost::hash_combine(seed, CTypes::max_index());
00091 }
00092 
00093 template <class HashType, class NaviType>
00094 void
00095 stable_first_hash_range(HashType& seed, NaviType navi) {
00096 
00097   while (!navi.isConstant()) {
00098     boost::hash_combine(seed, *navi);
00099     navi.incrementThen();
00100   }
00101   if (navi.terminalValue())
00102     finalize_term_hash(seed);
00103 
00104 }
00105 
00106 template <class NaviType>
00107 std::size_t
00108 stable_first_hash_range(NaviType navi) {
00109 
00110   std::size_t seed = 0;
00111   stable_first_hash_range(seed, navi);
00112 
00113   return seed;
00114 }
00115 
00116 template <class HashType, class Iterator>
00117 void
00118 stable_term_hash(HashType& seed, Iterator start, Iterator finish) {
00119   boost::hash_range(seed, start, finish);
00120   finalize_term_hash(seed);
00121 }
00122 
00123 template <class Iterator>
00124 std::size_t
00125 stable_term_hash(Iterator start, Iterator finish) {
00126 
00127   std::size_t seed(0);
00128   stable_term_hash(seed, start, finish);
00129 
00130   return seed;
00131 }
00132 
00133 
00134 // The following may be used without polybori. Hence, we have to load it in the
00135 // namespace here
00136 
00137 // Get generic hash functions
00138 // #include "generic_hash.h"
00139 
00140 // #ifndef PBORI_HASH_TAG
00141 // #define PBORI_HASH_TAG js_tag
00142 // #endif
00143 
00144 
00145 // typedef generic_hash_tags::PBORI_HASH_TAG pbori_hash_tag;
00146 
00147 END_NAMESPACE_PBORI
00148 
00149 #endif

Generated on Tue Oct 5 2010 for PolyBoRi by  doxygen 1.7.1