PolyBoRi
pbori_routines_hash.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
13 //*****************************************************************************
14 
15 #ifndef polybori_routines_pbori_routines_hash_h_
16 #define polybori_routines_pbori_routines_hash_h_
17 // include basic definitions
18 #include <polybori/pbori_defs.h>
19 #include <boost/functional/hash.hpp>
20 
21 
23 
24 
25 
26 template <class HashType, class NaviType>
27 void
28 stable_hash_range(HashType& seed, NaviType navi) {
29 
30  if (navi.isConstant()) {
31  if (navi.terminalValue())
32  boost::hash_combine(seed, CTypes::max_index());
33  return;
34  }
35 
36  boost::hash_combine(seed, *navi);
37 
38  stable_hash_range(seed, navi.thenBranch());
39  stable_hash_range(seed, navi.elseBranch());
40 }
41 
42 template <class NaviType>
43 std::size_t
44 stable_hash_range(NaviType navi) {
45 
46  std::size_t seed = 0;
47  stable_hash_range(seed, navi);
48 
49  return seed;
50 }
51 
52 template <class HashType>
53 void
54 finalize_term_hash(HashType& seed) {
55  boost::hash_combine(seed, CTypes::max_index());
56 }
57 
58 template <class HashType, class NaviType>
59 void
60 stable_first_hash_range(HashType& seed, NaviType navi) {
61 
62  while (!navi.isConstant()) {
63  boost::hash_combine(seed, *navi);
64  navi.incrementThen();
65  }
66  if (navi.terminalValue())
67  finalize_term_hash(seed);
68 
69 }
70 
71 template <class NaviType>
72 std::size_t
73 stable_first_hash_range(NaviType navi) {
74 
75  std::size_t seed = 0;
76  stable_first_hash_range(seed, navi);
77 
78  return seed;
79 }
80 
81 template <class HashType, class Iterator>
82 void
83 stable_term_hash(HashType& seed, Iterator start, Iterator finish) {
84  boost::hash_range(seed, start, finish);
85  finalize_term_hash(seed);
86 }
87 
88 template <class Iterator>
89 std::size_t
90 stable_term_hash(Iterator start, Iterator finish) {
91 
92  std::size_t seed(0);
93  stable_term_hash(seed, start, finish);
94 
95  return seed;
96 }
97 
99 
100 #endif
std::size_t stable_term_hash(Iterator start, Iterator finish)
Definition: pbori_routines_hash.h:90
#define END_NAMESPACE_PBORI
Finish project's namespace.
Definition: pbori_defs.h:77
#define BEGIN_NAMESPACE_PBORI
Start project's namespace.
Definition: pbori_defs.h:74
std::size_t stable_hash_range(NaviType navi)
Definition: pbori_routines_hash.h:44
std::size_t stable_first_hash_range(NaviType navi)
Definition: pbori_routines_hash.h:73
void finalize_term_hash(HashType &seed)
Definition: pbori_routines_hash.h:54