sandbox
Loading...
Searching...
No Matches
sparse_set_iterator.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_ECS_DETAIL_SPARSE_SET_ITERATOR_HPP_
3#define LIBSBX_ECS_DETAIL_SPARSE_SET_ITERATOR_HPP_
4
5#include <utility>
6
7namespace sbx::ecs::detail {
8
9template<typename Container>
11
12public:
13
14 using value_type = typename Container::value_type;
15 using pointer = typename Container::const_pointer;
16 using reference = typename Container::const_reference;
17 using difference_type = typename Container::difference_type;
18 using iterator_category = std::random_access_iterator_tag;
19
20 constexpr sparse_set_iterator() noexcept
21 : _dense{},
22 _offset{} {}
23
24 constexpr sparse_set_iterator(const Container& dense, const difference_type offset) noexcept
25 : _dense{&dense},
26 _offset{offset} {}
27
28 constexpr auto operator++() noexcept -> sparse_set_iterator& {
29 --_offset;
30 return *this;
31 }
32
33 constexpr auto operator++(int) noexcept -> sparse_set_iterator {
34 const auto original = *this;
35 ++(*this);
36 return original;
37 }
38
39 constexpr auto operator--() noexcept -> sparse_set_iterator& {
40 ++_offset;
41 return *this;
42 }
43
44 constexpr sparse_set_iterator operator--(int) noexcept {
45 const auto original = *this;
46 --(*this);
47 return original;
48 }
49
50 constexpr auto operator+=(const difference_type value) noexcept -> sparse_set_iterator& {
51 _offset -= value;
52 return *this;
53 }
54
55 constexpr auto operator+(const difference_type value) const noexcept -> sparse_set_iterator {
56 auto copy = *this;
57 return (copy += value);
58 }
59
60 constexpr auto operator-=(const difference_type value) noexcept -> sparse_set_iterator& {
61 return (*this += -value);
62 }
63
64 constexpr auto operator-(const difference_type value) const noexcept -> sparse_set_iterator {
65 return (*this + -value);
66 }
67
68 [[nodiscard]] constexpr auto operator[](const difference_type value) const noexcept -> reference {
69 return (*_dense)[static_cast<typename Container::size_type>(index() - value)];
70 }
71
72 [[nodiscard]] constexpr auto operator->() const noexcept -> pointer {
73 return std::addressof(operator[](0));
74 }
75
76 [[nodiscard]] constexpr auto operator*() const noexcept -> reference {
77 return operator[](0);
78 }
79
80 [[nodiscard]] constexpr auto data() const noexcept -> pointer {
81 return _dense ? _dense->data() : nullptr;
82 }
83
84 [[nodiscard]] constexpr auto index() const noexcept -> difference_type {
85 return _offset - 1;
86 }
87
88private:
89
90 const Container* _dense;
91 difference_type _offset;
92
93}; // struct sparse_set_iterator
94
95template<typename Container>
96[[nodiscard]] constexpr auto operator-(const sparse_set_iterator<Container> &lhs, const sparse_set_iterator<Container> &rhs) noexcept -> std::ptrdiff_t {
97 return rhs.index() - lhs.index();
98}
99
100template<typename Container>
101[[nodiscard]] constexpr auto operator==(const sparse_set_iterator<Container> &lhs, const sparse_set_iterator<Container> &rhs) noexcept -> bool {
102 return lhs.index() == rhs.index();
103}
104
105template<typename Container>
106[[nodiscard]] constexpr auto operator!=(const sparse_set_iterator<Container> &lhs, const sparse_set_iterator<Container> &rhs) noexcept -> bool {
107 return !(lhs == rhs);
108}
109
110template<typename Container>
111[[nodiscard]] constexpr auto operator<(const sparse_set_iterator<Container> &lhs, const sparse_set_iterator<Container> &rhs) noexcept -> bool {
112 return lhs.index() > rhs.index();
113}
114
115template<typename Container>
116[[nodiscard]] constexpr auto operator>(const sparse_set_iterator<Container> &lhs, const sparse_set_iterator<Container> &rhs) noexcept -> bool {
117 return rhs < lhs;
118}
119
120template<typename Container>
121[[nodiscard]] constexpr auto operator<=(const sparse_set_iterator<Container> &lhs, const sparse_set_iterator<Container> &rhs) noexcept -> bool {
122 return !(lhs > rhs);
123}
124
125template<typename Container>
126[[nodiscard]] constexpr auto operator>=(const sparse_set_iterator<Container> &lhs, const sparse_set_iterator<Container> &rhs) noexcept -> bool {
127 return !(lhs < rhs);
128}
129
130} // namespace sbx::ecs
131
132#endif // LIBSBX_ECS_DETAIL_SPARSE_SET_ITERATOR_HPP_
Definition: sparse_set_iterator.hpp:10