PolyBoRi
pbori_routines_hash.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
48 //*****************************************************************************
49 
50 #ifndef pbori_routines_hash_h_
51 #define pbori_routines_hash_h_
52 // include basic definitions
53 #include "pbori_defs.h"
54 #include <boost/functional/hash.hpp>
55 
56 
58 
59 
60 
61 template <class HashType, class NaviType>
62 void
63 stable_hash_range(HashType& seed, NaviType navi) {
64 
65  if (navi.isConstant()) {
66  if (navi.terminalValue())
67  boost::hash_combine(seed, CTypes::max_index());
68  return;
69  }
70 
71  boost::hash_combine(seed, *navi);
72 
73  stable_hash_range(seed, navi.thenBranch());
74  stable_hash_range(seed, navi.elseBranch());
75 }
76 
77 template <class NaviType>
78 std::size_t
79 stable_hash_range(NaviType navi) {
80 
81  std::size_t seed = 0;
82  stable_hash_range(seed, navi);
83 
84  return seed;
85 }
86 
87 template <class HashType>
88 void
89 finalize_term_hash(HashType& seed) {
90  boost::hash_combine(seed, CTypes::max_index());
91 }
92 
93 template <class HashType, class NaviType>
94 void
95 stable_first_hash_range(HashType& seed, NaviType navi) {
96 
97  while (!navi.isConstant()) {
98  boost::hash_combine(seed, *navi);
99  navi.incrementThen();
100  }
101  if (navi.terminalValue())
102  finalize_term_hash(seed);
103 
104 }
105 
106 template <class NaviType>
107 std::size_t
108 stable_first_hash_range(NaviType navi) {
109 
110  std::size_t seed = 0;
111  stable_first_hash_range(seed, navi);
112 
113  return seed;
114 }
115 
116 template <class HashType, class Iterator>
117 void
118 stable_term_hash(HashType& seed, Iterator start, Iterator finish) {
119  boost::hash_range(seed, start, finish);
120  finalize_term_hash(seed);
121 }
122 
123 template <class Iterator>
124 std::size_t
125 stable_term_hash(Iterator start, Iterator finish) {
126 
127  std::size_t seed(0);
128  stable_term_hash(seed, start, finish);
129 
130  return seed;
131 }
132 
133 
134 // The following may be used without polybori. Hence, we have to load it in the
135 // namespace here
136 
137 // Get generic hash functions
138 // #include "generic_hash.h"
139 
140 // #ifndef PBORI_HASH_TAG
141 // #define PBORI_HASH_TAG js_tag
142 // #endif
143 
144 
145 // typedef generic_hash_tags::PBORI_HASH_TAG pbori_hash_tag;
146 
148 
149 #endif