CBMC
string_dependencies.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: String solver
4 
5 Author: Diffblue Ltd.
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_SOLVERS_STRINGS_STRING_DEPENDENCIES_H
13 #define CPROVER_SOLVERS_STRINGS_STRING_DEPENDENCIES_H
14 
15 #include <memory>
16 
17 #include <util/nodiscard.h>
18 
20 
25 {
26 public:
29  {
30  public:
31  // index in the `builtin_function_nodes` vector
32  std::size_t index;
33  // pointer to the builtin function
34  std::unique_ptr<string_builtin_functiont> data;
35 
37  std::unique_ptr<string_builtin_functiont> d,
38  std::size_t i)
39  : index(i), data(std::move(d))
40  {
41  }
42 
44  : index(other.index), data(std::move(other.data))
45  {
46  }
47 
49  {
50  index = other.index;
51  data = std::move(other.data);
52  return *this;
53  }
54  };
55 
58  {
59  public:
60  // expression the node corresponds to
62  // index in the string_nodes vector
63  std::size_t index;
64  // builtin functions on which it depends, refered by there index in
65  // builtin_function node vector.
66  // \todo should these we shared pointers?
67  std::vector<std::size_t> dependencies;
68  // builtin function of which it is the result
70 
71  explicit string_nodet(array_string_exprt e, const std::size_t index)
72  : expr(std::move(e)), index(index)
73  {
74  }
75  };
76 
77  string_nodet &get_node(const array_string_exprt &e);
78 
79  std::unique_ptr<const string_nodet>
80  node_at(const array_string_exprt &e) const;
81 
82  builtin_function_nodet &
83  make_node(std::unique_ptr<string_builtin_functiont> builtin_function);
85  get_builtin_function(const builtin_function_nodet &node) const;
86 
90  void add_dependency(
91  const array_string_exprt &e,
92  const builtin_function_nodet &builtin_function);
93 
96  const string_nodet &node,
97  const std::function<void(const builtin_function_nodet &)> &f) const;
99  const builtin_function_nodet &node,
100  const std::function<void(const string_nodet &)> &f) const;
101 
107  const array_string_exprt &s,
108  const std::function<exprt(const exprt &)> &get_value) const;
109 
111  void clean_cache();
112 
113  void output_dot(std::ostream &stream) const;
114 
119  string_constraint_generatort &generatort,
120  message_handlert &message_handler);
121 
123  void clear();
124 
125 private:
127  std::vector<builtin_function_nodet> builtin_function_nodes;
128 
130  std::vector<string_nodet> string_nodes;
131 
134  std::unordered_map<array_string_exprt, std::size_t, irep_hash>
136 
137  class nodet
138  {
139  public:
140  enum
141  {
144  } kind;
145  std::size_t index;
146 
147  explicit nodet(const builtin_function_nodet &builtin)
148  : kind(BUILTIN), index(builtin.index)
149  {
150  }
151 
152  explicit nodet(const string_nodet &string_node)
153  : kind(STRING), index(string_node.index)
154  {
155  }
156 
157  bool operator==(const nodet &n) const
158  {
159  return n.kind == kind && n.index == index;
160  }
161  };
162 
164  // NOLINTNEXTLINE(readability/identifiers)
165  struct node_hash
166  {
167  size_t
168  operator()(const string_dependenciest::nodet &node) const optional_noexcept
169  {
170  return 2 * node.index +
171  (node.kind == string_dependenciest::nodet::STRING ? 0 : 1);
172  }
173  };
174 
175  mutable std::vector<optionalt<exprt>> eval_string_cache;
176 
178  void for_each_node(const std::function<void(const nodet &)> &f) const;
179 
181  void for_each_successor(
182  const nodet &i,
183  const std::function<void(const nodet &)> &f) const;
184 };
185 
204  string_dependenciest &dependencies,
205  const exprt &expr,
206  array_poolt &array_pool,
207  symbol_generatort &fresh_symbol);
208 
209 #endif // CPROVER_SOLVERS_STRINGS_STRING_DEPENDENCIES_H
string_dependenciest::node_hash::operator()
size_t operator()(const string_dependenciest::nodet &node) const
Definition: string_dependencies.h:168
string_builtin_function.h
string_dependenciest::make_node
builtin_function_nodet & make_node(std::unique_ptr< string_builtin_functiont > builtin_function)
Definition: string_dependencies.cpp:92
NODISCARD
#define NODISCARD
Definition: nodiscard.h:22
array_poolt
Correspondance between arrays and pointers string representations.
Definition: array_pool.h:41
string_dependenciest::get_builtin_function
const string_builtin_functiont & get_builtin_function(const builtin_function_nodet &node) const
Definition: string_dependencies.cpp:100
string_dependenciest::nodet::BUILTIN
@ BUILTIN
Definition: string_dependencies.h:142
string_dependenciest::string_nodet
A string node points to builtin_function on which it depends.
Definition: string_dependencies.h:57
string_dependenciest::add_constraints
string_constraintst add_constraints(string_constraint_generatort &generatort, message_handlert &message_handler)
For all builtin call on which a test (or an unsupported buitin) result depends, add the corresponding...
Definition: string_dependencies.cpp:348
nodiscard.h
exprt
Base class for all expressions.
Definition: expr.h:55
string_dependenciest::string_nodet::index
std::size_t index
Definition: string_dependencies.h:63
string_dependenciest::nodet::nodet
nodet(const string_nodet &string_node)
Definition: string_dependencies.h:152
string_constraintst
Collection of constraints of different types: existential formulas, universal formulas,...
Definition: string_constraint_generator.h:38
string_dependenciest::for_each_successor
void for_each_successor(const nodet &i, const std::function< void(const nodet &)> &f) const
Applies f on all successors of the node n.
Definition: string_dependencies.cpp:294
string_dependenciest::nodet::nodet
nodet(const builtin_function_nodet &builtin)
Definition: string_dependencies.h:147
string_dependenciest::get_node
string_nodet & get_node(const array_string_exprt &e)
Definition: string_dependencies.cpp:73
string_dependenciest::builtin_function_nodet
A builtin function node contains a builtin function call.
Definition: string_dependencies.h:28
string_constraint_generatort
Definition: string_constraint_generator.h:47
string_dependenciest::string_nodet::result_from
optionalt< std::size_t > result_from
Definition: string_dependencies.h:69
string_dependenciest::add_dependency
void add_dependency(const array_string_exprt &e, const builtin_function_nodet &builtin_function)
Add edge from node for e&#160;to node for builtin_function if e is a simple array expression.
Definition: string_dependencies.cpp:118
string_dependenciest::nodet::kind
enum string_dependenciest::nodet::@6 kind
string_dependenciest::builtin_function_nodes
std::vector< builtin_function_nodet > builtin_function_nodes
Set of nodes representing builtin_functions.
Definition: string_dependencies.h:127
string_dependenciest::nodet
Definition: string_dependencies.h:137
string_dependenciest::node_hash
Hash function for nodes.
Definition: string_dependencies.h:165
string_dependenciest::string_nodes
std::vector< string_nodet > string_nodes
Set of nodes representing strings.
Definition: string_dependencies.h:130
symbol_generatort
Generation of fresh symbols of a given type.
Definition: array_pool.h:21
string_dependenciest::for_each_node
void for_each_node(const std::function< void(const nodet &)> &f) const
Applies f on all nodes.
Definition: string_dependencies.cpp:314
string_dependenciest::clean_cache
void clean_cache()
Clean the cache used by eval
Definition: string_dependencies.cpp:191
string_dependenciest::string_nodet::string_nodet
string_nodet(array_string_exprt e, const std::size_t index)
Definition: string_dependencies.h:71
string_dependenciest::eval
optionalt< exprt > eval(const array_string_exprt &s, const std::function< exprt(const exprt &)> &get_value) const
Attempt to evaluate the given string from the dependencies and valuation of strings on which it depen...
Definition: string_dependencies.cpp:169
string_dependenciest::output_dot
void output_dot(std::ostream &stream) const
Definition: string_dependencies.cpp:323
string_dependenciest::node_at
std::unique_ptr< const string_nodet > node_at(const array_string_exprt &e) const
Definition: string_dependencies.cpp:84
message_handlert
Definition: message.h:27
string_dependenciest::node_index_pool
std::unordered_map< array_string_exprt, std::size_t, irep_hash > node_index_pool
Nodes describing dependencies of a string: values of the map correspond to indexes in the vector stri...
Definition: string_dependencies.h:135
optionalt
nonstd::optional< T > optionalt
Definition: optional.h:35
string_builtin_functiont
Base class for string functions that are built in the solver.
Definition: string_builtin_function.h:72
add_node
optionalt< exprt > add_node(string_dependenciest &dependencies, const exprt &expr, array_poolt &array_pool, symbol_generatort &fresh_symbol)
When a sub-expression of expr is a builtin_function, add a "string_builtin_function" node to the grap...
Definition: string_dependencies.cpp:198
string_dependenciest::builtin_function_nodet::builtin_function_nodet
builtin_function_nodet(std::unique_ptr< string_builtin_functiont > d, std::size_t i)
Definition: string_dependencies.h:36
string_dependenciest::eval_string_cache
std::vector< optionalt< exprt > > eval_string_cache
Definition: string_dependencies.h:175
string_dependenciest::nodet::STRING
@ STRING
Definition: string_dependencies.h:143
string_dependenciest::builtin_function_nodet::index
std::size_t index
Definition: string_dependencies.h:32
string_dependenciest::builtin_function_nodet::data
std::unique_ptr< string_builtin_functiont > data
Definition: string_dependencies.h:34
string_dependenciest::string_nodet::dependencies
std::vector< std::size_t > dependencies
Definition: string_dependencies.h:67
string_dependenciest
Keep track of dependencies between strings.
Definition: string_dependencies.h:24
string_dependenciest::builtin_function_nodet::operator=
builtin_function_nodet & operator=(builtin_function_nodet &&other)
Definition: string_dependencies.h:48
string_dependenciest::nodet::index
std::size_t index
Definition: string_dependencies.h:145
string_dependenciest::builtin_function_nodet::builtin_function_nodet
builtin_function_nodet(builtin_function_nodet &&other)
Definition: string_dependencies.h:43
string_dependenciest::string_nodet::expr
array_string_exprt expr
Definition: string_dependencies.h:61
string_dependenciest::for_each_dependency
void for_each_dependency(const string_nodet &node, const std::function< void(const builtin_function_nodet &)> &f) const
Applies f to each node on which node depends.
Definition: string_dependencies.cpp:286
string_dependenciest::nodet::operator==
bool operator==(const nodet &n) const
Definition: string_dependencies.h:157
array_string_exprt
Definition: string_expr.h:66
string_dependenciest::clear
void clear()
Clear the content of the dependency graph.
Definition: string_dependencies.cpp:128