[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:
- Otherwise, if Base models bidirectional_range, then iterator_concept denotes bidirectional_iterator_tag.
- Otherwise, if Base models forward_range, then iterator_concept denotes forward_iterator_tag.
- Otherwise, iterator_concept denotes input_iterator_tag.
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_;