[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:

[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_;}