| /* 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); |
| }; |