feat(util/scoped_map): add 'keep' method for closing a scope without undoing operations
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
5aca452439
commit
b347117cf3
2 changed files with 44 additions and 0 deletions
|
@ -56,7 +56,39 @@ static void tst1() {
|
||||||
lean_assert(s.find(30) == s.end());
|
lean_assert(s.find(30) == s.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tst2() {
|
||||||
|
scoped_map<int, int> s;
|
||||||
|
s.push();
|
||||||
|
s.insert(10, 20);
|
||||||
|
lean_assert(s.find(10)->second == 20);
|
||||||
|
lean_assert(s.contains(10));
|
||||||
|
s.pop();
|
||||||
|
lean_assert(!s.contains(10));
|
||||||
|
s.push();
|
||||||
|
s.insert(10, 30);
|
||||||
|
lean_assert(s.find(10)->second == 30);
|
||||||
|
lean_assert(s.num_scopes() == 1);
|
||||||
|
s.keep();
|
||||||
|
lean_assert(s.num_scopes() == 0);
|
||||||
|
lean_assert(s.find(10)->second == 30);
|
||||||
|
s.push();
|
||||||
|
s.push();
|
||||||
|
s.insert(1, 3);
|
||||||
|
lean_assert(s.num_scopes() == 2);
|
||||||
|
lean_assert(s.find(1)->second == 3);
|
||||||
|
s.keep();
|
||||||
|
lean_assert(s.find(1)->second == 3);
|
||||||
|
lean_assert(s.num_scopes() == 1);
|
||||||
|
lean_assert(s.size() == 2);
|
||||||
|
s.pop();
|
||||||
|
lean_assert(!s.contains(1));
|
||||||
|
lean_assert(s.num_scopes() == 0);
|
||||||
|
lean_assert(s.find(10)->second == 30);
|
||||||
|
lean_assert(s.size() == 1);
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
tst1();
|
tst1();
|
||||||
|
tst2();
|
||||||
return has_violations() ? 1 : 0;
|
return has_violations() ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,6 +93,14 @@ public:
|
||||||
m_scopes.resize(num_scopes() - num);
|
m_scopes.resize(num_scopes() - num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** \brief Remove the top scope without 'undoing' the operations. */
|
||||||
|
void keep() {
|
||||||
|
lean_assert(num_scopes() > 0);
|
||||||
|
m_scopes.pop_back();
|
||||||
|
if (at_base_lvl())
|
||||||
|
m_actions.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief Return true iff the map is empty */
|
/** \brief Return true iff the map is empty */
|
||||||
bool empty() const {
|
bool empty() const {
|
||||||
return m_map.empty();
|
return m_map.empty();
|
||||||
|
@ -151,6 +159,10 @@ public:
|
||||||
return m_map.end();
|
return m_map.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool contains(Key const & k) const {
|
||||||
|
return find(k) != end();
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief (For debugging) Display the content of this scoped map. */
|
/** \brief (For debugging) Display the content of this scoped map. */
|
||||||
friend std::ostream & operator<<(std::ostream & out, scoped_map const & m) {
|
friend std::ostream & operator<<(std::ostream & out, scoped_map const & m) {
|
||||||
out << "{";
|
out << "{";
|
||||||
|
|
Loading…
Reference in a new issue