5 #ifndef VCCC_ITERATOR_COUNTED_ITERATOR_HPP
6 #define VCCC_ITERATOR_COUNTED_ITERATOR_HPP
41 struct counted_iterator_value_type {
42 using value_type = iter_value_t<I>;
45 struct counted_iterator_value_type<I, false> {};
47 template<
typename I,
typename =
void>
48 struct counted_iterator_iterator_concept {};
50 struct counted_iterator_iterator_concept<I,
void_t<typename I::iterator_concept>> {
51 using iterator_concept =
typename I::iterator_concept;
54 template<
typename I,
typename =
void>
55 struct counted_iterator_iterator_category {};
57 struct counted_iterator_iterator_category<I,
void_t<typename I::iterator_category>> {
58 using iterator_category =
typename I::iterator_category;
68 :
public detail::counted_iterator_value_type<I>
69 ,
public detail::counted_iterator_iterator_concept<I>
70 ,
public detail::counted_iterator_iterator_category<I>
81 : current_(
std::move(x)), length_(n) {}
85 : current_(other.current_), length_(other.length_) {}
90 current_ = other.current_;
91 length_ = other.length_;
96 constexpr
const I&
base() const& noexcept {
100 return std::move(current_);
109 constexpr decltype(
auto) operator*() {
113 constexpr decltype(
auto) operator*()
const {
124 return this->
base()[n];
220 return x.
count() == 0;
223 return x.
count() == 0;
226 return x.
count() != 0;
229 return x.
count() != 0;
233 template<
typename I2 = I>
239 template<
typename I2>
276 template<
typename I,
bool = is_primary_iterator_traits<cxx20_iterator_traits<I>>::value >
277 struct counted_iterator_iterator_traits : cxx20_iterator_traits_sfinae<counted_iterator<I>> {};
280 struct counted_iterator_iterator_traits<I, false> : cxx20_iterator_traits<I> {
281 using pointer = std::conditional_t<
283 std::add_pointer_t<iter_reference_t<I>>,
289 struct is_primary_iterator_traits<
std::iterator_traits<counted_iterator<I>>>
290 : is_primary_iterator_traits<cxx20_iterator_traits<I>> {};
293 struct is_primary_iterator_traits<cxx20_iterator_traits<
counted_iterator<I>>>
294 : is_primary_iterator_traits<cxx20_iterator_traits<I>> {};
310 #if __cplusplus >= 202002L
316 template<::std::input_iterator I>
Definition: counted_iterator.hpp:71
constexpr difference_type count() const noexcept
Definition: counted_iterator.hpp:104
I iterator_type
Definition: counted_iterator.hpp:75
constexpr friend iter_difference_t< I > operator-(const counted_iterator &x, default_sentinel_t)
Definition: counted_iterator.hpp:246
constexpr friend bool operator>(const counted_iterator &x, const counted_iterator< I2 > &y)
Definition: counted_iterator.hpp:208
constexpr counted_iterator()=default
constexpr counted_iterator & operator-=(iter_difference_t< I > n)
Definition: counted_iterator.hpp:179
constexpr counted_iterator operator++(int)
Definition: counted_iterator.hpp:145
constexpr auto operator->() const noexcept
Definition: counted_iterator.hpp:117
constexpr counted_iterator operator-(iter_difference_t< I > n) const
Definition: counted_iterator.hpp:175
constexpr friend iter_rvalue_reference_t< I2 > iter_move(const counted_iterator &i) noexcept(noexcept(ranges::iter_move(i.base())))
Definition: counted_iterator.hpp:257
constexpr friend iter_difference_t< I > operator-(default_sentinel_t, const counted_iterator &y)
Definition: counted_iterator.hpp:251
constexpr counted_iterator & operator=(const counted_iterator< I2 > &other)
Definition: counted_iterator.hpp:89
constexpr friend void iter_swap(const counted_iterator &x, const counted_iterator< I2 > &y) noexcept(noexcept(ranges::iter_swap(x.base(), y.base())))
Definition: counted_iterator.hpp:262
constexpr counted_iterator operator+(iter_difference_t< I > n) const
Definition: counted_iterator.hpp:164
iter_difference_t< I > difference_type
Definition: counted_iterator.hpp:76
constexpr friend bool operator==(default_sentinel_t, const counted_iterator &x)
Definition: counted_iterator.hpp:222
constexpr friend iter_difference_t< I2 > operator-(const counted_iterator &x, const counted_iterator< I2 > &y)
Definition: counted_iterator.hpp:241
constexpr friend bool operator<(const counted_iterator &x, const counted_iterator< I2 > &y)
Definition: counted_iterator.hpp:192
constexpr counted_iterator & operator+=(iter_difference_t< I > n)
Definition: counted_iterator.hpp:168
constexpr friend bool operator>=(const counted_iterator &x, const counted_iterator< I2 > &y)
Definition: counted_iterator.hpp:213
constexpr friend bool operator==(const counted_iterator &x, default_sentinel_t)
Definition: counted_iterator.hpp:219
constexpr counted_iterator & operator--()
Definition: counted_iterator.hpp:151
constexpr counted_iterator(const counted_iterator< I2 > &other)
Definition: counted_iterator.hpp:84
constexpr friend std::enable_if_t< random_access_iterator< I2 >::value, counted_iterator > operator+(iter_difference_t< I > n, const counted_iterator &x)
Definition: counted_iterator.hpp:235
constexpr friend bool operator!=(default_sentinel_t, const counted_iterator &x)
Definition: counted_iterator.hpp:228
constexpr I base() &&
Definition: counted_iterator.hpp:99
constexpr friend bool operator<=(const counted_iterator &x, const counted_iterator< I2 > &y)
Definition: counted_iterator.hpp:203
constexpr counted_iterator(I x, iter_difference_t< I > n)
Definition: counted_iterator.hpp:80
constexpr counted_iterator & operator++()
Definition: counted_iterator.hpp:128
constexpr const I & base() const &noexcept
Definition: counted_iterator.hpp:96
constexpr counted_iterator operator--(int)
Definition: counted_iterator.hpp:157
constexpr friend bool operator!=(const counted_iterator &x, default_sentinel_t)
Definition: counted_iterator.hpp:225
constexpr friend bool operator!=(const counted_iterator &x, const counted_iterator< I2 > &y)
Definition: counted_iterator.hpp:198
constexpr friend bool operator==(const counted_iterator &x, const counted_iterator< I2 > &y)
Definition: counted_iterator.hpp:186
#define VCCC_CONSTEXPR_AFTER_CXX20
Definition: constexpr.hpp:26
#define VCCC_DEBUG_ASSERT(expr)
Definition: debug_assert.hpp:19
constexpr VCCC_INLINE_OR_STATIC detail_iter_move::iter_move_niebloid iter_move
Definition: iter_move.hpp:92
constexpr VCCC_INLINE_OR_STATIC detail_iter_swap::iter_swap_niebloid iter_swap
Definition: iter_swap.hpp:90
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_difference< T >::type iter_difference_t
Computes the difference type of T
Definition: iter_difference_t.hpp:49
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: cxx20_iterator_traits.hpp:188
Definition: default_sentinel_t.hpp:23