@@ -12,8 +12,6 @@ Author: Daniel Poetzl
12
12
#ifndef CPROVER_UTIL_SHARING_MAP_H
13
13
#define CPROVER_UTIL_SHARING_MAP_H
14
14
15
- // #define SM_DEBUG
16
-
17
15
#ifdef SM_DEBUG
18
16
#include < iostream>
19
17
#endif
@@ -31,22 +29,22 @@ Author: Daniel Poetzl
31
29
#include " sharing_node.h"
32
30
#include " threeval.h"
33
31
34
- // #define SM_INTERNAL_CHECKS
35
-
36
32
#ifdef SM_INTERNAL_CHECKS
37
33
#define SM_ASSERT (b ) INVARIANT(b, " Sharing map internal invariant" )
38
34
#else
39
35
#define SM_ASSERT (b )
40
36
#endif
41
37
42
- #define SHARING_MAPT (R ) \
43
- template <class keyT , class valueT , class hashT , class equalT > \
38
+ // clang-format off
39
+ #define SHARING_MAPT (R ) \
40
+ template <class keyT , class valueT , class hashT , class equalT > \
44
41
R sharing_mapt<keyT, valueT, hashT, equalT>
45
42
46
- #define SHARING_MAPT2 (CV, ST ) \
47
- template <class keyT , class valueT , class hashT , class equalT > \
48
- CV typename sharing_mapt<keyT, valueT, hashT, equalT>::ST \
43
+ #define SHARING_MAPT2 (CV, ST ) \
44
+ template <class keyT , class valueT , class hashT , class equalT > \
45
+ CV typename sharing_mapt<keyT, valueT, hashT, equalT>::ST \
49
46
sharing_mapt<keyT, valueT, hashT, equalT>
47
+ // clang-format on
50
48
51
49
// Note: Due to a bug in Visual Studio we need to add an additional "const"
52
50
// qualifier to the return values of insert(), place(), and find(). The type
@@ -299,7 +297,17 @@ class sharing_mapt
299
297
innert *get_container_node (const key_type &k);
300
298
const innert *get_container_node (const key_type &k) const ;
301
299
302
- const leaft *get_leaf_node (const key_type &k) const ;
300
+ const leaft *get_leaf_node (const key_type &k) const
301
+ {
302
+ const innert *cp = get_container_node (k);
303
+ if (cp == nullptr )
304
+ return nullptr ;
305
+
306
+ const leaft *lp;
307
+ lp = cp->find_leaf (k);
308
+
309
+ return lp;
310
+ }
303
311
304
312
void iterate(
305
313
const baset &n,
@@ -468,6 +476,13 @@ ::get_delta_view(
468
476
typedef std::tuple<unsigned , const baset *, const baset *> stack_itemt;
469
477
std::stack<stack_itemt> stack;
470
478
479
+ // We do a DFS "in lockstep" simultaneously on both maps. For
480
+ // corresponding nodes we check whether they are shared between the
481
+ // maps, and if not, we recurse into the corresponding subtrees.
482
+
483
+ // The stack contains the children of already visited nodes that we
484
+ // still have to visit during the traversal.
485
+
471
486
stack.push (stack_itemt (0 , &map, &other.map ));
472
487
473
488
do
@@ -543,11 +558,9 @@ SHARING_MAPT2(, innert *)::get_container_node(const key_type &k)
543
558
std::size_t key = hash ()(k);
544
559
innert *ip = ↦
545
560
546
- std::size_t bit;
547
-
548
561
for (std::size_t i = 0 ; i < steps; i++)
549
562
{
550
- bit = key & mask;
563
+ std:: size_t bit = key & mask;
551
564
552
565
ip = ip->add_child (bit);
553
566
@@ -565,11 +578,9 @@ SHARING_MAPT2(const, innert *)::get_container_node(const key_type &k) const
565
578
std::size_t key = hash ()(k);
566
579
const innert *ip = ↦
567
580
568
- std::size_t bit;
569
-
570
581
for (std::size_t i = 0 ; i < steps; i++)
571
582
{
572
- bit = key & mask;
583
+ std:: size_t bit = key & mask;
573
584
574
585
ip = ip->find_child (bit);
575
586
if (ip == nullptr )
@@ -581,18 +592,6 @@ SHARING_MAPT2(const, innert *)::get_container_node(const key_type &k) const
581
592
return ip;
582
593
}
583
594
584
- SHARING_MAPT2 (const , leaft *)::get_leaf_node(const key_type &k) const
585
- {
586
- const innert *cp = get_container_node (k);
587
- if (cp == nullptr )
588
- return nullptr ;
589
-
590
- const leaft *lp;
591
- lp = cp->find_leaf (k);
592
-
593
- return lp;
594
- }
595
-
596
595
// / Erase element
597
596
// /
598
597
// / Complexity:
@@ -618,11 +617,9 @@ SHARING_MAPT2(, size_type)::erase(const key_type &k, const tvt &key_exists)
618
617
std::size_t key = hash ()(k);
619
618
innert *ip = ↦
620
619
621
- std::size_t bit;
622
-
623
620
for (std::size_t i = 0 ; i < steps; i++)
624
621
{
625
- bit = key & mask;
622
+ std:: size_t bit = key & mask;
626
623
627
624
const to_mapt &m = as_const (ip)->get_to_map ();
628
625
0 commit comments