summaryrefslogtreecommitdiffstats
path: root/Source/cmConstStack.h
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2022-03-30 20:35:23 (GMT)
committerBrad King <brad.king@kitware.com>2022-04-02 09:55:31 (GMT)
commit11cc728e75d2c215abdb2e402aa50f415060fef3 (patch)
treee28ef8c26c79fd7eb4fc42e7d0e6990beb952f0b /Source/cmConstStack.h
parent912319375823ddd2b8ccf4f5e344cafeca73eb29 (diff)
downloadCMake-11cc728e75d2c215abdb2e402aa50f415060fef3.zip
CMake-11cc728e75d2c215abdb2e402aa50f415060fef3.tar.gz
CMake-11cc728e75d2c215abdb2e402aa50f415060fef3.tar.bz2
cmConstStack: Factor out of cmListFileBacktrace
This presents value semantics for a stack of constant values. Internally it shares ownership to avoid copies. Previously this was implemented by `cmListFileBacktrace` explicitly, but the approach can be re-used for other kinds of stacks.
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);
+};