EnTT 4.0.0
Loading...
Searching...
No Matches
iterator.hpp
1#ifndef ENTT_CORE_ITERATOR_HPP
2#define ENTT_CORE_ITERATOR_HPP
3
4#include "../stl/concepts.hpp"
5#include "../stl/cstddef.hpp"
6#include "../stl/iterator.hpp"
7#include "../stl/memory.hpp"
8#include "../stl/type_traits.hpp"
9#include "../stl/utility.hpp"
10
11namespace entt {
12
17template<typename Type>
20 using value_type = Type;
22 using pointer = Type *;
24 using reference = Type &;
25
30 constexpr input_iterator_pointer(value_type &&val) noexcept(stl::is_nothrow_move_constructible_v<value_type>)
31 : value{stl::move(val)} {}
32
37 [[nodiscard]] constexpr pointer operator->() noexcept {
38 return stl::addressof(value);
39 }
40
45 [[nodiscard]] constexpr reference operator*() noexcept {
46 return value;
47 }
48
49private:
50 Type value;
51};
52
57template<stl::integral Type>
58struct iota_iterator final {
60 using value_type = Type;
62 using pointer = void;
66 using difference_type = stl::ptrdiff_t;
68 using iterator_category = stl::input_iterator_tag;
69
71 constexpr iota_iterator() noexcept
72 : current{} {}
73
78 constexpr iota_iterator(const value_type init) noexcept
79 : current{init} {}
80
85 constexpr iota_iterator &operator++() noexcept {
86 return ++current, *this;
87 }
88
93 constexpr iota_iterator operator++(int) noexcept {
94 const iota_iterator orig = *this;
95 return ++(*this), orig;
96 }
97
102 [[nodiscard]] constexpr reference operator*() const noexcept {
103 return current;
104 }
105
111 [[nodiscard]] constexpr bool operator==(const iota_iterator &other) const noexcept {
112 return current == other.current;
113 }
114
115private:
116 value_type current;
117};
118
124template<stl::input_or_output_iterator It, stl::sentinel_for<It> Sentinel = It>
125struct iterable_adaptor final {
127 using value_type = stl::iterator_traits<It>::value_type;
129 using iterator = It;
131 using sentinel = Sentinel;
132
134 constexpr iterable_adaptor() noexcept(stl::is_nothrow_default_constructible_v<iterator> && stl::is_nothrow_default_constructible_v<sentinel>)
135 : first{},
136 last{} {}
137
143 constexpr iterable_adaptor(iterator from, sentinel to) noexcept(stl::is_nothrow_move_constructible_v<iterator> && stl::is_nothrow_move_constructible_v<sentinel>)
144 : first{stl::move(from)},
145 last{stl::move(to)} {}
146
151 [[nodiscard]] constexpr iterator begin() const noexcept {
152 return first;
153 }
154
160 [[nodiscard]] constexpr sentinel end() const noexcept {
161 return last;
162 }
163
165 [[nodiscard]] constexpr iterator cbegin() const noexcept {
166 return begin();
167 }
168
170 [[nodiscard]] constexpr sentinel cend() const noexcept {
171 return end();
172 }
173
174private:
175 It first;
176 Sentinel last;
177};
178
179} // namespace entt
180
181#endif
Custom EnTT namespace for the standard template library.
Definition entt.hpp:5
EnTT default namespace.
Definition dense_map.hpp:25
constexpr input_iterator_pointer(value_type &&val) noexcept(stl::is_nothrow_move_constructible_v< value_type >)
Constructs a proxy object by move.
Definition iterator.hpp:30
Type & reference
Reference type.
Definition iterator.hpp:24
constexpr pointer operator->() noexcept
Access operator for accessing wrapped values.
Definition iterator.hpp:37
Type value_type
Value type.
Definition iterator.hpp:20
constexpr reference operator*() noexcept
Dereference operator for accessing wrapped values.
Definition iterator.hpp:45
Type * pointer
Pointer type.
Definition iterator.hpp:22
constexpr iota_iterator(const value_type init) noexcept
Constructs an iota iterator from a given value.
Definition iterator.hpp:78
constexpr iota_iterator operator++(int) noexcept
Post-increment operator.
Definition iterator.hpp:93
constexpr reference operator*() const noexcept
Dereference operator.
Definition iterator.hpp:102
value_type reference
Non-reference type, same as value type.
Definition iterator.hpp:64
constexpr iota_iterator & operator++() noexcept
Pre-increment operator.
Definition iterator.hpp:85
constexpr bool operator==(const iota_iterator &other) const noexcept
Comparison operator.
Definition iterator.hpp:111
void pointer
Invalid pointer type.
Definition iterator.hpp:62
stl::ptrdiff_t difference_type
Difference type.
Definition iterator.hpp:66
constexpr iota_iterator() noexcept
Default constructor.
Definition iterator.hpp:71
Type value_type
Value type, likely an integral one.
Definition iterator.hpp:60
stl::input_iterator_tag iterator_category
Iterator category.
Definition iterator.hpp:68
constexpr sentinel cend() const noexcept
Returns an iterator to the end.
Definition iterator.hpp:170
constexpr iterable_adaptor(iterator from, sentinel to) noexcept(stl::is_nothrow_move_constructible_v< iterator > &&stl::is_nothrow_move_constructible_v< sentinel >)
Creates an iterable object from a pair of iterators.
Definition iterator.hpp:143
stl::iterator_traits< It >::value_type value_type
Value type.
Definition iterator.hpp:127
It iterator
Iterator type.
Definition iterator.hpp:129
Sentinel sentinel
Sentinel type.
Definition iterator.hpp:131
constexpr iterator cbegin() const noexcept
Returns an iterator to the beginning.
Definition iterator.hpp:165
constexpr sentinel end() const noexcept
Returns an iterator to the end.
Definition iterator.hpp:160
constexpr iterable_adaptor() noexcept(stl::is_nothrow_default_constructible_v< iterator > &&stl::is_nothrow_default_constructible_v< sentinel >)
Default constructor.
Definition iterator.hpp:134
constexpr iterator begin() const noexcept
Returns an iterator to the beginning.
Definition iterator.hpp:151