@@ -70,16 +70,19 @@ void value_sett::update_entry(
70
70
auto existing_entry = values.find (index );
71
71
if (existing_entry.has_value ())
72
72
{
73
- entryt replacement = *existing_entry;
74
73
if (add_to_sets)
75
74
{
76
- if (make_union (replacement.object_map , new_values))
77
- values.replace (index , std::move (replacement));
75
+ if (make_union_would_change (existing_entry->get ().object_map , new_values))
76
+ {
77
+ values.update (index , [&new_values, this ](entryt &entry) {
78
+ make_union (entry.object_map , new_values);
79
+ });
80
+ }
78
81
}
79
82
else
80
83
{
81
- replacement. object_map = new_values;
82
- values. replace ( index , std::move (replacement) );
84
+ values. update (
85
+ index , [&new_values](entryt &entry) { entry. object_map = new_values; } );
83
86
}
84
87
}
85
88
else
@@ -90,8 +93,8 @@ void value_sett::update_entry(
90
93
}
91
94
}
92
95
93
- bool value_sett::insert (
94
- object_mapt &dest,
96
+ value_sett::insert_actiont value_sett::get_insert_action (
97
+ const object_mapt &dest,
95
98
object_numberingt::number_type n,
96
99
const offsett &offset) const
97
100
{
@@ -100,108 +103,113 @@ bool value_sett::insert(
100
103
if (entry==dest.read ().end ())
101
104
{
102
105
// new
103
- dest.write ()[n] = offset;
104
- return true ;
106
+ return insert_actiont::INSERT;
105
107
}
106
108
else if (!entry->second )
107
- return false ; // no change
109
+ return insert_actiont::NONE;
108
110
else if (offset && *entry->second == *offset)
109
- return false ; // no change
111
+ return insert_actiont::NONE;
110
112
else
111
- {
112
- dest.write ()[n].reset ();
113
- return true ;
114
- }
113
+ return insert_actiont::RESET_OFFSET;
115
114
}
116
115
117
- void value_sett::output (
118
- const namespacet &ns,
119
- std::ostream &out) const
116
+ bool value_sett::insert (
117
+ object_mapt &dest,
118
+ object_numberingt::number_type n,
119
+ const offsett &offset) const
120
120
{
121
- valuest::viewt view;
122
- values.get_view (view);
121
+ auto insert_action = get_insert_action (dest, n, offset);
122
+ if (insert_action == insert_actiont::NONE)
123
+ return false ;
123
124
124
- for (const auto &values_entry : view)
125
- {
126
- irep_idt identifier, display_name;
125
+ auto &new_offset = dest.write ()[n];
126
+ if (insert_action == insert_actiont::INSERT)
127
+ new_offset = offset;
128
+ else
129
+ new_offset.reset ();
127
130
128
- const entryt &e = values_entry.second ;
131
+ return true ;
132
+ }
133
+
134
+ void value_sett::output (const namespacet &ns, std::ostream &out) const
135
+ {
136
+ values.iterate([&](const irep_idt &, const entryt &e) {
137
+ irep_idt identifier, display_name;
129
138
130
139
if (has_prefix (id2string (e.identifier ), " value_set::dynamic_object" ))
131
140
{
132
- display_name= id2string (e.identifier )+ e.suffix ;
133
- identifier= " " ;
141
+ display_name = id2string (e.identifier ) + e.suffix ;
142
+ identifier = " " ;
134
143
}
135
- else if (e.identifier == " value_set::return_value" )
144
+ else if (e.identifier == " value_set::return_value" )
136
145
{
137
- display_name= " RETURN_VALUE" + e.suffix ;
138
- identifier= " " ;
146
+ display_name = " RETURN_VALUE" + e.suffix ;
147
+ identifier = " " ;
139
148
}
140
149
else
141
150
{
142
- #if 0
143
- const symbolt &symbol=ns.lookup(e.identifier);
144
- display_name=id2string(symbol.display_name())+e.suffix;
145
- identifier=symbol.name;
146
- #else
147
- identifier= id2string (e.identifier );
148
- display_name= id2string (identifier)+ e.suffix ;
149
- #endif
151
+ #if 0
152
+ const symbolt &symbol=ns.lookup(e.identifier);
153
+ display_name=id2string(symbol.display_name())+e.suffix;
154
+ identifier=symbol.name;
155
+ #else
156
+ identifier = id2string (e.identifier );
157
+ display_name = id2string (identifier) + e.suffix ;
158
+ #endif
150
159
}
151
160
152
161
out << display_name;
153
162
154
163
out << " = { " ;
155
164
156
- const object_map_dt &object_map= e.object_map .read ();
165
+ const object_map_dt &object_map = e.object_map .read ();
157
166
158
- std::size_t width= 0 ;
167
+ std::size_t width = 0 ;
159
168
160
- for (object_map_dt::const_iterator
161
- o_it=object_map.begin ();
162
- o_it!=object_map.end ();
169
+ for (object_map_dt::const_iterator o_it = object_map.begin ();
170
+ o_it != object_map.end ();
163
171
o_it++)
164
172
{
165
- const exprt &o= object_numbering[o_it->first ];
173
+ const exprt &o = object_numbering[o_it->first ];
166
174
167
175
std::string result;
168
176
169
- if (o.id ()== ID_invalid || o.id ()== ID_unknown)
170
- result= from_expr (ns, identifier, o);
177
+ if (o.id () == ID_invalid || o.id () == ID_unknown)
178
+ result = from_expr (ns, identifier, o);
171
179
else
172
180
{
173
- result= " <" + from_expr (ns, identifier, o)+ " , " ;
181
+ result = " <" + from_expr (ns, identifier, o) + " , " ;
174
182
175
183
if (o_it->second )
176
184
result += integer2string (*o_it->second ) + " " ;
177
185
else
178
- result+= ' *' ;
186
+ result += ' *' ;
179
187
180
188
if (o.type ().is_nil ())
181
- result+= " , ?" ;
189
+ result += " , ?" ;
182
190
else
183
- result+= " , " + from_type (ns, identifier, o.type ());
191
+ result += " , " + from_type (ns, identifier, o.type ());
184
192
185
- result+= ' >' ;
193
+ result += ' >' ;
186
194
}
187
195
188
196
out << result;
189
197
190
- width+= result.size ();
198
+ width += result.size ();
191
199
192
200
object_map_dt::const_iterator next (o_it);
193
201
next++;
194
202
195
- if (next!= object_map.end ())
203
+ if (next != object_map.end ())
196
204
{
197
205
out << " , " ;
198
- if (width>= 40 )
206
+ if (width >= 40 )
199
207
out << " \n " ;
200
208
}
201
209
}
202
210
203
211
out << " } \n " ;
204
- }
212
+ });
205
213
}
206
214
207
215
exprt value_sett::to_expr (const object_map_dt::value_type &it) const
@@ -236,10 +244,12 @@ bool value_sett::make_union(const value_sett::valuest &new_values)
236
244
{
237
245
if (delta_entry.in_both )
238
246
{
239
- entryt merged_entry = *values. find (delta_entry. k );
240
- if ( make_union (merged_entry .object_map , delta_entry.m .object_map ))
247
+ if ( make_union_would_change (
248
+ delta_entry. other_m .object_map , delta_entry.m .object_map ))
241
249
{
242
- values.replace (delta_entry.k , std::move (merged_entry));
250
+ values.update (delta_entry.k , [&](entryt &existing_entry) {
251
+ make_union (existing_entry.object_map , delta_entry.m .object_map );
252
+ });
243
253
result = true ;
244
254
}
245
255
}
@@ -253,6 +263,24 @@ bool value_sett::make_union(const value_sett::valuest &new_values)
253
263
return result;
254
264
}
255
265
266
+ bool value_sett::make_union_would_change (
267
+ const object_mapt &dest,
268
+ const object_mapt &src) const
269
+ {
270
+ for (const auto &number_and_offset : src.read ())
271
+ {
272
+ if (
273
+ get_insert_action (
274
+ dest, number_and_offset.first , number_and_offset.second ) !=
275
+ insert_actiont::NONE)
276
+ {
277
+ return true ;
278
+ }
279
+ }
280
+
281
+ return false ;
282
+ }
283
+
256
284
bool value_sett::make_union (object_mapt &dest, const object_mapt &src) const
257
285
{
258
286
bool result=false ;
0 commit comments