20template<concepts::InputContainer... Views>
21requires((concepts::View<Views> && ...) &&
sizeof...(Views) > 0)
29 template<
bool is_const>
32 template<
bool is_const>
35 template<
bool is_const>
36 constexpr static bool all_bidirectional =
39 template<
bool is_const>
40 constexpr static bool all_random_access =
43 template<
bool is_const>
46 template<
bool is_const>
47 constexpr static bool is_common =
48 (
sizeof...(Views) == 1 && all_common<is_const>) || (!all_bidirectional<is_const> && all_common<is_const>) ||
49 (all_random_access<is_const> && all_sized<is_const>);
51 template<
bool is_const>
54 template<
bool is_const>
57 template<
bool is_const>
60 template<
bool is_const>
65 all_random_access<is_const>, RandomAccessIteratorTag,
66 meta::Conditional<all_bidirectional<is_const>, BidirectionalIteratorTag,
67 meta::Conditional<all_forward<is_const>, ForwardIteratorTag, InputIteratorTag>>>,
68 Value<is_const>, SSizeType<is_const>> {
72 constexpr explicit Iterator(Storage iterators) : m_iterators(util::move(iterators)) {}
74 template<
bool is_const_>
75 friend class Sentinel;
82 constexpr Iterator(Iterator<!is_const> other)
86 : m_iterators(util::move(other)) {}
88 Iterator(Iterator
const&) =
default;
89 Iterator(Iterator&&) =
default;
91 auto operator=(Iterator
const&) -> Iterator& =
default;
92 auto operator=(Iterator&&) -> Iterator& =
default;
94 Iterator(Iterator
const&)
95 requires(!all_forward<is_const>)
97 auto operator=(Iterator
const&) -> Iterator&
requires(!all_forward<is_const>) =
delete;
99 constexpr auto operator*()
const {
101 [](
auto& iterator) ->
decltype(*iterator) {
107 constexpr void advance_one() {
115 constexpr void back_one()
116 requires(all_bidirectional<is_const>)
125 constexpr void advance_n(SSizeType<is_const> n)
126 requires(all_random_access<is_const>)
129 [&](
auto& iterator) {
135 constexpr auto iterators()
const -> Storage
const& {
return m_iterators; }
138 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool
141 if constexpr (all_bidirectional<is_const>) {
142 return a.m_iterators == b.m_iterators;
151 constexpr friend auto operator<=>(Iterator
const& a, Iterator
const& b)
152 requires(all_random_access<is_const> &&
155 return a.m_iterators <=> b.m_iterators;
158 constexpr friend auto operator-(Iterator
const& a, Iterator
const& b) -> SSizeType<is_const>
188 template<
bool is_const>
189 class Sentinel :
public SentinelBase<Sentinel<is_const>> {
193 constexpr explicit Sentinel(Storage sentinels) : m_sentinels(util::move(sentinels)) {}
198 Sentinel() =
default;
200 constexpr Sentinel(Sentinel<!is_const> other)
204 : m_sentinels(util::move(other)) {}
206 template<
bool other_is_const>
210 constexpr auto difference(Iterator<other_is_const>
const& a)
const {
219 template<
bool other_is_const>
223 constexpr friend auto operator==(Iterator<other_is_const>
const& a, Sentinel
const& b) ->
bool {
243 requires(!all_simple)
255 requires(!all_simple)
257 if constexpr (!is_common<false>) {
259 }
else if constexpr (all_random_access<false>) {
260 return begin() +
static_cast<SSizeType<false>
>(
size());
266 constexpr auto end() const
269 if constexpr (!is_common<true>) {
271 }
else if constexpr (all_random_access<true>) {
272 return begin() +
static_cast<SSizeType<true>
>(
size());
279 requires(all_sized<false>)
290 requires(all_sized<true>)
301 Tuple<Views...> m_views;
304template<
typename... Cons>
Definition sentinel_base.h:13
Definition view_interface.h:26
constexpr auto end()
Definition zip_view.h:254
constexpr auto size() const
Definition zip_view.h:289
constexpr ZipView(Views... views)
Definition zip_view.h:240
constexpr auto end() const
Definition zip_view.h:266
constexpr auto begin()
Definition zip_view.h:242
constexpr auto size()
Definition zip_view.h:278
constexpr auto begin() const
Definition zip_view.h:248
Definition tuple_forward_declaration.h:5
Definition bidirectional_container.h:8
Definition common_container.h:10
Definition operations.h:99
Definition operations.h:24
Definition forward_container.h:8
Definition indirectly_swappable.h:7
Definition random_access_container.h:8
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 min
Definition min.h:47
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
ZipView(Cons &&...) -> ZipView< meta::AsView< Cons >... >
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 auto apply(F &&f, Tup &&tuple) -> decltype(detail::apply_impl(meta::MakeIndexSequence< meta::TupleSize< Tup > > {}, util::forward< F >(f), util::forward< Tup >(tuple)))
Definition apply.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