cmLinkedTree: Add Pop method

Add a method to increment an iterator (follow the "up" pointer) to the
previous level in the stack of scopes and free storage of the top of the
stack if possible.  This will allow short-lived scopes to be created and
destroyed by matching Push/Pop pairs without accumulating storage.
This commit is contained in:
Brad King 2015-11-24 14:42:20 -05:00
parent 518d6b22f6
commit 85fe26b5f7
1 changed files with 21 additions and 0 deletions

View File

@ -152,6 +152,27 @@ public:
return Push_impl(it, t); return Push_impl(it, t);
} }
bool IsLast(iterator it)
{
return it.Position == this->Data.size();
}
iterator Pop(iterator it)
{
assert(!this->Data.empty());
assert(this->UpPositions.size() == this->Data.size());
bool const isLast = this->IsLast(it);
++it;
// If this is the last entry then no other entry can refer
// to it so we can drop its storage.
if (isLast)
{
this->Data.pop_back();
this->UpPositions.pop_back();
}
return it;
}
iterator Truncate() iterator Truncate()
{ {
assert(this->UpPositions.size() > 0); assert(this->UpPositions.size() > 0);