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