sandbox
Loading...
Searching...
No Matches
registry_storage_iterator.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_ECS_DETAIL_REGISTRY_STORAGE_ITERATOR_HPP_
3#define LIBSBX_ECS_DETAIL_REGISTRY_STORAGE_ITERATOR_HPP_
4
5#include <iterator>
6#include <type_traits>
7
8#include <libsbx/utility/concepts.hpp>
9#include <libsbx/utility/iterator.hpp>
10
11#include <libsbx/memory/iterable_adaptor.hpp>
12
13namespace sbx::ecs::detail {
14
15template<typename Iterator>
17
18 template<typename Other>
19 friend class registry_storage_iterator;
20
21 template<typename Lhs, typename Rhs>
22 friend constexpr auto operator-(const registry_storage_iterator<Lhs>&, const registry_storage_iterator<Rhs>&) noexcept -> std::ptrdiff_t;
23
24 template<typename Lhs, typename Rhs>
25 friend constexpr auto operator==(const registry_storage_iterator<Lhs>&, const registry_storage_iterator<Rhs>&) noexcept -> bool;
26
27 using mapped_type = std::remove_reference_t<decltype(std::declval<Iterator>()->second)>;
28
29public:
30
31 using value_type = std::pair<std::uint32_t, utility::constness_as_t<typename mapped_type::element_type, mapped_type>&>;
33 using reference = value_type;
34 using difference_type = std::ptrdiff_t;
35 using iterator_category = std::input_iterator_tag;
36 using iterator_concept = std::random_access_iterator_tag;
37
38 constexpr registry_storage_iterator() noexcept
39 : _iterator{} { }
40
41 constexpr registry_storage_iterator(Iterator iter) noexcept
42 : _iterator{iter} { }
43
44 template<typename Other>
45 requires (!std::is_same_v<Iterator, Other> && std::is_constructible_v<Iterator, Other>)
46 constexpr registry_storage_iterator(const registry_storage_iterator<Other>& other) noexcept
47 : registry_storage_iterator{other._iterator} { }
48
49 constexpr auto operator++() noexcept -> registry_storage_iterator& {
50 ++_iterator;
51 return *this;
52 }
53
54 constexpr auto operator++(int) noexcept -> registry_storage_iterator {
55 const auto original = *this;
56 ++(*this);
57 return original;
58 }
59
60 constexpr auto operator--() noexcept -> registry_storage_iterator& {
61 --_iterator;
62 return *this;
63 }
64
65 constexpr auto operator--(int) noexcept -> registry_storage_iterator {
66 const auto original = *this;
67 --(*this);
68 return original;
69 }
70
71 constexpr auto operator+=(const difference_type value) noexcept -> registry_storage_iterator& {
72 _iterator += value;
73 return *this;
74 }
75
76 constexpr auto operator+(const difference_type value) const noexcept -> registry_storage_iterator {
77 auto copy = *this;
78 return (copy += value);
79 }
80
81 constexpr auto operator-=(const difference_type value) noexcept -> registry_storage_iterator& {
82 return (*this += -value);
83 }
84
85 constexpr auto operator-(const difference_type value) const noexcept -> registry_storage_iterator {
86 return (*this + -value);
87 }
88
89 [[nodiscard]] constexpr auto operator[](const difference_type value) const noexcept -> reference {
90 return {_iterator[value].first, *_iterator[value].second};
91 }
92
93 [[nodiscard]] constexpr auto operator*() const noexcept -> reference {
94 return operator[](0);
95 }
96
97 [[nodiscard]] constexpr auto operator->() const noexcept -> pointer {
98 return operator*();
99 }
100
101private:
102
103 Iterator _iterator;
104
105}; // class registry_storage_iterator
106
107template<typename Lhs, typename Rhs>
108[[nodiscard]] constexpr auto operator-(const registry_storage_iterator<Lhs>& lhs, const registry_storage_iterator<Rhs>& rhs) noexcept -> std::ptrdiff_t {
109 return lhs._iterator - rhs._iterator;
110}
111
112template<typename Lhs, typename Rhs>
113[[nodiscard]] constexpr auto operator==(const registry_storage_iterator<Lhs>& lhs, const registry_storage_iterator<Rhs>& rhs) noexcept -> bool {
114 return lhs._iterator == rhs._iterator;
115}
116
117} // namespace sbx::ecs::detail
118
119#endif // LIBSBX_ECS_DETAIL_REGISTRY_STORAGE_ITERATOR_HPP_
Definition: registry_storage_iterator.hpp:16
Definition: iterable_adaptor.hpp:51