Go to the documentation of this file.00001
00002
00048
00049
00050 #ifndef pbori_routines_hash_h_
00051 #define pbori_routines_hash_h_
00052
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
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 END_NAMESPACE_PBORI
00148
00149 #endif