| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file LICENSE.rst or https://cmake.org/licensing for details. */ | |
| #pragma once | |
| #include "cmConfigure.h" // IWYU pragma: keep | |
| #include <memory> | |
| #include <type_traits> | |
| enum class cmStackType | |
| { | |
| Const, | |
| Mutable, | |
| }; | |
| template <typename T, cmStackType Mutable> | |
| struct cmStackEntry; | |
| /** Base class template for CRTP to represent a stack of values. | |
| Copies of the stack <i>share data</i>; mutating data on one copy will | |
| change the data on <i>all</i> copies. */ | |
| template <typename T, typename Stack, | |
| cmStackType Mutable = cmStackType::Mutable> | |
| class cmStack | |
| { | |
| using Entry = cmStackEntry<T, Mutable>; | |
| std::shared_ptr<Entry const> TopEntry; | |
| public: | |
| /** Default-construct an empty stack. */ | |
| cmStack(); | |
| /** 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; | |
| template <bool E = (Mutable == cmStackType::Mutable)> | |
| typename std::enable_if<E, T>::type& Top(); | |
| /** Return true if this stack is empty. */ | |
| bool Empty() const; | |
| protected: | |
| using Base = cmStack<T, Stack, Mutable>; | |
| cmStack(std::shared_ptr<Entry const> parent, T value); | |
| cmStack(std::shared_ptr<Entry const> top); | |
| }; | |
| /** Specialization of cmStack 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> | |
| using cmConstStack = cmStack<T const, Stack, cmStackType::Const>; |