/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #include <cassert> #include <memory> #include <utility> template <typename T, typename Stack> struct cmConstStack<T, Stack>::Entry { Entry(std::shared_ptr<Entry const> parent, T value) : Value(std::move(value)) , Parent(std::move(parent)) { } T Value; std::shared_ptr<Entry const> Parent; }; template <typename T, typename Stack> cmConstStack<T, Stack>::cmConstStack() = default; template <typename T, typename Stack> Stack cmConstStack<T, Stack>::Push(T value) const { return Stack(this->TopEntry, std::move(value)); } template <typename T, typename Stack> Stack cmConstStack<T, Stack>::Pop() const { assert(this->TopEntry); return Stack(this->TopEntry->Parent); } template <typename T, typename Stack> T const& cmConstStack<T, Stack>::Top() const { assert(this->TopEntry); return this->TopEntry->Value; } template <typename T, typename Stack> bool cmConstStack<T, Stack>::Empty() const { return !this->TopEntry; } template <typename T, typename Stack> cmConstStack<T, Stack>::cmConstStack(std::shared_ptr<Entry const> parent, T value) : TopEntry( std::make_shared<Entry const>(std::move(parent), std::move(value))) { } template <typename T, typename Stack> cmConstStack<T, Stack>::cmConstStack(std::shared_ptr<Entry const> top) : TopEntry(std::move(top)) { }