range.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #ifndef ENTT_META_RANGE_HPP
  2. #define ENTT_META_RANGE_HPP
  3. #include <cstddef>
  4. #include <iterator>
  5. #include <utility>
  6. #include "../core/fwd.hpp"
  7. #include "../core/iterator.hpp"
  8. namespace entt {
  9. /**
  10. * @cond TURN_OFF_DOXYGEN
  11. * Internal details not to be documented.
  12. */
  13. namespace internal {
  14. template<typename Type, typename Node>
  15. struct old_meta_range_iterator final {
  16. using difference_type = std::ptrdiff_t;
  17. using value_type = Type;
  18. using pointer = input_iterator_pointer<value_type>;
  19. using reference = value_type;
  20. using iterator_category = std::input_iterator_tag;
  21. using node_type = Node;
  22. old_meta_range_iterator() noexcept
  23. : it{} {}
  24. old_meta_range_iterator(node_type *head) noexcept
  25. : it{head} {}
  26. old_meta_range_iterator &operator++() noexcept {
  27. return (it = it->next), *this;
  28. }
  29. old_meta_range_iterator operator++(int) noexcept {
  30. old_meta_range_iterator orig = *this;
  31. return ++(*this), orig;
  32. }
  33. [[nodiscard]] reference operator*() const noexcept {
  34. return it;
  35. }
  36. [[nodiscard]] pointer operator->() const noexcept {
  37. return operator*();
  38. }
  39. [[nodiscard]] bool operator==(const old_meta_range_iterator &other) const noexcept {
  40. return it == other.it;
  41. }
  42. [[nodiscard]] bool operator!=(const old_meta_range_iterator &other) const noexcept {
  43. return !(*this == other);
  44. }
  45. private:
  46. node_type *it;
  47. };
  48. template<typename Type, typename It>
  49. struct meta_range_iterator final {
  50. using difference_type = std::ptrdiff_t;
  51. using value_type = std::pair<id_type, Type>;
  52. using pointer = input_iterator_pointer<value_type>;
  53. using reference = value_type;
  54. using iterator_category = std::input_iterator_tag;
  55. meta_range_iterator() noexcept
  56. : it{} {}
  57. meta_range_iterator(It iter) noexcept
  58. : it{iter} {}
  59. meta_range_iterator &operator++() noexcept {
  60. return ++it, *this;
  61. }
  62. meta_range_iterator operator++(int) noexcept {
  63. meta_range_iterator orig = *this;
  64. return ++(*this), orig;
  65. }
  66. [[nodiscard]] reference operator*() const noexcept {
  67. return std::make_pair(it->first, &it->second);
  68. }
  69. [[nodiscard]] pointer operator->() const noexcept {
  70. return operator*();
  71. }
  72. [[nodiscard]] bool operator==(const meta_range_iterator &other) const noexcept {
  73. return it == other.it;
  74. }
  75. [[nodiscard]] bool operator!=(const meta_range_iterator &other) const noexcept {
  76. return !(*this == other);
  77. }
  78. private:
  79. It it;
  80. };
  81. } // namespace internal
  82. /**
  83. * Internal details not to be documented.
  84. * @endcond
  85. */
  86. /**
  87. * @brief Iterable range to use to iterate all types of meta objects.
  88. * @tparam Type Type of meta objects returned.
  89. * @tparam Node Type of meta nodes iterated.
  90. */
  91. template<typename Type, typename Node = typename Type::node_type>
  92. using old_meta_range = iterable_adaptor<internal::old_meta_range_iterator<Type, Node>>;
  93. /**
  94. * @brief Iterable range to use to iterate all types of meta objects.
  95. * @tparam Type Type of meta objects returned.
  96. * @tparam It Type of forward iterator.
  97. */
  98. template<typename Type, typename It>
  99. using meta_range = iterable_adaptor<internal::meta_range_iterator<Type, It>>;
  100. } // namespace entt
  101. #endif