summaryrefslogtreecommitdiffstats
path: root/Source/cmConstStack.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmConstStack.h')
-rw-r--r--Source/cmConstStack.h39
1 files changed, 39 insertions, 0 deletions
diff --git a/Source/cmConstStack.h b/Source/cmConstStack.h
new file mode 100644
index 0000000..f0bca32
--- /dev/null
+++ b/Source/cmConstStack.h
@@ -0,0 +1,39 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#pragma once
+
+#include "cmConfigure.h" // IWYU pragma: keep
+
+#include <memory>
+
+/** Base class template for CRTP to represent a stack of constant values.
+ Provide value semantics, but use efficient reference-counting underneath
+ to avoid copies. */
+template <typename T, typename Stack>
+class cmConstStack
+{
+ struct Entry;
+ std::shared_ptr<Entry const> TopEntry;
+
+public:
+ /** Default-construct an empty stack. */
+ cmConstStack();
+
+ /** Get a stack with the given call context added to the top. */
+ Stack Push(T value) const;
+
+ /** Get a stack with the top level removed.
+ May not be called until after a matching Push. */
+ Stack Pop() const;
+
+ /** Get the value at the top of the stack.
+ This may be called only if Empty() would return false. */
+ T const& Top() const;
+
+ /** Return true if this stack is empty. */
+ bool Empty() const;
+
+protected:
+ cmConstStack(std::shared_ptr<Entry const> parent, T value);
+ cmConstStack(std::shared_ptr<Entry const> top);
+};