/* 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 /** 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 class cmConstStack { struct Entry; std::shared_ptr 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 parent, T value); cmConstStack(std::shared_ptr top); };