summaryrefslogtreecommitdiffstats
path: root/Source/cmConstStack.tcc
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.tcc
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.tcc')
-rw-r--r--Source/cmConstStack.tcc62
1 files changed, 62 insertions, 0 deletions
diff --git a/Source/cmConstStack.tcc b/Source/cmConstStack.tcc
new file mode 100644
index 0000000..81918ee
--- /dev/null
+++ b/Source/cmConstStack.tcc
@@ -0,0 +1,62 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+
+#include <cassert>
+#include <memory>
+#include <utility>
+
+template <typename T, typename Stack>
+struct cmConstStack<T, Stack>::Entry
+{
+ Entry(std::shared_ptr<Entry const> parent, T value)
+ : Value(std::move(value))
+ , Parent(std::move(parent))
+ {
+ }
+
+ T Value;
+ std::shared_ptr<Entry const> Parent;
+};
+
+template <typename T, typename Stack>
+cmConstStack<T, Stack>::cmConstStack() = default;
+
+template <typename T, typename Stack>
+Stack cmConstStack<T, Stack>::Push(T value) const
+{
+ return Stack(this->TopEntry, std::move(value));
+}
+
+template <typename T, typename Stack>
+Stack cmConstStack<T, Stack>::Pop() const
+{
+ assert(this->TopEntry);
+ return Stack(this->TopEntry->Parent);
+}
+
+template <typename T, typename Stack>
+T const& cmConstStack<T, Stack>::Top() const
+{
+ assert(this->TopEntry);
+ return this->TopEntry->Value;
+}
+
+template <typename T, typename Stack>
+bool cmConstStack<T, Stack>::Empty() const
+{
+ return !this->TopEntry;
+}
+
+template <typename T, typename Stack>
+cmConstStack<T, Stack>::cmConstStack(std::shared_ptr<Entry const> parent,
+ T value)
+ : TopEntry(
+ std::make_shared<Entry const>(std::move(parent), std::move(value)))
+{
+}
+
+template <typename T, typename Stack>
+cmConstStack<T, Stack>::cmConstStack(std::shared_ptr<Entry const> top)
+ : TopEntry(std::move(top))
+{
+}