00001
00002
00045
00046
00047 #ifndef pbori_routines_hash_h_
00048 #define pbori_routines_hash_h_
00049
00050 #include "pbori_defs.h"
00051 #include <boost/functional/hash.hpp>
00052
00053
00054 BEGIN_NAMESPACE_PBORI
00055
00056
00057
00058 template <class HashType, class NaviType>
00059 void
00060 stable_hash_range(HashType& seed, NaviType navi) {
00061
00062 if (navi.isConstant()) {
00063 if (navi.terminalValue())
00064 boost::hash_combine(seed, CTypes::max_index());
00065 return;
00066 }
00067
00068 boost::hash_combine(seed, *navi);
00069
00070 stable_hash_range(seed, navi.thenBranch());
00071 stable_hash_range(seed, navi.elseBranch());
00072 }
00073
00074 template <class NaviType>
00075 std::size_t
00076 stable_hash_range(NaviType navi) {
00077
00078 std::size_t seed = 0;
00079 stable_hash_range(seed, navi);
00080
00081 return seed;
00082 }
00083
00084 template <class HashType>
00085 void
00086 finalize_term_hash(HashType& seed) {
00087 boost::hash_combine(seed, CTypes::max_index());
00088 }
00089
00090 template <class HashType, class NaviType>
00091 void
00092 stable_first_hash_range(HashType& seed, NaviType navi) {
00093
00094 while (!navi.isConstant()) {
00095 boost::hash_combine(seed, *navi);
00096 navi.incrementThen();
00097 }
00098 if (navi.terminalValue())
00099 finalize_term_hash(seed);
00100
00101 }
00102
00103 template <class NaviType>
00104 std::size_t
00105 stable_first_hash_range(NaviType navi) {
00106
00107 std::size_t seed = 0;
00108 stable_first_hash_range(seed, navi);
00109
00110 return seed;
00111 }
00112
00113 template <class HashType, class Iterator>
00114 void
00115 stable_term_hash(HashType& seed, Iterator start, Iterator finish) {
00116 boost::hash_range(seed, start, finish);
00117 finalize_term_hash(seed);
00118 }
00119
00120 template <class Iterator>
00121 std::size_t
00122 stable_term_hash(Iterator start, Iterator finish) {
00123
00124 std::size_t seed(0);
00125 stable_term_hash(seed, start, finish);
00126
00127 return seed;
00128 }
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 END_NAMESPACE_PBORI
00145
00146 #endif