diff options
author | Brad King <brad.king@kitware.com> | 2022-03-30 20:35:23 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2022-04-02 09:55:31 (GMT) |
commit | 11cc728e75d2c215abdb2e402aa50f415060fef3 (patch) | |
tree | e28ef8c26c79fd7eb4fc42e7d0e6990beb952f0b /Source/cmConstStack.tcc | |
parent | 912319375823ddd2b8ccf4f5e344cafeca73eb29 (diff) | |
download | CMake-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.tcc | 62 |
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)) +{ +} |