Skip to content

Commit a99b254

Browse files
committed
Indirect value_set_domaint -> value_sett operations via non-member functions
These provide an oportunity for future implementers of value-sets not to have to conform to the same public interface as value_sett, e.g. to provide some type they can't or don't want to augment and provide non-member function specialisations instead.
1 parent e669c12 commit a99b254

File tree

1 file changed

+82
-10
lines changed

1 file changed

+82
-10
lines changed

src/pointer-analysis/value_set_domain.h

+82-10
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,77 @@ Author: Daniel Kroening, [email protected]
1717

1818
#include "value_set.h"
1919

20+
template<class> class value_set_domaint;
21+
22+
// Forwarders for value_set_domaint's calls against value_sett.
23+
// Specialise these if for some reason you can't just write a member function,
24+
// or for location numbers, expose the field.
25+
template<typename VST>
26+
inline bool value_set_make_union(VST &value_set, const VST &other)
27+
{
28+
return value_set.make_union(other);
29+
}
30+
31+
template<typename VST>
32+
inline void value_set_output(
33+
const VST &value_set, const namespacet &ns, std::ostream &out)
34+
{
35+
value_set.output(ns, out);
36+
}
37+
38+
template<typename VST>
39+
inline void value_set_clear(VST &value_set)
40+
{
41+
value_set.clear();
42+
}
43+
44+
template<typename VST>
45+
inline void value_set_set_location_number(VST &value_set, unsigned loc)
46+
{
47+
value_set.location_number=loc;
48+
}
49+
50+
template<typename VST>
51+
inline void value_set_read_reference_set(
52+
const VST &value_set,
53+
const exprt &expr,
54+
value_setst::valuest &dest,
55+
const namespacet &ns)
56+
{
57+
value_set.read_reference_set(expr, dest, ns);
58+
}
59+
60+
template<typename VST>
61+
inline void value_set_do_end_function(
62+
VST &value_set, const exprt &return_expr, const namespacet &ns)
63+
{
64+
value_set.do_end_function(return_expr, ns);
65+
}
66+
67+
template<typename VST>
68+
inline void value_set_apply_code(
69+
VST &value_set, const codet &code, const namespacet &ns)
70+
{
71+
value_set.apply_code(code, ns);
72+
}
73+
74+
template<typename VST>
75+
inline void value_set_guard(
76+
VST &value_set, const exprt &guard, const namespacet &ns)
77+
{
78+
value_set.guard(guard, ns);
79+
}
80+
81+
template<typename VST>
82+
inline void value_set_do_function_call(
83+
VST &value_set,
84+
const irep_idt &function,
85+
const exprt::operandst &arguments,
86+
const namespacet &ns)
87+
{
88+
value_set.do_function_call(function, arguments, ns);
89+
}
90+
2091
template<class VST>
2192
class value_set_domaint:public domain_baset
2293
{
@@ -25,23 +96,23 @@ class value_set_domaint:public domain_baset
2596

2697
// overloading
2798

28-
bool merge(const value_set_domaint &other, locationt to)
99+
bool merge(const value_set_domaint<VST> &other, locationt to)
29100
{
30-
return value_set.make_union(other.value_set);
101+
return value_set_make_union(value_set, other.value_set);
31102
}
32103

33104
virtual void output(
34105
const namespacet &ns,
35106
std::ostream &out) const
36107
{
37-
value_set.output(ns, out);
108+
value_set_output(value_set, ns, out);
38109
}
39110

40111
virtual void initialize(
41112
const namespacet &ns,
42113
locationt l)
43114
{
44-
value_set.clear();
115+
value_set_clear(value_set);
45116
value_set.location_number=l->location_number;
46117
}
47118

@@ -50,7 +121,7 @@ class value_set_domaint:public domain_baset
50121
const exprt &expr,
51122
value_setst::valuest &dest)
52123
{
53-
value_set.read_reference_set(expr, dest, ns);
124+
value_set_read_reference_set(value_set, expr, dest, ns);
54125
}
55126

56127
virtual void transform(
@@ -66,8 +137,8 @@ class value_set_domaint:public domain_baset
66137

67138
case END_FUNCTION:
68139
{
69-
value_set.do_end_function(
70-
static_analysis_baset::get_return_lhs(to_l), ns);
140+
value_set_do_end_function(
141+
value_set, static_analysis_baset::get_return_lhs(to_l), ns);
71142
break;
72143
}
73144

@@ -77,19 +148,20 @@ class value_set_domaint:public domain_baset
77148
case ASSIGN:
78149
case DECL:
79150
case DEAD:
80-
value_set.apply_code(from_l->code, ns);
151+
value_set_apply_code(value_set, from_l->code, ns);
81152
break;
82153

83154
case ASSUME:
84-
value_set.guard(from_l->guard, ns);
155+
value_set_guard(value_set, from_l->guard, ns);
85156
break;
86157

87158
case FUNCTION_CALL:
88159
{
89160
const code_function_callt &code=
90161
to_code_function_call(from_l->code);
91162

92-
value_set.do_function_call(to_l->function, code.arguments(), ns);
163+
value_set_do_function_call(
164+
value_set, to_l->function, code.arguments(), ns);
93165
}
94166
break;
95167

0 commit comments

Comments
 (0)