| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file LICENSE.rst or https://cmake.org/licensing for details. */ |
| |
| #include <cassert> |
| #include <memory> |
| #include <utility> |
| |
| template <typename T> |
| struct cmStackEntry<T, cmStackType::Mutable> |
| { |
| cmStackEntry(std::shared_ptr<cmStackEntry const> parent, T value) |
| : Value(std::move(value)) |
| , Parent(std::move(parent)) |
| { |
| } |
| |
| T mutable Value; |
| std::shared_ptr<cmStackEntry const> Parent; |
| }; |
| |
| template <typename T> |
| struct cmStackEntry<T, cmStackType::Const> |
| { |
| cmStackEntry(std::shared_ptr<cmStackEntry const> parent, T value) |
| : Value(std::move(value)) |
| , Parent(std::move(parent)) |
| { |
| } |
| |
| T Value; |
| std::shared_ptr<cmStackEntry const> Parent; |
| }; |
| |
| template <typename T, typename Stack, cmStackType Mutable> |
| cmStack<T, Stack, Mutable>::cmStack() = default; |
| |
| template <typename T, typename Stack, cmStackType Mutable> |
| Stack cmStack<T, Stack, Mutable>::Push(T value) const |
| { |
| return Stack(this->TopEntry, std::move(value)); |
| } |
| |
| template <typename T, typename Stack, cmStackType Mutable> |
| Stack cmStack<T, Stack, Mutable>::Pop() const |
| { |
| assert(this->TopEntry); |
| return Stack(this->TopEntry->Parent); |
| } |
| |
| template <typename T, typename Stack, cmStackType Mutable> |
| T const& cmStack<T, Stack, Mutable>::Top() const |
| { |
| assert(this->TopEntry); |
| return this->TopEntry->Value; |
| } |
| |
| template <typename T, typename Stack, cmStackType Mutable> |
| template <bool E> |
| typename std::enable_if<E, T>::type& cmStack<T, Stack, Mutable>::Top() |
| { |
| static_assert(Mutable == cmStackType::Mutable, |
| "T& cmStack::Top should only exist for mutable cmStack"); |
| assert(this->TopEntry); |
| return this->TopEntry->Value; |
| } |
| |
| template <typename T, typename Stack, cmStackType Mutable> |
| bool cmStack<T, Stack, Mutable>::Empty() const |
| { |
| return !this->TopEntry; |
| } |
| |
| template <typename T, typename Stack, cmStackType Mutable> |
| cmStack<T, Stack, Mutable>::cmStack(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, cmStackType Mutable> |
| cmStack<T, Stack, Mutable>::cmStack(std::shared_ptr<Entry const> top) |
| : TopEntry(std::move(top)) |
| { |
| } |