2
2
// SPDX-License-Identifier: Apache-2.0
3
3
#pragma once
4
4
5
- #include < memory>
6
-
7
5
#include < boost/container/flat_map.hpp>
8
6
9
7
#include " crab_utils/num_safeint.hpp"
@@ -31,11 +29,11 @@ class TreeSMap final {
31
29
key_iter_t () = default ;
32
30
explicit key_iter_t (const col::const_iterator& _e) : e(_e) {}
33
31
34
- // XXX: to make sure that we always return the same address
35
- // for the "empty" iterator, otherwise we can trigger
36
- // undefined behavior.
37
- inline static std::unique_ptr< key_iter_t > _empty_iter = std::make_unique< key_iter_t >() ;
38
- static key_iter_t empty_iterator () { return *_empty_iter; }
32
+ // / return canonical empty iterator
33
+ static key_iter_t empty_iterator () {
34
+ static key_iter_t empty_iter;
35
+ return empty_iter ;
36
+ }
39
37
40
38
key_t operator *() const { return e->first ; }
41
39
bool operator !=(const key_iter_t & o) const { return e != o.e ; }
@@ -142,8 +140,6 @@ class TreeSMap final {
142
140
143
141
// Adaptive sparse-set based weighted graph implementation
144
142
class AdaptGraph final {
145
- using smap_t = TreeSMap;
146
-
147
143
public:
148
144
/* * DBM weights (Weight) can be represented using one of the following
149
145
* types:
@@ -233,19 +229,19 @@ class AdaptGraph final {
233
229
Weight val;
234
230
};
235
231
236
- smap_t ::elt_iter_t it{};
232
+ TreeSMap ::elt_iter_t it{};
237
233
const std::vector<Weight>* ws{};
238
234
239
- edge_const_iter (const smap_t ::elt_iter_t & _it, const std::vector<Weight>& _ws) : it(_it), ws(&_ws) {}
235
+ edge_const_iter (const TreeSMap ::elt_iter_t & _it, const std::vector<Weight>& _ws) : it(_it), ws(&_ws) {}
240
236
edge_const_iter (const edge_const_iter& o) = default ;
241
237
edge_const_iter& operator =(const edge_const_iter& o) = default ;
242
238
edge_const_iter () = default ;
243
239
244
- // XXX: to make sure that we always return the same address
245
- // for the "empty" iterator, otherwise we can trigger
246
- // undefined behavior.
247
- inline static std::unique_ptr<edge_const_iter> _empty_iter = std::make_unique<edge_const_iter>() ;
248
- static edge_const_iter empty_iterator () { return *_empty_iter; }
240
+ // / return canonical empty iterator
241
+ static edge_const_iter empty_iterator () {
242
+ static edge_const_iter empty_iter;
243
+ return empty_iter ;
244
+ }
249
245
250
246
edge_ref operator *() const { return edge_ref{it->first , (*ws)[it->second ]}; }
251
247
edge_const_iter operator ++() {
@@ -256,7 +252,7 @@ class AdaptGraph final {
256
252
};
257
253
258
254
struct edge_const_range_t {
259
- using elt_range_t = smap_t ::elt_range_t ;
255
+ using elt_range_t = TreeSMap ::elt_range_t ;
260
256
using iterator = edge_const_iter;
261
257
262
258
elt_range_t r;
@@ -279,8 +275,8 @@ class AdaptGraph final {
279
275
using fwd_edge_const_iter = edge_const_iter;
280
276
using rev_edge_const_iter = edge_const_iter;
281
277
282
- using adj_range_t = smap_t ::key_const_range_t ;
283
- using adj_const_range_t = smap_t ::key_const_range_t ;
278
+ using adj_range_t = TreeSMap ::key_const_range_t ;
279
+ using adj_const_range_t = TreeSMap ::key_const_range_t ;
284
280
using neighbour_range = adj_range_t ;
285
281
using neighbour_const_range = adj_const_range_t ;
286
282
@@ -357,7 +353,7 @@ class AdaptGraph final {
357
353
edge_count -= _succs[v].size ();
358
354
_succs[v].clear ();
359
355
360
- for (smap_t ::key_t k : _preds[v].keys ()) {
356
+ for (TreeSMap ::key_t k : _preds[v].keys ()) {
361
357
_succs[k].remove (v);
362
358
}
363
359
edge_count -= _preds[v].size ();
@@ -492,8 +488,8 @@ class AdaptGraph final {
492
488
493
489
// Ick. This'll have another indirection on every operation.
494
490
// We'll see what the performance costs are like.
495
- std::vector<smap_t > _preds{};
496
- std::vector<smap_t > _succs{};
491
+ std::vector<TreeSMap > _preds{};
492
+ std::vector<TreeSMap > _succs{};
497
493
std::vector<Weight> _ws{};
498
494
499
495
size_t edge_count{};
0 commit comments