CBMC
irep_hash_container.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: IREP Hash Container
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_UTIL_IREP_HASH_CONTAINER_H
13 #define CPROVER_UTIL_IREP_HASH_CONTAINER_H
14 
15 #include <map>
16 #include <vector>
17 
18 #include "irep.h"
19 #include "numbering.h"
20 
22 {
23 public:
24  std::size_t number(const irept &irep);
25 
26  explicit irep_hash_container_baset(bool _full):full(_full)
27  {
28  }
29 
30  void clear()
31  {
32  numbering.clear();
33  }
34 
35 protected:
36  // replacing the following two hash-tables by
37  // std::maps doesn't make much difference in performance
38 
39  // this is the first level: address of the content
40 
42  {
43  std::size_t operator()(const void *p) const
44  {
45  return (std::size_t)p;
46  }
47  };
48 
49  struct irep_entryt
50  {
51  std::size_t number;
52  irept irep; // copy to keep addresses stable
53 
54  irep_entryt(std::size_t _number, const irept &_irep)
55  : number(_number), irep(_irep)
56  {
57  }
58  };
59 
60  typedef std::unordered_map<const void *, irep_entryt, pointer_hasht>
63 
64  // this is the second level: content
65 
66  typedef std::vector<std::size_t> packedt;
67 
68  struct vector_hasht
69  {
70  std::size_t operator()(const packedt &p) const;
71  };
72 
74 
75  void pack(const irept &irep, packedt &);
76 
77  bool full;
78 };
79 
80 // excludes comments
83 {
84 public:
86  {
87  }
88 };
89 
90 // includes comments
93 {
94 public:
96  {
97  }
98 };
99 
100 template <typename Key, typename T>
102 {
103 protected:
104  using mapt = std::map<std::size_t, T>;
105 
106 public:
107  using key_type = Key;
108  using mapped_type = T;
109  using value_type = std::pair<const Key, T>;
110  using const_iterator = typename mapt::const_iterator;
111  using iterator = typename mapt::iterator;
112 
113  const_iterator find(const Key &key) const
114  {
115  return map.find(hash_container.number(key));
116  }
117 
118  iterator find(const Key &key)
119  {
120  return map.find(hash_container.number(key));
121  }
122 
124  {
125  return map.begin();
126  }
127 
129  {
130  return map.begin();
131  }
132 
134  {
135  return map.end();
136  }
137 
139  {
140  return map.end();
141  }
142 
143  void clear()
144  {
146  map.clear();
147  }
148 
149  std::size_t size() const
150  {
151  return map.size();
152  }
153 
154  bool empty() const
155  {
156  return map.empty();
157  }
158 
159  T &operator[](const Key &key)
160  {
161  const std::size_t i = hash_container.number(key);
162  return map[i];
163  }
164 
165  std::pair<iterator, bool> insert(const value_type &value)
166  {
167  const std::size_t i = hash_container.number(value.first);
168  return map.emplace(i, value.second);
169  }
170 
171  void erase(iterator it)
172  {
173  map.erase(it);
174  }
175 
177  {
178  std::swap(hash_container, other.hash_container);
179  std::swap(map, other.map);
180  }
181 
182 protected:
185 };
186 
187 #endif // CPROVER_UTIL_IREP_HASH_CONTAINER_H
irep_hash_mapt::swap
void swap(irep_hash_mapt< Key, T > &other)
Definition: irep_hash_container.h:176
irep_hash_mapt::end
const_iterator end() const
Definition: irep_hash_container.h:133
irep_hash_container_baset::numbering
numberingt< packedt, vector_hasht > numbering
Definition: irep_hash_container.h:73
irep_hash_mapt::map
mapt map
Definition: irep_hash_container.h:184
irep_hash_container_baset::pack
void pack(const irept &irep, packedt &)
Definition: irep_hash_container.cpp:47
irep_hash_container_baset::packedt
std::vector< std::size_t > packedt
Definition: irep_hash_container.h:66
irep_hash_container_baset::irep_entryt::irep_entryt
irep_entryt(std::size_t _number, const irept &_irep)
Definition: irep_hash_container.h:54
numberingt
Definition: numbering.h:21
irep_hash_container_baset::pointer_hasht::operator()
std::size_t operator()(const void *p) const
Definition: irep_hash_container.h:43
irep_hash_container_baset::vector_hasht::operator()
std::size_t operator()(const packedt &p) const
Definition: irep_hash_container.cpp:38
irep_hash_mapt::value_type
std::pair< const Key, T > value_type
Definition: irep_hash_container.h:109
irep_hash_mapt::clear
void clear()
Definition: irep_hash_container.h:143
irep_hash_mapt::begin
const_iterator begin() const
Definition: irep_hash_container.h:123
irep_hash_mapt::hash_container
irep_hash_containert hash_container
Definition: irep_hash_container.h:183
irep_hash_mapt::key_type
Key key_type
Definition: irep_hash_container.h:107
irep_hash_mapt
Definition: irep_hash_container.h:101
irep_hash_container_baset
Definition: irep_hash_container.h:21
irep_hash_container_baset::irep_entryt::number
std::size_t number
Definition: irep_hash_container.h:51
irep_full_hash_containert::irep_full_hash_containert
irep_full_hash_containert()
Definition: irep_hash_container.h:95
irep_hash_mapt::mapped_type
T mapped_type
Definition: irep_hash_container.h:108
irep_hash_container_baset::clear
void clear()
Definition: irep_hash_container.h:30
irep_hash_mapt::find
const_iterator find(const Key &key) const
Definition: irep_hash_container.h:113
irep_hash_mapt::mapt
std::map< std::size_t, T > mapt
Definition: irep_hash_container.h:104
irep_hash_container_baset::pointer_hasht
Definition: irep_hash_container.h:41
irep_hash_containert
Definition: irep_hash_container.h:81
numbering.h
irep_hash_mapt::size
std::size_t size() const
Definition: irep_hash_container.h:149
irep_hash_mapt::end
iterator end()
Definition: irep_hash_container.h:138
irep_hash_mapt::begin
iterator begin()
Definition: irep_hash_container.h:128
irep_hash_mapt::find
iterator find(const Key &key)
Definition: irep_hash_container.h:118
irep_hash_mapt::empty
bool empty() const
Definition: irep_hash_container.h:154
irep_hash_container_baset::vector_hasht
Definition: irep_hash_container.h:68
irep_hash_mapt::operator[]
T & operator[](const Key &key)
Definition: irep_hash_container.h:159
irep_hash_mapt::const_iterator
typename mapt::const_iterator const_iterator
Definition: irep_hash_container.h:110
irep_hash_container_baset::number
std::size_t number(const irept &irep)
Definition: irep_hash_container.cpp:17
irep_hash_mapt::insert
std::pair< iterator, bool > insert(const value_type &value)
Definition: irep_hash_container.h:165
irep_hash_container_baset::full
bool full
Definition: irep_hash_container.h:77
irep_full_hash_containert
Definition: irep_hash_container.h:91
irept
There are a large number of kinds of tree structured or tree-like data in CPROVER.
Definition: irep.h:359
irep_hash_containert::irep_hash_containert
irep_hash_containert()
Definition: irep_hash_container.h:85
irep_hash_mapt::iterator
typename mapt::iterator iterator
Definition: irep_hash_container.h:111
irep_hash_mapt::erase
void erase(iterator it)
Definition: irep_hash_container.h:171
irep_hash_container_baset::ptr_hasht
std::unordered_map< const void *, irep_entryt, pointer_hasht > ptr_hasht
Definition: irep_hash_container.h:61
irep_hash_container_baset::irep_entryt
Definition: irep_hash_container.h:49
irep_hash_container_baset::irep_hash_container_baset
irep_hash_container_baset(bool _full)
Definition: irep_hash_container.h:26
irep_hash_container_baset::irep_entryt::irep
irept irep
Definition: irep_hash_container.h:52
irep.h
irep_hash_container_baset::ptr_hash
ptr_hasht ptr_hash
Definition: irep_hash_container.h:62