16
16
#include < unordered_set>
17
17
18
18
#include < util/irep.h>
19
+ #include < util/range.h>
19
20
#include < util/simplify_expr.h>
20
21
#include < util/ssa_expr.h>
21
22
@@ -66,6 +67,31 @@ struct symex_renaming_levelt
66
67
}
67
68
};
68
69
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
+
69
95
// / Wrapper for expressions or types which have been renamed up to a given
70
96
// / \p level
71
97
template <typename underlyingt, levelt level>
@@ -82,6 +108,16 @@ class renamedt
82
108
return value;
83
109
}
84
110
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
+
85
121
void simplify (const namespacet &ns)
86
122
{
87
123
(void )::simplify (value, ns);
@@ -94,13 +130,21 @@ class renamedt
94
130
friend struct symex_level1t ;
95
131
friend struct symex_level2t ;
96
132
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);
97
136
98
137
// / Only the friend classes can create renamedt objects
99
138
explicit renamedt (underlyingt value) : value(std::move(value))
100
139
{
101
140
}
102
141
};
103
142
143
+ template <levelt level>
144
+ renamedt<exprt, level> make_renamed (constant_exprt constant) {
145
+ return renamedt<exprt, level>(std::move (constant));
146
+ }
147
+
104
148
// / Functor to set the level 0 renaming of SSA expressions.
105
149
// / Level 0 corresponds to threads.
106
150
// / The renaming is built for one particular interleaving.
0 commit comments