Skip to content

Commit c342cbb

Browse files
NathanJPhillipssmowton
authored andcommitted
Added recording_symbol_tablet
This is an implementation of symbol_tablet that wraps another symbol_tablet and journals additions, erasures and alterations such that a user can find out what changes have taken place since the recording_symbol_tablet was created.
1 parent 949d06b commit c342cbb

File tree

3 files changed

+438
-0
lines changed

3 files changed

+438
-0
lines changed

src/util/recording_symbol_table.h

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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+
// Symbols originally in the table will never be marked inserted
24+
changesett inserted;
25+
// get_writeable marks an existing symbol updated
26+
// Inserted symbols are marked updated, removed ones aren't
27+
changesett updated;
28+
// Symbols not originally in the table will never be marked removed
29+
changesett removed;
30+
31+
private:
32+
explicit recording_symbol_tablet(symbol_tablet &base_symbol_table)
33+
: symbol_tablet(
34+
base_symbol_table.symbols,
35+
base_symbol_table.symbol_base_map,
36+
base_symbol_table.symbol_module_map),
37+
base_symbol_table(base_symbol_table)
38+
{
39+
}
40+
41+
public:
42+
recording_symbol_tablet(const recording_symbol_tablet &other)
43+
: symbol_tablet(
44+
other.base_symbol_table.symbols,
45+
other.base_symbol_table.symbol_base_map,
46+
other.base_symbol_table.symbol_module_map),
47+
base_symbol_table(other.base_symbol_table)
48+
{
49+
}
50+
51+
static recording_symbol_tablet wrap(symbol_tablet &base_symbol_table)
52+
{
53+
return recording_symbol_tablet(base_symbol_table);
54+
}
55+
56+
virtual symbolt *get_writeable(const irep_idt &identifier) override
57+
{
58+
symbolt *result=base_symbol_table.get_writeable(identifier);
59+
if(result)
60+
on_update(identifier);
61+
return result;
62+
}
63+
64+
virtual std::pair<symbolt &, bool> insert(symbolt symbol) override
65+
{
66+
std::pair<symbolt &, bool> result=
67+
base_symbol_table.insert(std::move(symbol));
68+
if(result.second)
69+
on_insert(result.first.name);
70+
return result;
71+
}
72+
73+
virtual void erase(const symbolst::const_iterator &entry) override
74+
{
75+
base_symbol_table.erase(entry);
76+
on_remove(entry->first);
77+
}
78+
79+
virtual void clear() override
80+
{
81+
for(const auto &named_symbol : base_symbol_table.symbols)
82+
on_remove(named_symbol.first);
83+
base_symbol_table.clear();
84+
}
85+
86+
const changesett &get_inserted() const { return inserted; }
87+
const changesett &get_updated() const { return updated; }
88+
const changesett &get_removed() const { return removed; }
89+
90+
private:
91+
void on_insert(const irep_idt &id)
92+
{
93+
if(removed.erase(id)==0)
94+
inserted.insert(id);
95+
updated.insert(id);
96+
}
97+
98+
void on_update(const irep_idt &id)
99+
{
100+
updated.insert(id);
101+
}
102+
103+
void on_remove(const irep_idt &id)
104+
{
105+
if(inserted.erase(id)==0)
106+
removed.insert(id);
107+
updated.erase(id);
108+
}
109+
};
110+
111+
#endif // CPROVER_UTIL_RECORDING_SYMBOL_TABLE_H

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ SRC += unit_tests.cpp \
3030
util/expr_iterator.cpp \
3131
util/message.cpp \
3232
util/simplify_expr.cpp \
33+
util/symbol_table.cpp \
3334
catch_example.cpp \
3435
# Empty last line
3536

0 commit comments

Comments
 (0)