52template<concepts::Copyable T, concepts::Semiregular Bound = UnreachableSentinel>
71 meta::Conditional<detail::IotaAdvancable<T>, RandomAccessIteratorTag,
72 meta::Conditional<detail::IotaDecrementable<T>, BidirectionalIteratorTag,
73 meta::Conditional<detail::IotaIncrementable<T>, ForwardIteratorTag,
81 constexpr explicit Iterator(T value) : m_value(value) {}
83 Iterator(Iterator
const&) =
default;
84 Iterator(Iterator&&) =
default;
86 auto operator=(Iterator
const&) -> Iterator& =
default;
87 auto operator=(Iterator&&) -> Iterator& =
default;
89 Iterator(Iterator
const&)
95 constexpr auto operator*()
const -> T {
return m_value; }
97 constexpr void advance_one() { ++m_value; }
99 constexpr void back_one()
105 constexpr void advance_n(SSizeType n)
110 m_value +=
static_cast<T
>(n);
112 m_value -=
static_cast<T
>(-n);
121 friend class Sentinel;
123 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool
126 return a.m_value == b.m_value;
129 constexpr friend auto operator<=>(Iterator
const& a, Iterator
const& b)
132 return a.m_value <=> b.m_value;
135 constexpr friend auto operator-(Iterator
const& a, Iterator
const& b) -> SSizeType
139 return static_cast<SSizeType
>(
static_cast<SSizeType
>(a.m_value) -
static_cast<SSizeType
>(b.m_value));
141 return b.m_value > a.m_value ?
static_cast<SSizeType
>(-
static_cast<SSizeType
>(b.m_value - a.m_value))
142 :
static_cast<SSizeType
>(a.m_value - b.m_value);
144 return a.m_value - b.m_value;
154 constexpr Sentinel() =
default;
155 constexpr explicit Sentinel(Bound bound) : m_bound(bound) {}
157 constexpr auto difference(Iterator
const& a)
const -> SSizeType {
return -(a.m_value - this->m_bound); }
162 constexpr friend auto operator==(Iterator
const& a, Sentinel
const& b) ->
bool {
163 return a.m_value == b.m_bound;
174 constexpr explicit IotaView(T value) : m_value(value) {}
180 : m_value(first.m_value), m_bound(last.m_value) {}
184 : m_value(first.m_value), m_bound(last.m_bound) {}
187 requires(!is_bounded)
188 : m_value(first.m_value) {}
190 constexpr auto begin() const -> Iterator {
return Iterator(m_value); }
192 constexpr auto end()
const {
193 if constexpr (is_bounded) {
194 return Sentinel(m_bound);
200 constexpr auto end() const -> Iterator
201 requires(
concepts::SameAs<T, Bound>)
203 return Iterator(m_bound);
207 requires((
concepts::SameAs<T, Bound> &&
detail::IotaAdvancable<T>) ||
222 template<concepts::OneOf<Iterator, meta::Conditional<is_bounded, Sentinel, UnreachableSentinel>> Sent>
228 return IotaView(util::move(first), util::move(last));
236template<
typename T,
typename Bound>
237requires(!concepts::Integer<T> || !concepts::Integer<Bound> ||
238 concepts::SignedInteger<T> == concepts::SignedInteger<Bound>)
Definition iota_view.h:60
constexpr auto size() const
Definition iota_view.h:206
constexpr IotaView(Iterator first, UnreachableSentinel)
Definition iota_view.h:186
constexpr IotaView()=default
constexpr friend auto tag_invoke(types::Tag< container::reconstruct >, Iterator first, Sent last)
Definition iota_view.h:223
constexpr IotaView(T value)
Definition iota_view.h:174
constexpr auto begin() const -> Iterator
Definition iota_view.h:190
constexpr IotaView(Iterator first, Iterator last)
Definition iota_view.h:178
constexpr IotaView(Iterator first, Sentinel last)
Definition iota_view.h:182
constexpr auto end() const
Definition iota_view.h:192
constexpr IotaView(meta::TypeIdentity< T > value, meta::TypeIdentity< Bound > bound)
Definition iota_view.h:176
constexpr auto end() const -> Iterator requires(concepts::SameAs< T, Bound >)
Definition iota_view.h:200
Definition sentinel_base.h:13
Definition view_interface.h:26
Definition operations.h:99
Definition operations.h:27
Definition language.h:215
Definition language.h:241
Definition language.h:244
Definition iota_view.h:40
Definition iota_view.h:34
Definition iota_view.h:28
Definition any_storable.h:9
IotaView(T, Bound) -> IotaView< T, Bound >
constexpr auto operator<=>(MoveIterator< Iter > const &a, MoveIterator< U > const &b)
Definition move_iterator.h:90
constexpr auto operator-(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> decltype(a.base() - b.base())
Definition move_iterator.h:95
constexpr auto unreachable_sentinel
Definition unreachable_sentinel.h:11
constexpr auto operator==(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> bool
Definition move_iterator.h:85
constexpr auto to_unsigned
Definition to_unsigned.h:16
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition enable_borrowed_container.h:9
Definition iterator_base.h:14
Definition unreachable_sentinel.h:4