[range.enumerate.iterator] (original) (raw)

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-references<V> template<bool Const> class enumerate_view<V>::iterator { using Base = maybe-const<Const, V>; public: 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 = tuple<difference_type, range_reference_t<_Base_>>; iterator_t<_Base_> current_ = iterator_t<_Base_>(); difference_type pos_ = 0; constexpr explicit iterator(iterator_t<_Base_> current, difference_type pos); public: iterator() requires default_initializable<iterator_t<_Base_>> = default;constexpr iterator(iterator<!Const> i) requires Const && convertible_to<iterator_t<V>, 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) const requires 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_));} };}

The member typedef-name _iterator_​::​iterator_conceptis defined as follows:

constexpr explicit _iterator_(iterator_t<_Base_> current, difference_type pos);

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

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

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

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

Effects: Equivalent to: return current_;

constexpr iterator_t<_Base_> base() &&;

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

constexpr difference_type index() const noexcept;

Effects: Equivalent to: return pos_;

constexpr _iterator_& operator++();

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

constexpr void operator++(int);

Effects: Equivalent to ++*this.

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

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

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

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

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

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

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

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

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%5Faccess%5Frange "25.4.5 Other range refinements [range.refinements]")<_Base_>;

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%5Faccess%5Frange "25.4.5 Other range refinements [range.refinements]")<_Base_>;

Effects: Equivalent to: return y + x;

friend constexpr _iterator_ operator-(const _iterator_& x, difference_type y) requires [random_access_range](range.refinements#concept:random%5Faccess%5Frange "25.4.5 Other range refinements [range.refinements]")<_Base_>;

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

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

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