PolyBoRi
|
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