blob: 210833b453fd4d7e0d37b4d6bda2c46155f2c2ba [file] [log] [blame] [edit]
/* 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))
{
}