[range.iota.iterator] (original) (raw)
25 Ranges library [ranges]
25.6 Range factories [range.factories]
25.6.4 Iota view [range.iota]
25.6.4.3 Class iota_view::iterator [range.iota.iterator]
namespace std::ranges { template<weakly_incrementable W, semiregular Bound> requires weakly-equality-comparable-with<W, Bound> && copyable<W> struct iota_view<W, Bound>::iterator { private: W value_ = W(); public: using iterator_concept = see below;using iterator_category = input_iterator_tag; using value_type = W;using difference_type = IOTA-DIFF-T(W);iterator() requires default_initializable<W> = default;constexpr explicit iterator(W value);constexpr W operator*() const noexcept(is_nothrow_copy_constructible_v<W>);constexpr iterator& operator++();constexpr void operator++(int);constexpr iterator operator++(int) requires incrementable<W>;constexpr iterator& operator--() requires decrementable<W>;constexpr iterator operator--(int) requires decrementable<W>;constexpr iterator& operator+=(difference_type n) requires advanceable<W>;constexpr iterator& operator-=(difference_type n) requires advanceable<W>;constexpr W operator[](difference_type n) const requires advanceable<W>;friend constexpr bool operator==(const iterator& x, const iterator& y) requires equality_comparable<W>;friend constexpr bool operator<(const _iterator_& x, const _iterator_& y) requires totally_ordered<W>;friend constexpr bool operator>(const iterator& x, const iterator& y) requires totally_ordered<W>;friend constexpr bool operator<=(const _iterator_& x, const _iterator_& y) requires totally_ordered<W>;friend constexpr bool operator>=(const iterator& x, const iterator& y) requires totally_ordered<W>;friend constexpr auto operator<=>(const iterator& x, const iterator& y) requires totally_ordered<W> && three_way_comparable<W>;friend constexpr iterator operator+(iterator i, difference_type n) requires advanceable<W>;friend constexpr iterator operator+(difference_type n, iterator i) requires advanceable<W>;friend constexpr iterator operator-(iterator i, difference_type n) requires advanceable<W>;friend constexpr difference_type operator-(const iterator& x, const iterator& y) requires advanceable<W>;};}
_iterator_::iterator_concept is defined as follows:
- If W models advanceable, theniterator_concept is random_access_iterator_tag.
- Otherwise, if W models decrementable, theniterator_concept is bidirectional_iterator_tag.
- Otherwise, if W models incrementable, theniterator_concept is forward_iterator_tag.
- Otherwise, iterator_concept is input_iterator_tag.
[Note 1:
Overloads for iter_move and iter_swap are omitted intentionally.
— _end note_]
constexpr explicit _iterator_(W value);
Effects: Initializes value_ with value.
constexpr W operator*() const noexcept(is_nothrow_copy_constructible_v<W>);
Effects: Equivalent to: return value_;
[Note 2:
The noexcept clause is needed by the default iter_moveimplementation.
— _end note_]
constexpr _iterator_& operator++();
Effects: Equivalent to:++value_;return *this;
constexpr void operator++(int);
Effects: Equivalent to ++*this.
Effects: Equivalent to:auto tmp = *this;++*this;return tmp;
Effects: Equivalent to:--value_;return *this;
Effects: Equivalent to:auto tmp = *this;--*this;return tmp;
constexpr _iterator_& operator+=(difference_type n) requires [_advanceable_](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:if constexpr (is-integer-like<W> && !is-signed-integer-like<W>) { if (n >= difference_type(0)) value_ += static_cast<W>(n);else value_ -= static_cast<W>(-n);} else { value_ += n;} return *this;
constexpr _iterator_& operator-=(difference_type n) requires [_advanceable_](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:if constexpr (is-integer-like<W> && !is-signed-integer-like<W>) { if (n >= difference_type(0)) value_ -= static_cast<W>(n);else value_ += static_cast<W>(-n);} else { value_ -= n;} return *this;
constexpr W operator[](difference_type n) const requires [_advanceable_](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to: return W(value_ + n);
friend constexpr bool operator==(const _iterator_& x, const _iterator_& y) requires [equality_comparable](concept.equalitycomparable#concept:equality%5Fcomparable "18.5.4 Concept equality_comparable [concept.equalitycomparable]")<W>;
Effects: Equivalent to: return x.value_ == y.value_;
friend constexpr bool operator<(const _iterator_& x, const _iterator_& y) requires [totally_ordered](concept.totallyordered#concept:totally%5Fordered "18.5.5 Concept totally_ordered [concept.totallyordered]")<W>;
Effects: Equivalent to: return x.value_ < y.value_;
friend constexpr bool operator>(const _iterator_& x, const _iterator_& y) requires [totally_ordered](concept.totallyordered#concept:totally%5Fordered "18.5.5 Concept totally_ordered [concept.totallyordered]")<W>;
Effects: Equivalent to: return y < x;
friend constexpr bool operator<=(const _iterator_& x, const _iterator_& y) requires [totally_ordered](concept.totallyordered#concept:totally%5Fordered "18.5.5 Concept totally_ordered [concept.totallyordered]")<W>;
Effects: Equivalent to: return !(y < x);
friend constexpr bool operator>=(const _iterator_& x, const _iterator_& y) requires [totally_ordered](concept.totallyordered#concept:totally%5Fordered "18.5.5 Concept totally_ordered [concept.totallyordered]")<W>;
Effects: Equivalent to: return !(x < y);
Effects: Equivalent to: return x.value_ <=> y.value_;
friend constexpr _iterator_ operator+(_iterator_ i, difference_type n) requires [_advanceable_](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:i += n;return i;
friend constexpr _iterator_ operator+(difference_type n, _iterator_ i) requires [_advanceable_](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to: return i + n;
friend constexpr _iterator_ operator-(_iterator_ i, difference_type n) requires [_advanceable_](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:i -= n;return i;
friend constexpr difference_type operator-(const _iterator_& x, const _iterator_& y) requires [_advanceable_](range.iota.view#concept:advanceable "25.6.4.2 Class template iota_view [range.iota.view]")<W>;
Effects: Equivalent to:using D = difference_type;if constexpr (is-integer-like<W>) { if constexpr (is-signed-integer-like<W>) return D(D(x.value_) - D(y.value_));else return (y.value_ > x.value_) ? D(-D(y.value_ - x.value_)) : D(x.value_ - y.value_);} else { return x.value_ - y.value_;}