Skip to content

Commit 97ee2d6

Browse files
Store builtin function pointer inside builtin node
This is more natural than always having to refer to the builtin_function_nodes array.
1 parent 41c0294 commit 97ee2d6

File tree

2 files changed

+32
-34
lines changed

2 files changed

+32
-34
lines changed

src/solvers/refinement/string_refinement_util.cpp

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -210,28 +210,18 @@ string_dependenciest::node_at(const array_string_exprt &e) const
210210
return {};
211211
}
212212

213-
string_dependenciest::builtin_function_nodet string_dependenciest::make_node(
213+
string_dependenciest::builtin_function_nodet &string_dependenciest::make_node(
214214
std::unique_ptr<string_builtin_functiont> &builtin_function)
215215
{
216-
const builtin_function_nodet builtin_function_node(
217-
builtin_function_nodes.size());
218-
builtin_function_nodes.emplace_back();
219-
builtin_function_nodes.back().swap(builtin_function);
220-
return builtin_function_node;
216+
builtin_function_nodes.emplace_back(
217+
std::move(builtin_function), builtin_function_nodes.size());
218+
return builtin_function_nodes.back();
221219
}
222220

223221
const string_builtin_functiont &string_dependenciest::get_builtin_function(
224222
const builtin_function_nodet &node) const
225223
{
226-
PRECONDITION(node.index < builtin_function_nodes.size());
227-
return *(builtin_function_nodes[node.index]);
228-
}
229-
230-
const std::vector<string_dependenciest::builtin_function_nodet> &
231-
string_dependenciest::dependencies(
232-
const string_dependenciest::string_nodet &node) const
233-
{
234-
return node.dependencies;
224+
return *node.data;
235225
}
236226

237227
void string_dependenciest::add_dependency(
@@ -248,7 +238,7 @@ void string_dependenciest::add_dependency(
248238
return;
249239
}
250240
string_nodet &string_node = get_node(e);
251-
string_node.dependencies.push_back(builtin_function_node);
241+
string_node.dependencies.push_back(builtin_function_node.index);
252242
}
253243

254244
static void add_dependency_to_string_subexprs(
@@ -299,7 +289,7 @@ optionalt<exprt> string_dependenciest::eval(
299289
const auto &f = node.result_from;
300290
if(f && node.dependencies.size() == 1)
301291
{
302-
const auto value_opt = get_builtin_function(*f).eval(get_value);
292+
const auto value_opt = builtin_function_nodes[*f].data->eval(get_value);
303293
eval_string_cache[it->second] = value_opt;
304294
return value_opt;
305295
}
@@ -336,7 +326,7 @@ bool add_node(
336326
{
337327
dependencies.add_dependency(*string_result, builtin_function_node);
338328
auto &node = dependencies.get_node(*string_result);
339-
node.result_from = builtin_function_node;
329+
node.result_from = builtin_function_node.index;
340330
}
341331
else
342332
add_dependency_to_string_subexprs(
@@ -352,7 +342,7 @@ void string_dependenciest::for_each_successor(
352342
if(node.kind == nodet::BUILTIN)
353343
{
354344
const auto &builtin = builtin_function_nodes[node.index];
355-
for(const auto &s : builtin->string_arguments())
345+
for(const auto &s : builtin.data->string_arguments())
356346
{
357347
std::vector<std::reference_wrapper<const exprt>> stack({s});
358348
while(!stack.empty())
@@ -377,7 +367,9 @@ void string_dependenciest::for_each_successor(
377367
std::for_each(
378368
s_node.dependencies.begin(),
379369
s_node.dependencies.end(),
380-
[&](const builtin_function_nodet &p) { f(nodet(p)); });
370+
[&](const std::size_t &index) { // NOLINT
371+
f(nodet(builtin_function_nodes[index]));
372+
});
381373
}
382374
else
383375
UNREACHABLE;
@@ -389,7 +381,7 @@ void string_dependenciest::for_each_node(
389381
for(const auto string_node : string_nodes)
390382
f(nodet(string_node));
391383
for(std::size_t i = 0; i < builtin_function_nodes.size(); ++i)
392-
f(nodet(builtin_function_nodet(i)));
384+
f(nodet(builtin_function_nodes[i]));
393385
}
394386

395387
void string_dependenciest::output_dot(std::ostream &stream) const
@@ -405,7 +397,7 @@ void string_dependenciest::output_dot(std::ostream &stream) const
405397
const auto node_to_string = [&](const nodet &n) { // NOLINT
406398
std::stringstream ostream;
407399
if(n.kind == nodet::BUILTIN)
408-
ostream << builtin_function_nodes[n.index]->name() << n.index;
400+
ostream << builtin_function_nodes[n.index].data->name() << n.index;
409401
else
410402
ostream << '"' << format(string_nodes[n.index].expr) << '"';
411403
return ostream.str();
@@ -420,7 +412,7 @@ void string_dependenciest::add_constraints(
420412
{
421413
for(const auto &builtin : builtin_function_nodes)
422414
{
423-
const exprt return_value = builtin->add_constraints(generator);
424-
generator.add_lemma(equal_exprt(return_value, builtin->return_code));
415+
const exprt return_value = builtin.data->add_constraints(generator);
416+
generator.add_lemma(equal_exprt(return_value, builtin.data->return_code));
425417
}
426418
}

src/solvers/refinement/string_refinement_util.h

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,19 @@ class equation_symbol_mappingt
149149
class string_dependenciest
150150
{
151151
public:
152-
/// A builtin_function node is just an index in the `builtin_function_nodes`
153-
/// vector.
152+
/// A builtin function node contains a builtin function call
154153
class builtin_function_nodet
155154
{
156155
public:
156+
// index in the `builtin_function_nodes` vector
157157
std::size_t index;
158-
explicit builtin_function_nodet(std::size_t i) : index(i)
158+
// pointer to the builtin function
159+
std::unique_ptr<string_builtin_functiont> data;
160+
161+
explicit builtin_function_nodet(
162+
std::unique_ptr<string_builtin_functiont> d,
163+
std::size_t i)
164+
: index(i), data(std::move(d))
159165
{
160166
}
161167
};
@@ -168,10 +174,12 @@ class string_dependenciest
168174
array_string_exprt expr;
169175
// index in the string_nodes vector
170176
std::size_t index;
171-
// builtin functions on which it depends
172-
std::vector<builtin_function_nodet> dependencies;
177+
// builtin functions on which it depends, refered by there index in
178+
// builtin_function node vector.
179+
// \todo should these we shared pointers?
180+
std::vector<std::size_t> dependencies;
173181
// builtin function of which it is the result
174-
optionalt<builtin_function_nodet> result_from;
182+
optionalt<std::size_t> result_from;
175183

176184
explicit string_nodet(array_string_exprt e, const std::size_t index)
177185
: expr(std::move(e)), index(index)
@@ -185,10 +193,8 @@ class string_dependenciest
185193
node_at(const array_string_exprt &e) const;
186194

187195
/// `builtin_function` is reset to an empty pointer after the node is created
188-
builtin_function_nodet
196+
builtin_function_nodet &
189197
make_node(std::unique_ptr<string_builtin_functiont> &builtin_function);
190-
const std::vector<builtin_function_nodet> &
191-
dependencies(const string_nodet &node) const;
192198
const string_builtin_functiont &
193199
get_builtin_function(const builtin_function_nodet &node) const;
194200

@@ -216,7 +222,7 @@ class string_dependenciest
216222

217223
private:
218224
/// Set of nodes representing builtin_functions
219-
std::vector<std::unique_ptr<string_builtin_functiont>> builtin_function_nodes;
225+
std::vector<builtin_function_nodet> builtin_function_nodes;
220226

221227
/// Set of nodes representing strings
222228
std::vector<string_nodet> string_nodes;

0 commit comments

Comments
 (0)