5 #ifndef VCCC_ITERATOR_BASIC_CONST_ITERATOR_HPP
6 #define VCCC_ITERATOR_BASIC_CONST_ITERATOR_HPP
45 struct basic_const_iterator_category {
46 using iterator_category =
typename cxx20_iterator_traits<Iter>::iterator_category;
49 template<
typename Iter>
50 struct basic_const_iterator_category<Iter, false> {
51 #if __cplusplus < 202002L
52 using iterator_category = iterator_ignore;
56 template<
typename Iter>
57 struct basic_const_iterator_concept {
58 using iterator_concept =
72 struct constant_iterator : std::false_type {};
74 struct constant_iterator<I, true>
75 : same_as<iter_const_reference_t<I>, iter_reference_t<I>> {};
78 template<
typename>
class Class,
81 bool = negation< is_specialization<Other, Class> >
::value
83 struct const_iterator_implicit_conversion_check : std::false_type {};
84 template<
template<
typename>
class Class,
typename Other,
typename Iter>
85 struct const_iterator_implicit_conversion_check<Class, Other, Iter, true>
87 constant_iterator<Other>,
88 convertible_to<Iter, Other>
97 template<
typename Iter>
103 using iterator_concept =
typename detail::basic_const_iterator_concept<Iter>::iterator_concept;
114 : current_(
std::move(other.current_)) {}
121 : current_(
std::forward<T>(x)) {}
125 constexpr
const Iter&
base() const& noexcept {
130 return std::move(current_);
137 template<
typename I = Iter, std::enable_if_t<
conjunction<
138 std::is_lvalue_reference<iter_reference_t<I>>,
192 template<
typename Other, std::enable_if_t<
198 template<
typename Other, std::enable_if_t<
201 return std::move(current_);
208 return current_ == other.current_;
213 return !(current_ == other.current_);
217 #if __cplusplus < 202002L
227 #if __cplusplus < 202002L
242 return !(*
this == s);
333 return current_ - i.current_;
352 friend constexpr rvalue_reference
360 constexpr
const auto* arrow(std::true_type )
const {
363 constexpr
const auto* arrow(std::false_type )
const {
396 template<
typename T,
typename U,
bool = conjunction<common_with<U, T>>::value>
397 struct basic_const_iterator_common_type
398 : std::conditional_t<
399 input_iterator<common_type_t<T, U>>::value,
400 type_identity< basic_const_iterator<common_type_t<T, U>> >,
403 template<
typename T,
typename U>
404 struct basic_const_iterator_common_type<T, U, false> {};
408 template<
typename T,
typename U>
410 : detail::basic_const_iterator_common_type<T, U> {};
412 template<
typename T,
typename U>
414 : detail::basic_const_iterator_common_type<T, U> {};
416 template<
typename T,
typename U>
418 : detail::basic_const_iterator_common_type<T, U> {};
Definition: basic_const_iterator.hpp:98
constexpr basic_const_iterator & operator+=(difference_type n)
Definition: basic_const_iterator.hpp:181
iter_const_reference_t< Iter > reference
Definition: basic_const_iterator.hpp:106
constexpr bool operator<(const I &y) const
Definition: basic_const_iterator.hpp:281
constexpr basic_const_iterator & operator-=(difference_type n)
Definition: basic_const_iterator.hpp:187
constexpr bool operator!=(const S &s) const
Definition: basic_const_iterator.hpp:241
typename detail::basic_const_iterator_concept< Iter >::iterator_concept iterator_concept
Definition: basic_const_iterator.hpp:103
constexpr const Iter & base() const &noexcept
Definition: basic_const_iterator.hpp:125
iter_value_t< Iter > value_type
Definition: basic_const_iterator.hpp:104
constexpr void operator++(int)
Definition: basic_const_iterator.hpp:156
constexpr basic_const_iterator & operator--()
Definition: basic_const_iterator.hpp:168
constexpr difference_type operator-(const S &s) const
Definition: basic_const_iterator.hpp:340
constexpr basic_const_iterator(T &&x)
Definition: basic_const_iterator.hpp:120
constexpr bool operator<=(const basic_const_iterator &y) const
Definition: basic_const_iterator.hpp:265
constexpr friend basic_const_iterator operator-(const basic_const_iterator &i, difference_type n)
Definition: basic_const_iterator.hpp:327
iter_difference_t< Iter > difference_type
Definition: basic_const_iterator.hpp:105
constexpr basic_const_iterator & operator++()
Definition: basic_const_iterator.hpp:150
constexpr bool operator>=(const I &y) const
Definition: basic_const_iterator.hpp:311
basic_const_iterator()=default
constexpr basic_const_iterator operator++(int)
Definition: basic_const_iterator.hpp:161
constexpr bool operator<(const basic_const_iterator &y) const
Definition: basic_const_iterator.hpp:254
constexpr Iter base() &&
Definition: basic_const_iterator.hpp:129
constexpr iter_const_reference_t< I > operator[](difference_type n) const
Definition: basic_const_iterator.hpp:146
constexpr bool operator>(const basic_const_iterator &y) const
Definition: basic_const_iterator.hpp:259
constexpr bool operator==(const basic_const_iterator &other) const
Definition: basic_const_iterator.hpp:207
constexpr const auto * operator->() const
Definition: basic_const_iterator.hpp:141
constexpr basic_const_iterator(Iter x)
Definition: basic_const_iterator.hpp:110
constexpr friend basic_const_iterator operator+(const basic_const_iterator &i, difference_type n)
Definition: basic_const_iterator.hpp:317
constexpr friend bool operator==(const S &s, const basic_const_iterator &i)
Definition: basic_const_iterator.hpp:232
constexpr bool operator==(const S &s) const
Definition: basic_const_iterator.hpp:222
constexpr reference operator*() const
Definition: basic_const_iterator.hpp:133
constexpr difference_type operator-(const basic_const_iterator &i) const
Definition: basic_const_iterator.hpp:332
constexpr bool operator<=(const I &y) const
Definition: basic_const_iterator.hpp:301
constexpr bool operator>=(const basic_const_iterator &y) const
Definition: basic_const_iterator.hpp:271
constexpr friend basic_const_iterator operator+(difference_type n, const basic_const_iterator &i)
Definition: basic_const_iterator.hpp:322
constexpr bool operator!=(const basic_const_iterator &other) const
Definition: basic_const_iterator.hpp:212
constexpr friend bool operator!=(const S &s, const basic_const_iterator &i)
Definition: basic_const_iterator.hpp:249
constexpr basic_const_iterator operator--(int)
Definition: basic_const_iterator.hpp:174
constexpr bool operator>(const I &y) const
Definition: basic_const_iterator.hpp:291
constexpr basic_const_iterator(basic_const_iterator< U > other)
Definition: basic_const_iterator.hpp:113
constexpr friend rvalue_reference iter_move(const basic_const_iterator &i) noexcept(noexcept(static_cast< rvalue_reference >(ranges::iter_move(i.base()))))
Definition: basic_const_iterator.hpp:353
constexpr friend difference_type operator-(const S &s, const basic_const_iterator &i)
Definition: basic_const_iterator.hpp:348
constexpr VCCC_INLINE_OR_STATIC detail_iter_move::iter_move_niebloid iter_move
Definition: iter_move.hpp:92
std::enable_if_t< semiregular< S >::value, std::conditional_t< input_iterator< S >::value, const_iterator< S >, S > > const_sentinel
Definition: basic_const_iterator.hpp:386
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
constexpr const_iterator< I > make_const_iterator(I it)
Definition: basic_const_iterator.hpp:389
constexpr T * to_address(T *p) noexcept
Definition: to_address.hpp:37
typename iter_rvalue_reference< T >::type iter_rvalue_reference_t
Definition: iter_rvalue_reference_t.hpp:33
typename iter_value< T >::type iter_value_t
Definition: iter_value_t.hpp:42
typename iter_difference< T >::type iter_difference_t
Computes the difference type of T
Definition: iter_difference_t.hpp:49
std::enable_if_t< input_iterator< I >::value, std::conditional_t< detail::constant_iterator< I >::value, I, basic_const_iterator< I > > > const_iterator
Definition: basic_const_iterator.hpp:377
std::input_iterator_tag input_iterator_tag
Definition: iterator_tag.hpp:15
constexpr const_sentinel< S > make_const_sentinel(S s)
Definition: basic_const_iterator.hpp:392
std::bidirectional_iterator_tag bidirectional_iterator_tag
Definition: iterator_tag.hpp:18
typename iter_const_reference< T >::type iter_const_reference_t
Definition: iter_const_reference_t.hpp:47
std::enable_if_t< std::is_object< T >::value, T * > addressof(T &t) noexcept
Definition: addressof.hpp:33
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: common_type.hpp:117
Definition: conjunction.hpp:22
specifies that a random_access_iterator is a contiguous iterator, referring to elements that are cont...
Definition: contiguous_iterator.hpp:88
Models std::convertible_to
Definition: convertible_to.hpp:38
Definition: different_from.hpp:18
Definition: is_nothrow_convertible.hpp:32
Definition: negation.hpp:23
specifies that a bidirectional_iterator is a random-access iterator, supporting advancement in consta...
Definition: random_access_iterator.hpp:120
Models std::same_as
Definition: same_as.hpp:33
Definition: sentinel_for.hpp:24
specifies that the - operator can be applied to an iterator and a sentinel to calculate their differe...
Definition: sized_sentinel_for.hpp:75
specifies that the comparison operators on the type yield a total order
Definition: totally_ordered.hpp:74