From 85fe26b5f742b704b51a7e15b4806366feab3a23 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 24 Nov 2015 14:42:20 -0500 Subject: 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. --- Source/cmLinkedTree.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Source/cmLinkedTree.h b/Source/cmLinkedTree.h index 93d801e..3b41459 100644 --- a/Source/cmLinkedTree.h +++ b/Source/cmLinkedTree.h @@ -152,6 +152,27 @@ public: 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() { assert(this->UpPositions.size() > 0); -- cgit v0.12