1 /********************* */
2 /*! \file equality_engine_iterator.cpp
4 ** Top contributors (to current version):
5 ** Andrew Reynolds, Dejan Jovanovic, Morgan Deters
6 ** This file is part of the CVC4 project.
7 ** Copyright (c) 2009-2020 by the authors listed in the file AUTHORS
8 ** in the top-level source directory and their institutional affiliations.
9 ** All rights reserved. See the file COPYING in the top-level source
10 ** directory for licensing information.\endverbatim
12 ** \brief Implementation of iterator class for equality engine
15 #include "theory/uf/equality_engine_iterator.h"
17 #include "theory/uf/equality_engine.h"
23 EqClassesIterator::EqClassesIterator() : d_ee(nullptr), d_it(0) {}
25 EqClassesIterator::EqClassesIterator(const eq::EqualityEngine
* ee
) : d_ee(ee
)
27 Assert(d_ee
->consistent());
29 // Go to the first non-internal node that is it's own representative
30 if (d_it
< d_ee
->d_nodesCount
31 && (d_ee
->d_isInternal
[d_it
]
32 || d_ee
->getEqualityNode(d_it
).getFind() != d_it
))
38 Node
EqClassesIterator::operator*() const { return d_ee
->d_nodes
[d_it
]; }
40 bool EqClassesIterator::operator==(const EqClassesIterator
& i
) const
42 return d_ee
== i
.d_ee
&& d_it
== i
.d_it
;
45 bool EqClassesIterator::operator!=(const EqClassesIterator
& i
) const
50 EqClassesIterator
& EqClassesIterator::operator++()
53 while (d_it
< d_ee
->d_nodesCount
54 && (d_ee
->d_isInternal
[d_it
]
55 || d_ee
->getEqualityNode(d_it
).getFind() != d_it
))
62 EqClassesIterator
EqClassesIterator::operator++(int)
64 EqClassesIterator i
= *this;
69 bool EqClassesIterator::isFinished() const
71 return d_it
>= d_ee
->d_nodesCount
;
74 EqClassIterator::EqClassIterator()
75 : d_ee(nullptr), d_start(null_id
), d_current(null_id
)
79 EqClassIterator::EqClassIterator(Node eqc
, const eq::EqualityEngine
* ee
)
82 Assert(d_ee
->consistent());
83 d_current
= d_start
= d_ee
->getNodeId(eqc
);
84 Assert(d_start
== d_ee
->getEqualityNode(d_start
).getFind());
85 Assert(!d_ee
->d_isInternal
[d_start
]);
88 Node
EqClassIterator::operator*() const { return d_ee
->d_nodes
[d_current
]; }
90 bool EqClassIterator::operator==(const EqClassIterator
& i
) const
92 return d_ee
== i
.d_ee
&& d_current
== i
.d_current
;
95 bool EqClassIterator::operator!=(const EqClassIterator
& i
) const
100 EqClassIterator
& EqClassIterator::operator++()
102 Assert(!isFinished());
104 Assert(d_start
== d_ee
->getEqualityNode(d_current
).getFind());
105 Assert(!d_ee
->d_isInternal
[d_current
]);
110 d_current
= d_ee
->getEqualityNode(d_current
).getNext();
111 } while (d_ee
->d_isInternal
[d_current
]);
113 Assert(d_start
== d_ee
->getEqualityNode(d_current
).getFind());
114 Assert(!d_ee
->d_isInternal
[d_current
]);
116 if (d_current
== d_start
)
118 // we end when we have cycled back to the original representative
124 EqClassIterator
EqClassIterator::operator++(int)
126 EqClassIterator i
= *this;
131 bool EqClassIterator::isFinished() const { return d_current
== null_id
; }
134 } // Namespace theory