5 #ifndef CONCAT_VIEW_HPP
6 #define CONCAT_VIEW_HPP
10 #include <type_traits>
36 template<
typename... Rngs>
37 using concat_compatible = conjunction<
38 has_typename_type<common_type<range_value_t<Rngs>...>>,
39 has_typename_type<common_reference<range_reference_t<Rngs>...>>,
40 has_typename_type<common_reference<range_rvalue_reference_t<Rngs>...>>
49 template<
typename... Rngs>
51 static_assert(
sizeof...(Rngs) != 0,
"Constraints not satisfied");
59 static constexpr std::size_t cranges =
sizeof...(Rngs);
60 std::tuple<Rngs...> bases_{};
63 template<
bool IsConst>
78 : end_(ranges::
end(
std::
get<cranges - 1>(parent.bases_))) {}
83 template<
bool AntiConst, std::enable_if_t<
conjunction<
88 : end_(
std::move(that.end_)) {}
91 template<
bool IsConst>
114 template<std::size_t N, std::enable_if_t<(N < cranges - 1),
int> = 0>
115 void satisfy(std::integral_constant<std::size_t, N>) {
116 if (std::get<N>(its_) ==
ranges::end(std::get<N>(parent_->bases_))) {
117 its_.template emplace<N + 1>(
ranges::begin(std::get<N + 1>(parent_->bases_)));
118 this->satisfy(std::integral_constant<size_t, N + 1>{});
122 template<std::
size_t N, std::enable_if_t<(N >= cranges - 1),
int> = 0>
123 void satisfy(std::integral_constant<std::size_t, N>) { }
125 struct next_raw_visitor {
128 template<
typename I, std::
size_t N>
131 pos->satisfy(std::integral_constant<size_t, N>{});
137 struct prev_raw_visitor {
145 template<
typename I, std::size_t N, std::enable_if_t<
conjunction<
150 if (it ==
ranges::begin(std::get<N>(pos->parent_->bases_))) {
151 auto&& rng =
std::get<N - 1>(pos->parent_->bases_);
154 vccc::detail::variant_raw_visit(pos->its_.
index(), pos->its_._base().storage(), *
this);
163 struct advance_fwd_raw_visitor {
174 auto last =
ranges::end(std::get<N>(pos->parent_->bases_));
180 pos->satisfy(std::integral_constant<size_t, N>{});
182 vccc::detail::variant_raw_visit(
183 pos->its_.
index(), pos->its_._base().storage(), advance_fwd_raw_visitor{pos, rest});
190 struct advance_rev_raw_visitor {
203 auto&& rng =
std::get<N - 1>(pos->parent_->bases_);
205 vccc::detail::variant_raw_visit(pos->its_.
index(), pos->its_._base().storage(), *
this);
209 vccc::detail::variant_raw_visit(
210 pos->its_.
index(), pos->its_._base().storage(), advance_rev_raw_visitor{pos, rest});
223 template<std::
size_t N>
225 if (from.its_.index() > N)
226 return iterator::distance_to_(std::integral_constant<size_t, N + 1>{}, from,
to);
228 if (from.its_.index() == N) {
229 if (
to.its_.index() == N)
230 return ranges::distance(vccc::detail::variant_raw_get(from.its_._base().storage(), in_place_index<N>),
231 vccc::detail::variant_raw_get(
to.its_._base().storage(), in_place_index<N>));
232 return ranges::distance(vccc::detail::variant_raw_get(from.its_._base().storage(), in_place_index<N>),
234 + iterator::distance_to_(std::integral_constant<size_t, N + 1>{}, from,
to);
237 if (from.its_.index() < N &&
to.its_.index() > N)
239 + iterator::distance_to_(std::integral_constant<size_t, N + 1>{}, from,
to);
242 vccc::detail::variant_raw_get(
to.its_._base().storage(), in_place_index<N>));
248 template<std::
size_t I,
typename It>
253 this->satisfy(std::integral_constant<size_t, I>{});
265 : parent_(that.parent_)
266 , its_(std::move(that.its_)) {}
268 constexpr decltype(
auto) operator*()
const {
272 template<
typename V = variant<iterator_t<maybe_const<IsConst, Rngs>>...>, std::enable_if_t<
273 equality_comparable<V>
276 return x.its_ == y.its_;
279 template<
typename V = variant<iterator_t<maybe_const<IsConst, Rngs>>...>, std::enable_if_t<
280 equality_comparable<V>
303 return its_.
index() == cranges - 1 &&
std::get<cranges - 1>(its_) == pos.end_;
307 vccc::detail::variant_raw_visit(its_.
index(), its_._base().storage(), next_raw_visitor{this});
311 template<
typename Dummy = void, std::enable_if_t<
conjunction<
319 template<
typename Dummy = void, std::enable_if_t<
conjunction<
329 template<
typename Dummy = void, std::enable_if_t<
conjunction<
334 vccc::detail::variant_raw_visit(its_.
index(), its_._base().storage(), prev_raw_visitor{this});
338 template<
typename Dummy = void, std::enable_if_t<
conjunction<
348 template<
typename Dummy = void, std::enable_if_t<
conjunction<
354 vccc::detail::variant_raw_visit(its_.
index(), its_._base().storage(), advance_fwd_raw_visitor{this, n});
356 vccc::detail::variant_raw_visit(its_.
index(), its_._base().storage(), advance_rev_raw_visitor{this, n});
361 template<
typename Dummy = void, std::enable_if_t<
conjunction<
370 template<
typename Dummy = void, std::enable_if_t<
conjunction<
376 return -iterator::distance_to_(std::integral_constant<std::size_t, 0>{}, x, y);
377 return iterator::distance_to_(std::integral_constant<std::size_t, 0>{}, y, x);
386 : bases_{
std::move(rngs)...} {}
393 template<
typename Dummy = void, std::enable_if_t<
conjunction<
401 template<
typename Dummy = void, std::enable_if_t<
conjunction<
410 template<
typename Dummy = void, std::enable_if_t<
conjunction<
419 template<
typename Dummy = void, std::enable_if_t<
conjunction<
423 constexpr
auto end()
const {
427 template<
typename Dummy = void, std::enable_if_t<
conjunction<
439 template<
typename Dummy = void, std::enable_if_t<
conjunction<
452 constexpr iterator<true> end_impl(std::true_type )
const {
461 #if __cplusplus >= 201703L
463 template<
typename... Rng>
473 template<
typename... R, std::enable_if_t<
conjunction<
helper class template for defining a view, using the curiously recurring template pattern
Definition: view_interface.hpp:78
constexpr decltype(auto) back()
Definition: view_interface.hpp:255
a type-safe discriminated union
Definition: variant.hpp:589
constexpr std::size_t index() const noexcept
Definition: variant.hpp:662
constexpr decltype(auto) visit(Visitor &&vis) &
Definition: variant.hpp:707
constexpr VCCC_INLINE_OR_STATIC detail::advance_niebloid advance
Definition: advance.hpp:158
constexpr VCCC_INLINE_OR_STATIC detail::next_niebloid next
Definition: next.hpp:65
std::forward_iterator_tag forward_iterator_tag
Definition: iterator_tag.hpp:17
std::random_access_iterator_tag random_access_iterator_tag
Definition: iterator_tag.hpp:19
std::input_iterator_tag input_iterator_tag
Definition: iterator_tag.hpp:15
std::bidirectional_iterator_tag bidirectional_iterator_tag
Definition: iterator_tag.hpp:18
constexpr std::enable_if_t<(detail::ranges_to_1_tag< C, R, Args... >::value > 0), C > to(R &&r, Args &&... args)
Constructs an object of type C from the elements of r
Definition: to.hpp:446
constexpr iterator & operator--()
Definition: concat_view.hpp:333
constexpr iterator(Parent *parent, in_place_index_t< I >, It &&it)
Definition: concat_view.hpp:249
common_type_t< range_difference_t< Rngs >... > difference_type
Definition: concat_view.hpp:104
constexpr iterator & operator--(int)
Definition: concat_view.hpp:342
std::conditional_t< conjunction< random_access_range< Rngs >... >::value, random_access_iterator_tag, std::conditional_t< conjunction< bidirectional_range< Rngs >... >::value, bidirectional_iterator_tag, std::conditional_t< conjunction< forward_range< Rngs >... >::value, forward_iterator_tag, input_iterator_tag > >> iterator_concept
Definition: concat_view.hpp:102
void pointer
Definition: concat_view.hpp:106
constexpr friend bool operator==(const sentinel< IsConst > &y, const iterator &x)
Definition: concat_view.hpp:294
constexpr auto get(const subrange< I, S, K > &r)
Definition: subrange.hpp:371
constexpr auto size() const
Definition: concat_view.hpp:443
constexpr auto size()
Definition: concat_view.hpp:431
common_reference_t< range_reference_t< maybe_const< IsConst, Rngs > >... > reference
Definition: concat_view.hpp:105
constexpr friend difference_type operator-(const iterator &x, const iterator &y)
Definition: concat_view.hpp:374
constexpr void operator++(int)
Definition: concat_view.hpp:315
constexpr auto begin()
Definition: concat_view.hpp:388
typename sentinel< R >::type sentinel_t
Definition: sentinel_t.hpp:29
typename ranges::iterator< T >::type iterator_t
Definition: iterator_t.hpp:32
iterator * pos
Definition: concat_view.hpp:126
difference_type n
Definition: concat_view.hpp:165
constexpr VCCC_INLINE_OR_STATIC detail::begin_niebloid begin
returns an iterator to the beginning of a range
Definition: begin.hpp:116
constexpr friend bool operator==(const iterator &x, const iterator &y)
Definition: concat_view.hpp:275
void operator()(I &it, in_place_index_t< 0 >)
Definition: concat_view.hpp:195
constexpr VCCC_INLINE_OR_STATIC detail::distance_niebloid distance
Definition: distance.hpp:72
common_type_t< range_value_t< maybe_const< IsConst, Rngs > >... > value_type
Definition: concat_view.hpp:103
constexpr friend bool operator!=(const iterator &x, const iterator &y)
Definition: concat_view.hpp:282
constexpr auto end()
Definition: concat_view.hpp:405
void operator()(I &it, in_place_index_t< 0 >)
Definition: concat_view.hpp:141
constexpr iterator & operator-=(difference_type n)
Definition: concat_view.hpp:365
constexpr friend bool operator==(const iterator &x, const sentinel< IsConst > &y)
Definition: concat_view.hpp:286
constexpr auto end() const
Definition: concat_view.hpp:423
void operator()(I &it, in_place_index_t< N >)
Definition: concat_view.hpp:173
constexpr friend bool operator!=(const sentinel< IsConst > &y, const iterator &x)
Definition: concat_view.hpp:298
constexpr iterator & operator+=(difference_type n)
Definition: concat_view.hpp:352
input_iterator_tag iterator_category
Definition: concat_view.hpp:93
constexpr iterator< true > begin() const
Definition: concat_view.hpp:397
void operator()(I &it, in_place_index_t< N >)
Definition: concat_view.hpp:129
constexpr VCCC_INLINE_OR_STATIC detail::end_niebloid end
returns a sentinel indicating the end of a range
Definition: end.hpp:120
void operator()(U &, in_place_index_t< variant_npos >)
Definition: concat_view.hpp:134
concat_view(Rngs... rngs)
Definition: concat_view.hpp:385
constexpr iterator(iterator< Other > that)
Definition: concat_view.hpp:264
constexpr bool equal(const sentinel< IsConst > &pos) const
Definition: concat_view.hpp:302
constexpr friend bool operator!=(const iterator &x, const sentinel< IsConst > &y)
Definition: concat_view.hpp:290
constexpr VCCC_INLINE_OR_STATIC detail::concat_niebloid concat
concatenate ranges
Definition: concat_view.hpp:485
constexpr iterator & operator++()
Definition: concat_view.hpp:306
constexpr VCCC_INLINE_OR_STATIC detail::all_adaptor_closure all
a view that includes all elements of a range
Definition: all.hpp:82
void operator()(I &it, in_place_index_t< cranges - 1 >)
Definition: concat_view.hpp:168
constexpr auto tuple_fold_left(Tuple &&tuple, T &&init, F &&f)
Left fold operation for each tuple elements.
Definition: tuple_fold.hpp:52
constexpr auto tuple_transform(Tuple &&t, F &&f) noexcept(noexcept(detail::tuple_transform_impl(std::forward< Tuple >(t), std::forward< F >(f), std::make_index_sequence< std::tuple_size< remove_cvref_t< Tuple >>::value >{})))
Constructs a new tuple with each elements transformed.
Definition: tuple_transform.hpp:36
std::integral_constant< bool, v > bool_constant
Definition: bool_constant.hpp:19
std::conditional_t< Const, const V, V > maybe_const
Definition: maybe_const.hpp:16
constexpr VCCC_INLINE_OR_STATIC in_place_index_t< I > in_place_index
Definition: in_place.hpp:53
#define VCCC_INLINE_OR_STATIC
Definition: inline_or_static.hpp:9
Definition: matrix.hpp:495
constexpr std::enable_if_t<(I< m *n), typename vccc::Matrix< T, m, n >::value_type & > get(vccc::Matrix< T, m, n > &matrix)
Definition: matrix.hpp:499
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 0 > first
Definition: key_value.hpp:34
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
specifies that a forward_iterator is a bidirectional iterator, supporting movement backwards
Definition: bidirectional_iterator.hpp:58
Definition: conjunction.hpp:22
Models std::convertible_to
Definition: convertible_to.hpp:38
Definition: in_place.hpp:35
Definition: negation.hpp:23
specifies a range whose iterator type satisfies bidirectional_iterator
Definition: bidirectional_range.hpp:49
Definition: common_range.hpp:41
Definition: concat_view.hpp:92
constexpr iterator operator++(int)
Definition: concat_view.hpp:323
Definition: concat_view.hpp:67
Definition: concat_view.hpp:50
constexpr auto end()
Definition: concat_view.hpp:414
specifies a range whose iterator type satisfies forward_iterator
Definition: forward_range.hpp:47
specifies a range whose iterator type satisfies random_access_iterator
Definition: random_access_range.hpp:48
specifies that a type is a range, that is, it provides a begin iterator and an end sentinel
Definition: range.hpp:53
specifies that a range knows its size in constant time
Definition: sized_range.hpp:38
specifies the requirements for a range to be safely convertible to a view
Definition: viewable_range.hpp:59
Definition: concat_view.hpp:472
constexpr auto operator()(R &&... rs) const
Definition: concat_view.hpp:477
specifies that the - operator can be applied to an iterator and a sentinel to calculate their differe...
Definition: sized_sentinel_for.hpp:75
Definition: type_sequence.hpp:110