16template<concepts::ForwardContainer View,
size_t N>
17requires(concepts::View<View> &&
N > 0)
22 template<
bool is_const>
25 template<
bool is_const>
28 template<
bool is_const>
31 template<
bool is_const>
36 template<
bool is_const>
39 template<
bool is_const>
42 meta::Conditional<concepts::RandomAccessIterator<Iter<is_const>>, RandomAccessIteratorTag,
43 meta::Conditional<concepts::BidirectionalIterator<Iter<is_const>>,
44 BidirectionalIteratorTag, ForwardIteratorTag>>,
45 meta::AsTuple<meta::Repeat<Value<is_const>, N>>, SSizeType<is_const>> {
49 constexpr explicit Iterator(Iter<is_const> first, Sent<is_const> last) {
50 m_iterators[0] = util::move(first);
56 constexpr explicit Iterator(AsSentinel, Iter<is_const> first, Iter<is_const> last) {
58 m_iterators[N - 1] = util::move(last);
64 m_iterators[i] = last;
69 constexpr Iterator(Iterator<!is_const> other)
72 for (
auto& [left, right] :
view::zip(this->m_iterators, other.m_iterators)) {
73 left = util::move(right);
77 constexpr auto operator*()
const {
79 [](
auto& iterator) ->
decltype(*iterator) {
85 constexpr void advance_one() {
93 constexpr void back_one()
103 constexpr void advance_n(SSizeType<is_const> n)
107 [&](
auto& iterator) {
116 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool
119 return a.m_iterators.back() == b.m_iterators.back();
122 constexpr friend auto operator<=>(Iterator
const& a, Iterator
const& b)
125 return a.m_iterators.back() <=> b.m_iterators.back();
128 constexpr friend auto operator-(Iterator
const& a, Iterator
const& b) -> SSizeType<is_const>
131 return a.m_iterators.back() - b.m_iterators.back();
134 template<
bool other_is_const>
135 friend class Sentinel;
152 template<
bool is_const>
153 class Sentinel :
public SentinelBase<Sentinel<is_const>> {
155 Sentinel() =
default;
157 constexpr explicit Sentinel(Sent<is_const> sentinel) : m_sentinel(sentinel) {}
159 constexpr Sentinel(Sentinel<!is_const> other)
161 : m_sentinel(other.base()) {}
163 constexpr auto base()
const {
return m_sentinel; }
165 template<
bool other_is_const>
167 constexpr auto difference(Iterator<other_is_const>
const& a)
const -> SSizeType<is_const> {
168 return base() - a.m_iterators.back();
172 template<
bool other_is_const>
174 constexpr friend auto operator==(Iterator<other_is_const>
const& a, Sentinel
const& b) ->
bool {
175 return a.m_iterators.back() == b.base();
178 Sent<is_const> m_sentinel;
193 constexpr auto base() && ->
View {
return util::move(m_base); }
217 constexpr auto end() const
234 return static_cast<SizeType
>(
size);
244 return static_cast<SizeType
>(
size);
constexpr AdjacentView(View base)
Definition adjacent_view.h:186
constexpr auto size()
Definition adjacent_view.h:227
constexpr auto end()
Definition adjacent_view.h:207
constexpr auto base() &&-> View
Definition adjacent_view.h:193
constexpr auto end() const
Definition adjacent_view.h:217
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition adjacent_view.h:188
constexpr auto size() const
Definition adjacent_view.h:237
constexpr auto begin() const
Definition adjacent_view.h:201
constexpr auto begin()
Definition adjacent_view.h:195
Definition sentinel_base.h:13
Definition view_interface.h:26
Definition bidirectional_iterator.h:8
Definition common_container.h:10
Definition operations.h:99
Definition operations.h:27
Definition indirectly_swappable.h:7
Definition random_access_iterator.h:12
Definition sentinel_for.h:9
Definition simple_view.h:11
Definition sized_container.h:8
Definition sized_sentinel_for.h:9
Definition any_storable.h:9
constexpr auto zip
Definition zip.h:36
constexpr auto reverse
Definition reverse.h:52
constexpr auto range
Definition range.h:22
constexpr auto prev
Definition prev.h:28
constexpr auto min
Definition min.h:47
constexpr auto next
Definition next.h:35
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 iterator_move
Definition iterator_move.h:56
constexpr auto move
Definition move.h:38
constexpr auto operator==(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> bool
Definition move_iterator.h:85
constexpr auto size
Definition size.h:54
constexpr auto iterator_swap
Definition iterator_swap.h:49
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
constexpr auto unpack
Definition unpack.h:24
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto tuple_transform(F &&function, Tup &&tuple)
Definition tuple_transform.h:22
constexpr void tuple_for_each(F &&function, Tup &&tuple)
Definition tuple_for_each.h:22
Definition enable_borrowed_container.h:9
Definition iterator_base.h:14
Definition span_fixed_size.h:37