cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
journalling_symbol_table.h
Go to the documentation of this file.
1
2
5
6
#ifndef CPROVER_UTIL_JOURNALLING_SYMBOL_TABLE_H
7
#define CPROVER_UTIL_JOURNALLING_SYMBOL_TABLE_H
8
9
#include "
irep.h
"
10
#include "
symbol_table_base.h
"
11
12
#include <unordered_set>
13
#include <utility>
14
36
class
journalling_symbol_tablet
:
public
symbol_table_baset
37
{
38
public
:
39
typedef
std::unordered_set<irep_idt>
changesett
;
40
41
private
:
42
symbol_table_baset
&
base_symbol_table
;
43
// Symbols originally in the table will never be marked inserted
44
changesett
inserted
;
45
// get_writeable marks an existing symbol updated
46
// Inserted symbols are marked updated, removed ones aren't
47
changesett
updated
;
48
// Symbols not originally in the table will never be marked removed
49
changesett
removed
;
50
51
private
:
52
explicit
journalling_symbol_tablet
(
symbol_table_baset
&
base_symbol_table
)
53
:
symbol_table_baset
(
54
base_symbol_table
.
symbols
,
55
base_symbol_table
.
symbol_base_map
,
56
base_symbol_table
.
symbol_module_map
),
57
base_symbol_table
(
base_symbol_table
)
58
{
59
}
60
61
public
:
62
journalling_symbol_tablet
(
const
journalling_symbol_tablet
&other) =
delete
;
63
64
journalling_symbol_tablet
(
journalling_symbol_tablet
&&other)
65
:
symbol_table_baset
(
66
other.
symbols
,
67
other.
symbol_base_map
,
68
other.
symbol_module_map
),
69
base_symbol_table
(other.
base_symbol_table
),
70
inserted
(
std
::
move
(other.
inserted
)),
71
updated
(
std
::
move
(other.
updated
)),
72
removed
(
std
::
move
(other.
removed
))
73
{
74
}
75
76
virtual
const
symbol_tablet
&
get_symbol_table
()
const override
77
{
78
return
base_symbol_table
.get_symbol_table();
79
}
80
81
static
journalling_symbol_tablet
wrap
(
symbol_table_baset
&
base_symbol_table
)
82
{
83
return
journalling_symbol_tablet
(
base_symbol_table
);
84
}
85
86
virtual
bool
move
(
symbolt
&symbol,
symbolt
*&new_symbol)
override
87
{
88
bool
ret =
base_symbol_table
.move(symbol, new_symbol);
89
if
(!ret)
90
on_insert
(symbol.
name
);
91
else
92
on_update
(symbol.
name
);
93
return
ret;
94
}
95
96
virtual
symbolt
*
get_writeable
(
const
irep_idt
&identifier)
override
97
{
98
symbolt
*result =
base_symbol_table
.get_writeable(identifier);
99
if
(result)
100
on_update
(identifier);
101
return
result;
102
}
103
104
std::size_t
next_unused_suffix
(
const
std::string &prefix)
const override
105
{
106
return
base_symbol_table
.next_unused_suffix(prefix);
107
}
108
109
virtual
std::pair<symbolt &, bool>
insert
(
symbolt
symbol)
override
110
{
111
std::pair<symbolt &, bool> result =
112
base_symbol_table
.insert(std::move(symbol));
113
if
(result.second)
114
on_insert
(result.first.name);
115
return
result;
116
}
117
118
virtual
void
119
erase
(
const
symbol_table_baset::symbolst::const_iterator &entry)
override
120
{
121
const
irep_idt
entry_name = entry->first;
122
base_symbol_table
.erase(entry);
123
on_remove
(entry_name);
124
}
125
126
virtual
void
clear
()
override
127
{
128
for
(
const
auto
&named_symbol :
base_symbol_table
.symbols)
129
on_remove
(named_symbol.first);
130
base_symbol_table
.clear();
131
}
132
133
virtual
iteratort
begin
()
override
134
{
135
return
iteratort
(
136
base_symbol_table
.begin(), [
this
](
const
irep_idt
&
id
) { on_update(id); });
137
}
138
virtual
iteratort
end
()
override
139
{
140
return
iteratort
(
141
base_symbol_table
.end(), [
this
](
const
irep_idt
&
id
) { on_update(id); });
142
}
143
144
using
symbol_table_baset::begin
;
145
using
symbol_table_baset::end
;
146
147
void
validate
(
148
const
validation_modet
vm =
validation_modet::INVARIANT
)
const override
149
{
150
base_symbol_table
.validate(vm);
151
}
152
153
const
changesett
&
get_inserted
()
const
154
{
155
return
inserted
;
156
}
157
const
changesett
&
get_updated
()
const
158
{
159
return
updated
;
160
}
161
const
changesett
&
get_removed
()
const
162
{
163
return
removed
;
164
}
165
166
private
:
167
void
on_insert
(
const
irep_idt
&
id
)
168
{
169
if
(
removed
.erase(
id
) == 0)
170
inserted
.insert(
id
);
171
updated
.insert(
id
);
172
}
173
174
void
on_update
(
const
irep_idt
&
id
)
175
{
176
updated
.insert(
id
);
177
}
178
179
void
on_remove
(
const
irep_idt
&
id
)
180
{
181
if
(
inserted
.erase(
id
) == 0)
182
removed
.insert(
id
);
183
updated
.erase(
id
);
184
}
185
};
186
187
#endif
// CPROVER_UTIL_JOURNALLING_SYMBOL_TABLE_H
journalling_symbol_tablet::begin
virtual iteratort begin() override
Definition
journalling_symbol_table.h:133
journalling_symbol_tablet::get_writeable
virtual symbolt * get_writeable(const irep_idt &identifier) override
Find a symbol in the symbol table for read-write access.
Definition
journalling_symbol_table.h:96
journalling_symbol_tablet::get_symbol_table
virtual const symbol_tablet & get_symbol_table() const override
Definition
journalling_symbol_table.h:76
journalling_symbol_tablet::inserted
changesett inserted
Definition
journalling_symbol_table.h:44
journalling_symbol_tablet::wrap
static journalling_symbol_tablet wrap(symbol_table_baset &base_symbol_table)
Definition
journalling_symbol_table.h:81
journalling_symbol_tablet::journalling_symbol_tablet
journalling_symbol_tablet(const journalling_symbol_tablet &other)=delete
journalling_symbol_tablet::removed
changesett removed
Definition
journalling_symbol_table.h:49
journalling_symbol_tablet::validate
void validate(const validation_modet vm=validation_modet::INVARIANT) const override
Definition
journalling_symbol_table.h:147
journalling_symbol_tablet::journalling_symbol_tablet
journalling_symbol_tablet(journalling_symbol_tablet &&other)
Definition
journalling_symbol_table.h:64
journalling_symbol_tablet::get_inserted
const changesett & get_inserted() const
Definition
journalling_symbol_table.h:153
journalling_symbol_tablet::on_insert
void on_insert(const irep_idt &id)
Definition
journalling_symbol_table.h:167
journalling_symbol_tablet::get_removed
const changesett & get_removed() const
Definition
journalling_symbol_table.h:161
journalling_symbol_tablet::updated
changesett updated
Definition
journalling_symbol_table.h:47
journalling_symbol_tablet::end
virtual iteratort end() override
Definition
journalling_symbol_table.h:138
journalling_symbol_tablet::on_remove
void on_remove(const irep_idt &id)
Definition
journalling_symbol_table.h:179
journalling_symbol_tablet::changesett
std::unordered_set< irep_idt > changesett
Definition
journalling_symbol_table.h:39
journalling_symbol_tablet::journalling_symbol_tablet
journalling_symbol_tablet(symbol_table_baset &base_symbol_table)
Definition
journalling_symbol_table.h:52
journalling_symbol_tablet::base_symbol_table
symbol_table_baset & base_symbol_table
Definition
journalling_symbol_table.h:42
journalling_symbol_tablet::next_unused_suffix
std::size_t next_unused_suffix(const std::string &prefix) const override
Definition
journalling_symbol_table.h:104
journalling_symbol_tablet::erase
virtual void erase(const symbol_table_baset::symbolst::const_iterator &entry) override
Remove a symbol from the symbol table.
Definition
journalling_symbol_table.h:119
journalling_symbol_tablet::get_updated
const changesett & get_updated() const
Definition
journalling_symbol_table.h:157
journalling_symbol_tablet::insert
virtual std::pair< symbolt &, bool > insert(symbolt symbol) override
Move or copy a new symbol to the symbol table.
Definition
journalling_symbol_table.h:109
journalling_symbol_tablet::move
virtual bool move(symbolt &symbol, symbolt *&new_symbol) override
Definition
journalling_symbol_table.h:86
journalling_symbol_tablet::clear
virtual void clear() override
Definition
journalling_symbol_table.h:126
journalling_symbol_tablet::on_update
void on_update(const irep_idt &id)
Definition
journalling_symbol_table.h:174
symbol_table_baset::iteratort
Definition
symbol_table_base.h:183
symbol_table_baset::symbol_base_map
const symbol_base_mapt & symbol_base_map
Read-only field, used to look up symbol names given their base names.
Definition
symbol_table_base.h:34
symbol_table_baset::symbol_table_baset
symbol_table_baset(const symbolst &symbols, const symbol_base_mapt &symbol_base_map, const symbol_module_mapt &symbol_module_map)
Definition
symbol_table_base.h:42
symbol_table_baset::symbol_module_map
const symbol_module_mapt & symbol_module_map
Read-only field, used to look up symbol names given their modules.
Definition
symbol_table_base.h:39
symbol_table_baset::begin
virtual iteratort begin()=0
symbol_table_baset::symbols
const symbolst & symbols
Read-only field, used to look up symbols given their names.
Definition
symbol_table_base.h:31
symbol_table_baset::end
virtual iteratort end()=0
symbol_tablet
The symbol table.
Definition
symbol_table.h:14
symbolt
Symbol table entry.
Definition
symbol.h:28
symbolt::name
irep_idt name
The unique identifier.
Definition
symbol.h:40
irep.h
std
STL namespace.
symbol_table_base.h
Author: Diffblue Ltd.
validation_modet
validation_modet
Definition
validation_mode.h:13
validation_modet::INVARIANT
@ INVARIANT
Definition
validation_mode.h:14
irep_idt
dstringt irep_idt
Definition
verification_result.h:16
util
journalling_symbol_table.h
Generated by
1.17.0