21 template<
typename...
Cons>
24 template<
typename... Cons>
27 template<
typename... Cons>
30 template<
typename Ref,
typename RRef,
typename It>
32 static_cast<Ref
>(*it);
36 template<
typename... Cons>
44 template<
typename... Cons>
51 template<
typename... Cons>
55 template<
typename Con>
60 template<
typename... Cons>
69 template<
bool is_const>
74 detail::ConcatRandomAccess<meta::MaybeConst<is_const, Views>...>, RandomAccessIteratorTag,
76 detail::ConcatBidirectional<meta::MaybeConst<is_const, Views>...>, BidirectionalIteratorTag,
77 meta::Conditional<(concepts::ForwardContainer<meta::MaybeConst<is_const, Views>> && ...),
78 ForwardIteratorTag, InputIteratorTag>>>,
79 detail::ConcatValue<meta::MaybeConst<is_const, Views>...>,
80 meta::CommonType<meta::ContainerSSizeType<meta::MaybeConst<is_const, Views>>...>> {
88 friend class Iterator;
92 constexpr void satisfy() {
93 if constexpr (N !=
sizeof...(Views) - 1) {
102 constexpr void prev() {
103 if constexpr (N == 0) {
111 m_base.template emplace<N - 1>(
123 constexpr void advance_fwd(SSizeType offset, SSizeType steps) {
124 if constexpr (N ==
sizeof...(Views) - 1) {
128 if (offset + steps <
static_cast<SSizeType
>(n_size)) {
132 advance_fwd<N + 1>(0, offset + steps - n_size);
138 constexpr void advance_bwd(SSizeType offset, SSizeType steps) {
139 if constexpr (N == 0) {
142 if (offset >= steps) {
153 template<
typename... Args>
156 : m_parent(parent), m_base(util::forward<Args>(args)...) {}
163 constexpr Iterator(Iterator<!is_const> other)
166 : m_parent(other.m_parent), m_base(util::move(other.m_base)) {}
168 constexpr auto operator*()
const ->
decltype(
auto) {
170 [](
auto&& it) -> Reference {
176 constexpr void advance_one() {
178 ++util::get<i>(m_base);
179 this->template satisfy<i>();
183 constexpr void back_one()
187 this->template prev<i>();
191 constexpr void advance_n(SSizeType n)
196 this->template advance_fwd<i>(
197 util::get<i>(m_base) - container::begin(util::get<i>(m_parent->m_views)), n);
199 this->
template advance_bwd<i>(
206 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool
209 return a.m_base == b.m_base;
212 constexpr auto at_end()
const ->
bool {
213 constexpr auto last_index =
sizeof...(Views) - 1;
214 return m_base.index() == last_index &&
220 constexpr friend auto operator<=>(Iterator
const& a, Iterator
const& b)
223 return a.m_base <=> b.m_base;
226 constexpr auto distance_from(Iterator
const& b)
const -> SSizeType {
227 auto ai = this->m_base.index();
228 auto bi = b.m_base.
index();
232 [](
auto const&... views) {
240 return sizes[index] -
243 auto a_to_its_start =
248 return b_to_its_end + b_to_a + a_to_its_start;
251 return b.distance_from(*
this);
258 constexpr auto distance_from_end()
const -> SSizeType {
260 [](
auto const&... views) {
265 auto index = m_base.index();
267 auto current_to_its_end =
269 return sizes[index] -
273 return -(rest_to_end + current_to_its_end);
276 constexpr friend auto operator-(Iterator
const& a, Iterator
const& b) -> SSizeType
279 return a.distance_from(b);
285 return a.distance_from_end();
291 return -a.distance_from_end();
294 constexpr friend auto tag_invoke(Iterator
const& a) ->
decltype(
auto) {
298 template<
typename =
void>
299 constexpr friend void tag_invoke(Iterator
const& a, Iterator
const& b)
322 it.template satisfy<0>();
327 requires((
concepts::Container<Views const> &&
detail::Concatable<Views const>) && ...)
330 it.template satisfy<0>();
339 constexpr auto N =
sizeof...(Views);
346 constexpr auto end() const
347 requires((
concepts::Container<Views const> &&
detail::Concatable<Views const>) && ...)
351 constexpr auto N =
sizeof...(Views);
364 return (CT { 0 } + ... + CT { sizes });
370 requires(
concepts::SizedContainer<Views const> && ...)
375 return (CT { 0 } + ... + CT { sizes });
381 [[no_unique_address]]
Tuple<Views...> m_views;
384template<
typename... Cons>
Definition concat_view.h:67
constexpr auto size() const
Definition concat_view.h:369
constexpr ConcatView(Views... views)
Definition concat_view.h:316
constexpr auto size()
Definition concat_view.h:358
constexpr auto end()
Definition concat_view.h:334
constexpr auto end() const
Definition concat_view.h:346
constexpr auto begin() const
Definition concat_view.h:326
constexpr auto begin()
Definition concat_view.h:318
Definition view_interface.h:26
Definition tuple_forward_declaration.h:5
Definition variant_forward_declaration.h:6
constexpr auto index() const -> size_t
Definition variant.h:173
Definition bidirectional_container.h:8
Definition common_container.h:10
Definition operations.h:11
Definition operations.h:99
Definition operations.h:24
Definition operations.h:27
Definition random_access_container.h:8
Definition operations.h:117
Definition simple_view.h:11
Definition sized_container.h:8
Definition concat_view.h:61
Definition concat_view.h:31
Definition concat_view.h:37
Definition concat_view.h:52
Definition concat_view.h:45
Definition any_storable.h:9
meta::CommonReference< meta::ContainerRValue< Cons >... > ConcatRValue
Definition concat_view.h:28
meta::CommonReference< meta::ContainerReference< Cons >... > ConcatReference
Definition concat_view.h:22
meta::CommonType< meta::ContainerValue< Cons >... > ConcatValue
Definition concat_view.h:25
concept Cons
Definition zip_transform.h:12
constexpr auto drop
Definition drop.h:36
constexpr auto take
Definition take.h:35
constexpr auto prev
Definition prev.h:28
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 default_sentinel
Definition default_sentinel.h:6
constexpr auto end
Definition end.h:47
constexpr auto sum
Definition sum.h:26
constexpr auto begin
Definition begin.h:44
constexpr auto index_dispatch
Definition index_dispatch.h:41
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
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 auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
Definition default_sentinel.h:4
Definition iterator_base.h:14
Definition concat_view.h:54
Constexpr<(concepts::BidirectionalContainer< Con > &&concepts::CommonContainer< Con >)||(concepts::SizedContainer< Con > &&concepts::RandomAccessContainer< Con >)> Invoke
Definition concat_view.h:56
Definition span_fixed_size.h:37