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.h | |
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.h')
-rw-r--r-- | Source/cmConstStack.h | 39 |
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); +}; |