cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
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
21
class
irep_hash_container_baset
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
41
struct
pointer_hasht
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>
61
ptr_hasht
;
62
ptr_hasht
ptr_hash
;
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
73
numberingt<packedt, vector_hasht>
numbering
;
74
75
void
pack
(
const
irept
&irep,
packedt
&);
76
77
bool
full
;
78
};
79
80
// excludes comments
81
class
irep_hash_containert
:
82
public
irep_hash_container_baset
83
{
84
public
:
85
irep_hash_containert
():
irep_hash_container_baset
(false)
86
{
87
}
88
};
89
90
// includes comments
91
class
irep_full_hash_containert
:
92
public
irep_hash_container_baset
93
{
94
public
:
95
irep_full_hash_containert
():
irep_hash_container_baset
(true)
96
{
97
}
98
};
99
100
template
<
typename
Key,
typename
T>
101
class
irep_hash_mapt
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
123
const_iterator
begin
()
const
124
{
125
return
map
.begin();
126
}
127
128
iterator
begin
()
129
{
130
return
map
.begin();
131
}
132
133
const_iterator
end
()
const
134
{
135
return
map
.end();
136
}
137
138
iterator
end
()
139
{
140
return
map
.end();
141
}
142
143
void
clear
()
144
{
145
hash_container
.clear();
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
176
void
swap
(
irep_hash_mapt<Key, T>
&other)
177
{
178
std::swap(
hash_container
, other.
hash_container
);
179
std::swap(
map
, other.
map
);
180
}
181
182
protected
:
183
mutable
irep_hash_containert
hash_container
;
184
mapt
map
;
185
};
186
187
#endif
// CPROVER_UTIL_IREP_HASH_CONTAINER_H
irep_full_hash_containert::irep_full_hash_containert
irep_full_hash_containert()
Definition
irep_hash_container.h:95
irep_hash_container_baset::irep_hash_container_baset
irep_hash_container_baset(bool _full)
Definition
irep_hash_container.h:26
irep_hash_container_baset::packedt
std::vector< std::size_t > packedt
Definition
irep_hash_container.h:66
irep_hash_container_baset::numbering
numberingt< packedt, vector_hasht > numbering
Definition
irep_hash_container.h:73
irep_hash_container_baset::pack
void pack(const irept &irep, packedt &)
Definition
irep_hash_container.cpp:47
irep_hash_container_baset::number
std::size_t number(const irept &irep)
Definition
irep_hash_container.cpp:17
irep_hash_container_baset::full
bool full
Definition
irep_hash_container.h:77
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::ptr_hash
ptr_hasht ptr_hash
Definition
irep_hash_container.h:62
irep_hash_container_baset::clear
void clear()
Definition
irep_hash_container.h:30
irep_hash_containert
Definition
irep_hash_container.h:83
irep_hash_containert::irep_hash_containert
irep_hash_containert()
Definition
irep_hash_container.h:85
irep_hash_mapt
Definition
irep_hash_container.h:102
irep_hash_mapt< exprt, let_count_idt >::iterator
typename mapt::iterator iterator
Definition
irep_hash_container.h:111
irep_hash_mapt::find
const_iterator find(const Key &key) const
Definition
irep_hash_container.h:113
irep_hash_mapt::size
std::size_t size() const
Definition
irep_hash_container.h:149
irep_hash_mapt< exprt, let_count_idt >::mapped_type
let_count_idt mapped_type
Definition
irep_hash_container.h:108
irep_hash_mapt< exprt, let_count_idt >::value_type
std::pair< const exprt, let_count_idt > value_type
Definition
irep_hash_container.h:109
irep_hash_mapt< exprt, let_count_idt >::hash_container
irep_hash_containert hash_container
Definition
irep_hash_container.h:183
irep_hash_mapt::empty
bool empty() const
Definition
irep_hash_container.h:154
irep_hash_mapt::begin
const_iterator begin() const
Definition
irep_hash_container.h:123
irep_hash_mapt< exprt, let_count_idt >::mapt
std::map< std::size_t, let_count_idt > mapt
Definition
irep_hash_container.h:104
irep_hash_mapt::find
iterator find(const Key &key)
Definition
irep_hash_container.h:118
irep_hash_mapt::end
const_iterator end() const
Definition
irep_hash_container.h:133
irep_hash_mapt::operator[]
T & operator[](const Key &key)
Definition
irep_hash_container.h:159
irep_hash_mapt::clear
void clear()
Definition
irep_hash_container.h:143
irep_hash_mapt< exprt, let_count_idt >::key_type
exprt key_type
Definition
irep_hash_container.h:107
irep_hash_mapt::swap
void swap(irep_hash_mapt< Key, T > &other)
Definition
irep_hash_container.h:176
irep_hash_mapt< exprt, let_count_idt >::const_iterator
typename mapt::const_iterator const_iterator
Definition
irep_hash_container.h:110
irep_hash_mapt< exprt, let_count_idt >::map
mapt map
Definition
irep_hash_container.h:184
irep_hash_mapt::begin
iterator begin()
Definition
irep_hash_container.h:128
irep_hash_mapt::insert
std::pair< iterator, bool > insert(const value_type &value)
Definition
irep_hash_container.h:165
irep_hash_mapt::end
iterator end()
Definition
irep_hash_container.h:138
irep_hash_mapt::erase
void erase(iterator it)
Definition
irep_hash_container.h:171
irept
There are a large number of kinds of tree structured or tree-like data in CPROVER.
Definition
irep.h:364
numberingt
Definition
numbering.h:22
irep.h
numbering.h
irep_hash_container_baset::irep_entryt::irep
irept irep
Definition
irep_hash_container.h:52
irep_hash_container_baset::irep_entryt::irep_entryt
irep_entryt(std::size_t _number, const irept &_irep)
Definition
irep_hash_container.h:54
irep_hash_container_baset::irep_entryt::number
std::size_t number
Definition
irep_hash_container.h:51
irep_hash_container_baset::pointer_hasht
Definition
irep_hash_container.h:42
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
Definition
irep_hash_container.h:69
irep_hash_container_baset::vector_hasht::operator()
std::size_t operator()(const packedt &p) const
Definition
irep_hash_container.cpp:38
util
irep_hash_container.h
Generated by
1.17.0