Skip to content

Commit 9762886

Browse files
Refactor string_concat_char builtin function
This makes the argument an explicit field in the class which is clearer and safer than using a vector of arguments.
1 parent da7966c commit 9762886

File tree

3 files changed

+27
-49
lines changed

3 files changed

+27
-49
lines changed

src/solvers/refinement/string_builtin_function.cpp

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -29,33 +29,6 @@ string_transformation_builtin_functiont::
2929
const auto arg1 = expr_checked_cast<struct_exprt>(fun_args[2]);
3030
input = array_pool.find(arg1.op1(), arg1.op0());
3131
result = array_pool.find(fun_args[1], fun_args[0]);
32-
args.insert(args.end(), fun_args.begin() + 3, fun_args.end());
33-
}
34-
35-
optionalt<exprt> string_transformation_builtin_functiont::eval(
36-
const std::function<exprt(const exprt &)> &get_value) const
37-
{
38-
const auto &input_value = eval_string(input, get_value);
39-
if(!input_value.has_value())
40-
return {};
41-
42-
std::vector<mp_integer> arg_values;
43-
const auto &insert = std::back_inserter(arg_values);
44-
const mp_integer unknown('?');
45-
std::transform(
46-
args.begin(), args.end(), insert, [&](const exprt &e) { // NOLINT
47-
if(const auto val = numeric_cast<mp_integer>(get_value(e)))
48-
return *val;
49-
INVARIANT(
50-
get_value(e).id() == ID_unknown,
51-
"array valuation should only contain constants and unknown");
52-
return unknown;
53-
});
54-
55-
const auto result_value = eval(*input_value, arg_values);
56-
const auto length = from_integer(result_value.size(), result.length().type());
57-
const array_typet type(result.type().subtype(), length);
58-
return make_string(result_value, type);
5932
}
6033

6134
string_insertion_builtin_functiont::string_insertion_builtin_functiont(
@@ -162,14 +135,25 @@ std::vector<mp_integer> string_concatenation_builtin_functiont::eval(
162135
return result;
163136
}
164137

165-
std::vector<mp_integer> string_concat_char_builtin_functiont::eval(
166-
const std::vector<mp_integer> &input_value,
167-
const std::vector<mp_integer> &args_value) const
138+
optionalt<exprt> string_concat_char_builtin_functiont::eval(
139+
const std::function<exprt(const exprt &)> &get_value) const
168140
{
169-
PRECONDITION(args_value.size() == 1);
170-
std::vector<mp_integer> result(input_value);
171-
result.push_back(args_value[0]);
172-
return result;
141+
auto input_opt = eval_string(input, get_value);
142+
if(!input_opt.has_value())
143+
return {};
144+
const mp_integer char_val = [&] {
145+
if(const auto val = numeric_cast<mp_integer>(get_value(character)))
146+
return *val;
147+
INVARIANT(
148+
get_value(character).id() == ID_unknown,
149+
"character valuation should only contain constants and unknown");
150+
return mp_integer(CHARACTER_FOR_UNKNOWN);
151+
}();
152+
input_opt.value().push_back(char_val);
153+
const auto length =
154+
from_integer(input_opt.value().size(), result.length().type());
155+
const array_typet type(result.type().subtype(), length);
156+
return make_string(input_opt.value(), type);
173157
}
174158

175159
std::vector<mp_integer> string_insertion_builtin_functiont::eval(

src/solvers/refinement/string_builtin_function.h

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
class array_poolt;
1313

14+
#define CHARACTER_FOR_UNKNOWN '?'
15+
1416
/// Base class for string functions that are built in the solver
1517
class string_builtin_functiont
1618
{
@@ -68,7 +70,6 @@ class string_transformation_builtin_functiont : public string_builtin_functiont
6870
public:
6971
array_string_exprt result;
7072
array_string_exprt input;
71-
std::vector<exprt> args;
7273

7374
/// Constructor from arguments of a function application.
7475
/// The arguments in `fun_args` should be in order:
@@ -88,15 +89,6 @@ class string_transformation_builtin_functiont : public string_builtin_functiont
8889
{
8990
return {input};
9091
}
91-
92-
/// Evaluate the result from a concrete valuation of the arguments
93-
virtual std::vector<mp_integer> eval(
94-
const std::vector<mp_integer> &input_value,
95-
const std::vector<mp_integer> &args_value) const = 0;
96-
97-
optionalt<exprt>
98-
eval(const std::function<exprt(const exprt &)> &get_value) const override;
99-
10092
bool maybe_testing_function() const override
10193
{
10294
return false;
@@ -108,6 +100,8 @@ class string_concat_char_builtin_functiont
108100
: public string_transformation_builtin_functiont
109101
{
110102
public:
103+
exprt character;
104+
111105
/// Constructor from arguments of a function application.
112106
/// The arguments in `fun_args` should be in order:
113107
/// an integer `result.length`, a character pointer `&result[0]`,
@@ -118,11 +112,12 @@ class string_concat_char_builtin_functiont
118112
array_poolt &array_pool)
119113
: string_transformation_builtin_functiont(return_code, fun_args, array_pool)
120114
{
115+
PRECONDITION(fun_args.size() == 4);
116+
character = fun_args[3];
121117
}
122118

123-
std::vector<mp_integer> eval(
124-
const std::vector<mp_integer> &input_value,
125-
const std::vector<mp_integer> &args_value) const override;
119+
optionalt<exprt>
120+
eval(const std::function<exprt(const exprt &)> &get_value) const override;
126121

127122
std::string name() const override
128123
{
@@ -131,7 +126,7 @@ class string_concat_char_builtin_functiont
131126

132127
exprt add_constraints(string_constraint_generatort &generator) const override
133128
{
134-
return generator.add_axioms_for_concat_char(result, input, args[0]);
129+
return generator.add_axioms_for_concat_char(result, input, character);
135130
}
136131

137132
exprt length_constraint() const override

src/solvers/refinement/string_refinement.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ Author: Alberto Griggio, [email protected]
3030
#include <solvers/refinement/string_refinement_util.h>
3131

3232
#define DEFAULT_MAX_NB_REFINEMENT std::numeric_limits<size_t>::max()
33-
#define CHARACTER_FOR_UNKNOWN '?'
3433

3534
class string_refinementt final: public bv_refinementt
3635
{

0 commit comments

Comments
 (0)