/* 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 #include enum class cmStackType { Const, Mutable, }; template struct cmStackEntry; /** Base class template for CRTP to represent a stack of values. Copies of the stack share data; mutating data on one copy will change the data on all copies. */ template class cmStack { using Entry = cmStackEntry; std::shared_ptr 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 typename std::enable_if::type& Top(); /** Return true if this stack is empty. */ bool Empty() const; protected: using Base = cmStack; cmStack(std::shared_ptr parent, T value); cmStack(std::shared_ptr 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 using cmConstStack = cmStack;