Files
2025-10-25 03:02:53 +03:00

12 KiB
Raw Permalink Blame History

[range.enumerate.iterator]

25 Ranges library [ranges]

25.7 Range adaptors [range.adaptors]

25.7.24 Enumerate view [range.enumerate]

25.7.24.3 Class template enumerate_view::iterator [range.enumerate.iterator]

🔗

namespace std::ranges {template<view V>requires range-with-movable-referencestemplateclass enumerate_view::iterator {using Base = maybe-const<Const, V>; // exposition onlypublic:using iterator_category = input_iterator_tag; using iterator_concept = see below; using difference_type = range_difference_t<Base>; using value_type = tuple<difference_type, range_value_t<Base>>; private:using reference-type = // exposition only tuple<difference_type, range_reference_t<Base>>; iterator_t<Base> current_ = iterator_t<Base>(); // exposition only difference_type pos_ = 0; // exposition onlyconstexpr explicititerator(iterator_t<Base> current, difference_type pos); // exposition onlypublic:iterator() requires default_initializable<iterator_t<Base>> = default; constexpr iterator(iterator i)requires Const && convertible_to<iterator_t, iterator_t<Base>>; constexpr const iterator_t<Base>& base() const & noexcept; constexpr iterator_t<Base> base() &&; constexpr difference_type index() const noexcept; constexpr auto operator*() const {return reference-type(pos_, **current_*); }constexpr iterator& operator++(); constexpr void operator++(int); constexpr iterator operator++(int) requires forward_range<Base>; constexpr iterator& operator--() requires bidirectional_range<Base>; constexpr iterator operator--(int) requires bidirectional_range<Base>; constexpr iterator& operator+=(difference_type x)requires random_access_range<Base>; constexpr iterator& operator-=(difference_type x)requires random_access_range<Base>; constexpr auto operator[](difference_type n) constrequires random_access_range<Base>{ return reference-type(pos_ + n, current_[n]); }friend constexpr bool operator==(const iterator& x, const iterator& y) noexcept; friend constexpr strong_ordering operator<=>(const iterator& x, const iterator& y) noexcept; friend constexpr iterator operator+(const iterator& x, difference_type y)requires random_access_range<Base>; friend constexpr iterator operator+(difference_type x, const iterator& y)requires random_access_range<Base>; friend constexpr iterator operator-(const iterator& x, difference_type y)requires random_access_range<Base>; friend constexpr difference_type operator-(const iterator& x, const iterator& y) noexcept; friend constexpr auto iter_move(const iterator& i)noexcept(noexcept(ranges::iter_move(i.current_)) && is_nothrow_move_constructible_v<range_rvalue_reference_t<Base>>) {return tuple<difference_type, range_rvalue_reference_t<Base>>(i.pos_, ranges::iter_move(i.current_)); }};}

1

#

The member typedef-nameiterator::iterator_concept is defined as follows:

🔗

constexpr explicit iterator(iterator_t<Base> current, difference_type pos);

2

#

Effects: Initializes current_ with std::move(current) andpos_ with pos.

🔗

constexpr iterator(iterator<!Const> i) requires Const && [convertible_to](concept.convertible#concept:convertible_to "18.4.4Concept convertible_­to[concept.convertible]")<iterator_t<V>, iterator_t<Base>>;

3

#

Effects: Initializes current_ with std::move(i.current_) andpos_ with i.pos_.

🔗

constexpr const iterator_t<Base>& base() const & noexcept;

4

#

Effects: Equivalent to: return current_;

🔗

constexpr iterator_t<Base> base() &&;

5

#

Effects: Equivalent to: return std::move(current_);

🔗

constexpr difference_type index() const noexcept;

6

#

Effects: Equivalent to: return pos_;

🔗

constexpr iterator& operator++();

7

#

Effects: Equivalent to:++current_;++pos_;return *this;

🔗

constexpr void operator++(int);

8

#

Effects: Equivalent to ++*this.

🔗

constexpr iterator operator++(int) requires [forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]")<Base>;

9

#

Effects: Equivalent to:auto temp = *this;++*this;return temp;

🔗

constexpr iterator& operator--() requires [bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6Other range refinements[range.refinements]")<Base>;

10

#

Effects: Equivalent to:--current_;--pos_;return *this;

🔗

constexpr iterator operator--(int) requires [bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6Other range refinements[range.refinements]")<Base>;

11

#

Effects: Equivalent to:auto temp = *this;--*this;return temp;

🔗

constexpr iterator& operator+=(difference_type n) requires [random_access_range](range.refinements#concept:random_access_range "25.4.6Other range refinements[range.refinements]")<Base>;

12

#

Effects: Equivalent to:current_ += n;pos_ += n;return *this;

🔗

constexpr iterator& operator-=(difference_type n) requires [random_access_range](range.refinements#concept:random_access_range "25.4.6Other range refinements[range.refinements]")<Base>;

13

#

Effects: Equivalent to:current_ -= n;pos_ -= n;return *this;

🔗

friend constexpr bool operator==(const iterator& x, const iterator& y) noexcept;

14

#

Effects: Equivalent to: return x.pos_ == y.pos_;

🔗

friend constexpr strong_ordering operator<=>(const iterator& x, const iterator& y) noexcept;

15

#

Effects: Equivalent to: return x.pos_ <=> y.pos_;

🔗

friend constexpr iterator operator+(const iterator& x, difference_type y) requires [random_access_range](range.refinements#concept:random_access_range "25.4.6Other range refinements[range.refinements]")<Base>;

16

#

Effects: Equivalent to:auto temp = x; temp += y;return temp;

🔗

friend constexpr iterator operator+(difference_type x, const iterator& y) requires [random_access_range](range.refinements#concept:random_access_range "25.4.6Other range refinements[range.refinements]")<Base>;

17

#

Effects: Equivalent to: return y + x;

🔗

friend constexpr iterator operator-(const iterator& x, difference_type y) requires [random_access_range](range.refinements#concept:random_access_range "25.4.6Other range refinements[range.refinements]")<Base>;

18

#

Effects: Equivalent to:auto temp = x; temp -= y;return temp;

🔗

friend constexpr difference_type operator-(const iterator& x, const iterator& y) noexcept;

19

#

Effects: Equivalent to: return x.pos_ - y.pos_;