Skip to content

Commit 3da4e3f

Browse files
author
Owen
committed
Allow walking over the expression in a renamedt
This could certainly be improved on, but it does the job for now.
1 parent 6bb621a commit 3da4e3f

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

src/goto-symex/renaming_level.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Author: Romain Brenguier, [email protected]
1616
#include <unordered_set>
1717

1818
#include <util/irep.h>
19+
#include <util/range.h>
1920
#include <util/simplify_expr.h>
2021
#include <util/ssa_expr.h>
2122

@@ -66,6 +67,31 @@ struct symex_renaming_levelt
6667
}
6768
};
6869

70+
template <typename underlyingt, levelt level>
71+
class renamedt;
72+
73+
template <typename underlyingt, levelt level>
74+
class renamed_vectort
75+
{
76+
public:
77+
void for_each(std::function<void(renamedt<underlyingt, level>&)> f)
78+
{
79+
for(auto &op : values)
80+
{
81+
auto op_as_renamed = renamedt<underlyingt, level>{op};
82+
f(op_as_renamed);
83+
op = op_as_renamed.value;
84+
}
85+
}
86+
87+
private:
88+
std::vector<underlyingt> &values;
89+
90+
explicit renamed_vectort(std::vector<underlyingt> &values) : values(values){};
91+
92+
friend renamedt<underlyingt, level>;
93+
};
94+
6995
/// Wrapper for expressions or types which have been renamed up to a given
7096
/// \p level
7197
template <typename underlyingt, levelt level>
@@ -82,6 +108,16 @@ class renamedt
82108
return value;
83109
}
84110

111+
renamed_vectort<underlyingt, level> operands()
112+
{
113+
return renamed_vectort<underlyingt, level>{value.operands()};
114+
};
115+
116+
const renamed_vectort<underlyingt, level> operands() const
117+
{
118+
return renamed_vectort<underlyingt, level>{value.operands()};
119+
}
120+
85121
void simplify(const namespacet &ns)
86122
{
87123
(void)::simplify(value, ns);
@@ -94,13 +130,21 @@ class renamedt
94130
friend struct symex_level1t;
95131
friend struct symex_level2t;
96132
friend class goto_symex_statet;
133+
friend renamed_vectort<underlyingt, level>;
134+
template <levelt make_renamed_level>
135+
friend renamedt<exprt, make_renamed_level> make_renamed(constant_exprt constant);
97136

98137
/// Only the friend classes can create renamedt objects
99138
explicit renamedt(underlyingt value) : value(std::move(value))
100139
{
101140
}
102141
};
103142

143+
template <levelt level>
144+
renamedt<exprt, level> make_renamed(constant_exprt constant) {
145+
return renamedt<exprt, level>(std::move(constant));
146+
}
147+
104148
/// Functor to set the level 0 renaming of SSA expressions.
105149
/// Level 0 corresponds to threads.
106150
/// The renaming is built for one particular interleaving.

0 commit comments

Comments
 (0)