Skip to content

Commit 2a1fa87

Browse files
Added recording_symbol_tablet
1 parent b2e829d commit 2a1fa87

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Copyright 2016-2017 DiffBlue Limited. All Rights Reserved.
2+
3+
/// \file
4+
/// A symbol table that records which entries have been updated
5+
6+
#ifndef CPROVER_UTIL_RECORDING_SYMBOL_TABLE_H
7+
#define CPROVER_UTIL_RECORDING_SYMBOL_TABLE_H
8+
9+
#include <utility>
10+
#include <unordered_set>
11+
#include "irep.h"
12+
#include "symbol_table.h"
13+
14+
15+
/// \brief A symbol table that records which entries have been updated/removed
16+
/// \ingroup gr_symbol_table
17+
class recording_symbol_tablet:public symbol_tablet
18+
{
19+
public:
20+
typedef std::unordered_set<irep_idt, irep_id_hash> changesett;
21+
private:
22+
symbol_tablet &base_symbol_table;
23+
changesett updated;
24+
changesett removed;
25+
26+
public:
27+
// NOLINTNEXTLINE(runtime/explicit) - No information is lost in conversion
28+
recording_symbol_tablet(symbol_tablet &base_symbol_table)
29+
: symbol_tablet(
30+
base_symbol_table.symbols,
31+
base_symbol_table.symbol_base_map,
32+
base_symbol_table.symbol_module_map),
33+
base_symbol_table(base_symbol_table)
34+
{
35+
}
36+
37+
recording_symbol_tablet(const recording_symbol_tablet &other)
38+
: symbol_tablet(
39+
other.base_symbol_table.symbols,
40+
other.base_symbol_table.symbol_base_map,
41+
other.base_symbol_table.symbol_module_map),
42+
base_symbol_table(other.base_symbol_table)
43+
{
44+
}
45+
46+
virtual opt_symbol_reft get_writeable(const irep_idt &identifier) override
47+
{
48+
opt_symbol_reft result=base_symbol_table.get_writeable(identifier);
49+
if(result)
50+
on_update(identifier);
51+
return result;
52+
}
53+
54+
virtual std::pair<symbolt &, bool> insert(symbolt symbol) override
55+
{
56+
std::pair<symbolt &, bool> result=
57+
base_symbol_table.insert(std::move(symbol));
58+
if(result.second)
59+
on_update(result.first.name);
60+
return result;
61+
}
62+
63+
virtual void erase(const symbolst::const_iterator &entry) override
64+
{
65+
base_symbol_table.erase(entry);
66+
on_remove(entry->first);
67+
}
68+
69+
virtual void clear() override
70+
{
71+
for(const auto &named_symbol : base_symbol_table.symbols)
72+
on_remove(named_symbol.first);
73+
base_symbol_table.clear();
74+
}
75+
76+
const changesett &get_updated() const { return updated; }
77+
const changesett &get_removed() const { return removed; }
78+
79+
private:
80+
void on_update(const irep_idt &id)
81+
{
82+
updated.insert(id);
83+
removed.erase(id);
84+
}
85+
86+
void on_remove(const irep_idt &id)
87+
{
88+
removed.insert(id);
89+
updated.erase(id);
90+
}
91+
};
92+
93+
#endif // CPROVER_UTIL_RECORDING_SYMBOL_TABLE_H

0 commit comments

Comments
 (0)