5 #ifndef VCCC_RANGES_VIEWS_ENUMERATE_VIEW_HPP
6 #define VCCC_RANGES_VIEWS_ENUMERATE_VIEW_HPP
37 #if __cplusplus >= 201703L
50 struct range_with_movable_reference : std::false_type {};
52 struct range_with_movable_reference<R, true>
54 move_constructible<range_reference_t<R>>,
55 move_constructible<range_rvalue_reference_t<R>>
63 template<
typename V,
template<
typename...>
class Tuple = std::tuple>
92 using value_type = Tuple<difference_type, range_value_t<Base>>;
94 using reference = Tuple<difference_type, range_reference_t<Base>>;
98 template<
bool AntiConst, std::enable_if_t<
conjunction<
103 : current_(
std::move(i.current_)), pos_(i.pos_) {}
107 : current_(
std::move(current)), pos_(pos) {}
114 return std::move(current_);
177 return x.pos_ == y.pos_;
185 return x.pos_ < y.pos_;
220 return i.pos_ - j.pos_;
226 std::is_nothrow_move_constructible<
230 return std::tuple<difference_type, range_rvalue_reference_t<Base>>(i.pos_,
ranges::iter_move(i.current_));
246 template<
bool AntiConst, std::enable_if_t<
conjunction<
251 : end_(
std::move(other.end_)) {}
264 return x.current_ == y.end_;
279 template<
bool OtherConst, std::enable_if_t<
conjunction<
290 template<
bool OtherConst, std::enable_if_t<
conjunction<
317 return std::move(base_);
320 template<typename V2 = V, std::enable_if_t<simple_view<V2>::valule ==
false,
int> = 0>
325 template<
typename V2 = V, std::enable_if_t<
336 template<
typename V2 = V, std::enable_if_t<
338 constexpr
auto end()
const {
353 template<
typename V2 = V>
354 constexpr iterator<false> end_nonconst(std::true_type) {
357 template<
typename V2 = V>
358 constexpr sentinel<false> end_nonconst(std::false_type) {
362 template<
typename V2 = V>
363 constexpr iterator<true> end_const(std::true_type)
const {
366 template<
typename V2 = V>
367 constexpr sentinel<true> end_const(std::false_type)
const {
374 #if __cplusplus >= 201703L
381 template<
typename View>
Definition: enumerate_view.hpp:73
constexpr friend bool operator<=(const iterator &x, const iterator &y) noexcept
Definition: enumerate_view.hpp:188
constexpr iterator & operator--()
Definition: enumerate_view.hpp:149
constexpr friend iterator operator+(const iterator &i, difference_type n)
Definition: enumerate_view.hpp:201
constexpr auto operator[](difference_type n) const
Definition: enumerate_view.hpp:126
constexpr friend bool operator>(const iterator &x, const iterator &y) noexcept
Definition: enumerate_view.hpp:192
constexpr friend iterator operator-(const iterator &i, difference_type n)
Definition: enumerate_view.hpp:213
void pointer
Definition: enumerate_view.hpp:93
constexpr void operator++(int)
Definition: enumerate_view.hpp:137
constexpr friend bool operator!=(const iterator &x, const iterator &y) noexcept
Definition: enumerate_view.hpp:180
constexpr difference_type index() const noexcept
Definition: enumerate_view.hpp:117
constexpr iterator(iterator< AntiConst > i)
Definition: enumerate_view.hpp:102
constexpr auto operator*() const
Definition: enumerate_view.hpp:121
constexpr iterator & operator-=(difference_type n)
Definition: enumerate_view.hpp:170
constexpr friend bool operator==(const iterator &x, const iterator &y) noexcept
Definition: enumerate_view.hpp:176
constexpr iterator & operator+=(difference_type n)
Definition: enumerate_view.hpp:163
input_iterator_tag iterator_category
Definition: enumerate_view.hpp:81
constexpr iterator operator--(int)
Definition: enumerate_view.hpp:156
constexpr iterator_t< Base > base() &&
Definition: enumerate_view.hpp:113
constexpr friend iterator operator+(difference_type n, const iterator &i)
Definition: enumerate_view.hpp:208
Tuple< difference_type, range_reference_t< Base > > reference
Definition: enumerate_view.hpp:94
constexpr friend bool operator<(const iterator &x, const iterator &y) noexcept
Definition: enumerate_view.hpp:184
std::conditional_t< random_access_range< Base >::value, random_access_iterator_tag, std::conditional_t< bidirectional_range< Base >::value, bidirectional_iterator_tag, std::conditional_t< forward_range< Base >::value, forward_iterator_tag, input_iterator_tag > >> iterator_concept
Definition: enumerate_view.hpp:90
Tuple< difference_type, range_value_t< Base > > value_type
Definition: enumerate_view.hpp:92
constexpr iterator operator++(int)
Definition: enumerate_view.hpp:142
constexpr friend auto iter_move(const iterator &i) noexcept(noexcept(ranges::iter_move(i.current_)) &&std::is_nothrow_move_constructible< range_rvalue_reference_t< Base >>::value)
Definition: enumerate_view.hpp:223
constexpr friend iterator operator-(const iterator &i, const iterator &j) noexcept
Definition: enumerate_view.hpp:219
constexpr iterator & operator++()
Definition: enumerate_view.hpp:130
constexpr const iterator_t< Base > & base() const &noexcept
Definition: enumerate_view.hpp:110
constexpr friend bool operator>=(const iterator &x, const iterator &y) noexcept
Definition: enumerate_view.hpp:196
range_difference_t< Base > difference_type
Definition: enumerate_view.hpp:91
Definition: enumerate_view.hpp:239
constexpr sentinel_t< Base > base() const
Definition: enumerate_view.hpp:258
constexpr friend range_difference_t< maybe_const< OtherConst, V > > operator-(const iterator< OtherConst > &x, const sentinel &y)
Definition: enumerate_view.hpp:286
constexpr friend bool operator==(const sentinel &y, const iterator< Const > &x)
Definition: enumerate_view.hpp:271
constexpr friend bool operator==(const iterator< Const > &x, const sentinel &y)
Definition: enumerate_view.hpp:262
constexpr sentinel(sentinel< AntiConst > other)
Definition: enumerate_view.hpp:250
constexpr friend bool operator!=(const iterator< Const > &x, const sentinel &y)
Definition: enumerate_view.hpp:267
constexpr friend range_difference_t< maybe_const< OtherConst, V > > operator-(const sentinel &y, const iterator< OtherConst > &x)
Definition: enumerate_view.hpp:297
constexpr friend bool operator!=(const sentinel &y, const iterator< Const > &x)
Definition: enumerate_view.hpp:275
Definition: enumerate_view.hpp:64
constexpr V base() const &
Definition: enumerate_view.hpp:312
constexpr auto size() const
Definition: enumerate_view.hpp:348
constexpr auto size()
Definition: enumerate_view.hpp:343
constexpr V base() &&
Definition: enumerate_view.hpp:316
constexpr auto end()
Definition: enumerate_view.hpp:332
constexpr auto end() const
Definition: enumerate_view.hpp:338
constexpr iterator< true > begin() const
Definition: enumerate_view.hpp:327
constexpr enumerate_view(V base)
Definition: enumerate_view.hpp:308
constexpr iterator< false > begin()
Definition: enumerate_view.hpp:321
helper class template for defining a view, using the curiously recurring template pattern
Definition: view_interface.hpp:78
constexpr VCCC_INLINE_OR_STATIC detail_iter_move::iter_move_niebloid iter_move
Definition: iter_move.hpp:92
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
typename sentinel< R >::type sentinel_t
Definition: sentinel_t.hpp:29
typename ranges::iterator< T >::type iterator_t
Definition: iterator_t.hpp:32
constexpr VCCC_INLINE_OR_STATIC detail::begin_niebloid begin
returns an iterator to the beginning of a range
Definition: begin.hpp:116
typename range_rvalue_reference< R >::type range_rvalue_reference_t
Used to obtain the rvalue reference type of the iterator type of range type R.
Definition: range_rvalue_reference_t.hpp:38
constexpr VCCC_INLINE_OR_STATIC detail::distance_niebloid distance
Definition: distance.hpp:72
constexpr VCCC_INLINE_OR_STATIC detail::size_niebloid size
returns the size of a container or array
Definition: size.hpp:145
constexpr VCCC_INLINE_OR_STATIC detail::end_niebloid end
returns a sentinel indicating the end of a range
Definition: end.hpp:120
typename range_difference< R >::type range_difference_t
Used to obtain the difference type of the iterator type of range type R.
Definition: range_difference_t.hpp:41
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
Definition: matrix.hpp:495
Definition: cxx20_rel_ops.hpp:17
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: conjunction.hpp:22
Models std::convertible_to
Definition: convertible_to.hpp:38
specifies a range whose iterator type satisfies bidirectional_iterator
Definition: bidirectional_range.hpp:49
Definition: common_range.hpp:41
Definition: enable_borrowed_range.hpp:17
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 range knows its size in constant time
Definition: sized_range.hpp:38
specifies that a range is a view, that is, it has constant time copy/move/assignment
Definition: view.hpp:31
specifies that the - operator can be applied to an iterator and a sentinel to calculate their differe...
Definition: sized_sentinel_for.hpp:75