cmStack.tcc 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file LICENSE.rst or https://cmake.org/licensing for details. */
  3. #include <cassert>
  4. #include <memory>
  5. #include <utility>
  6. template <typename T>
  7. struct cmStackEntry<T, cmStackType::Mutable>
  8. {
  9. cmStackEntry(std::shared_ptr<cmStackEntry const> parent, T value)
  10. : Value(std::move(value))
  11. , Parent(std::move(parent))
  12. {
  13. }
  14. T mutable Value;
  15. std::shared_ptr<cmStackEntry const> Parent;
  16. };
  17. template <typename T>
  18. struct cmStackEntry<T, cmStackType::Const>
  19. {
  20. cmStackEntry(std::shared_ptr<cmStackEntry const> parent, T value)
  21. : Value(std::move(value))
  22. , Parent(std::move(parent))
  23. {
  24. }
  25. T Value;
  26. std::shared_ptr<cmStackEntry const> Parent;
  27. };
  28. template <typename T, typename Stack, cmStackType Mutable>
  29. cmStack<T, Stack, Mutable>::cmStack() = default;
  30. template <typename T, typename Stack, cmStackType Mutable>
  31. Stack cmStack<T, Stack, Mutable>::Push(T value) const
  32. {
  33. return Stack(this->TopEntry, std::move(value));
  34. }
  35. template <typename T, typename Stack, cmStackType Mutable>
  36. Stack cmStack<T, Stack, Mutable>::Pop() const
  37. {
  38. assert(this->TopEntry);
  39. return Stack(this->TopEntry->Parent);
  40. }
  41. template <typename T, typename Stack, cmStackType Mutable>
  42. T const& cmStack<T, Stack, Mutable>::Top() const
  43. {
  44. assert(this->TopEntry);
  45. return this->TopEntry->Value;
  46. }
  47. template <typename T, typename Stack, cmStackType Mutable>
  48. template <bool E>
  49. typename std::enable_if<E, T>::type& cmStack<T, Stack, Mutable>::Top()
  50. {
  51. static_assert(Mutable == cmStackType::Mutable,
  52. "T& cmStack::Top should only exist for mutable cmStack");
  53. assert(this->TopEntry);
  54. return this->TopEntry->Value;
  55. }
  56. template <typename T, typename Stack, cmStackType Mutable>
  57. bool cmStack<T, Stack, Mutable>::Empty() const
  58. {
  59. return !this->TopEntry;
  60. }
  61. template <typename T, typename Stack, cmStackType Mutable>
  62. cmStack<T, Stack, Mutable>::cmStack(std::shared_ptr<Entry const> parent,
  63. T value)
  64. : TopEntry(
  65. std::make_shared<Entry const>(std::move(parent), std::move(value)))
  66. {
  67. }
  68. template <typename T, typename Stack, cmStackType Mutable>
  69. cmStack<T, Stack, Mutable>::cmStack(std::shared_ptr<Entry const> top)
  70. : TopEntry(std::move(top))
  71. {
  72. }