Scroll to navigation

std::ranges::iota_view::iterator(3) C++ Standard Libary std::ranges::iota_view::iterator(3)

NAME

std::ranges::iota_view::iterator - std::ranges::iota_view::iterator

Synopsis


struct /*iterator*/; (1) (since C++20)
(exposition only*)
Helper alias templates
template< class I > (2) (exposition only*)
using /*iota-diff-t*/ = /* see below */;
Helper concepts
template< class I >


concept /*decrementable*/ =
std::incrementable<I> && requires(I i) { (3) (exposition only*)
{ --i } -> std::same_as<I&>;
{ i-- } -> std::same_as<I>;


};
template< class I >


concept /*advanceable*/ =
/*decrementable*/<I> && std::totally_ordered<I> &&
requires(I i, const I j, const /*iota-diff-t*/<I> n) {
{ i += n } -> std::same_as<I&>;
{ i -= n } -> std::same_as<I&>; (4) (exposition only*)
I(j + n);
I(n + j);
I(j - n);
{ j - j } -> std::convertible_to</*iota-diff-t*/<I>>;


};


1) The return type of iota_view::begin.
2) The alias template /*iota-diff-t*/ calculates the difference type for both
iterator types and integer-like types.
* If W is not an integral type, or if it is an integral type and
sizeof(std::iter_difference_t<I>) is greater than sizeof(I), then
/*iota-diff-t*/<I> is std::iter_difference_t<I>.
* Otherwise, /*iota-diff-t*/<I> is a signed integer type of width greater than the
width of I if such a type exists.
* Otherwise, I is one of the widest integral types, and /*iota-diff-t*/<I> is an
unspecified signed-integer-like type of width not less than the width of I. It
is unspecified whether /*iota-diff-t*/<I> models weakly_incrementable in this
case.
3) The concept decrementable specifies that a type is incrementable, and pre- and
post- operator-- for the type have common meaning.
4) The concept advanceable specifies that a type is both decrementable and
totally_ordered, and operator+=, operator-=, operator+, and operator- among the type
and its different type have common meaning.

Member types


Member type Definition
* std::random_access_iterator_tag if W models advanceable.
Otherwise,
* std::bidirectional_iterator_tag if W models decrementable.
iterator_concept Otherwise,
* std::forward_iterator_tag if W models incrementable.
Otherwise,
* std::input_iterator_tag.
iterator_category std::input_iterator_tag if W models incrementable.
Otherwise, there is no member type iterator_category.
value_type W
difference_type /*iota-diff-t*/<W>


Notes: /*iterator*/ is


* random_access_iterator if W models advanceable,
* bidirectional_iterator if W models decrementable,
* forward_iterator if W models incrementable, and
* input_iterator otherwise.


However, it only satisfies LegacyInputIterator if W models incrementable, and does
not satisfy LegacyInputIterator otherwise.


Data members


Member name Definition
value_ (private) The value of type W used for dereferencing.
(exposition-only member object*)

Member functions

std::ranges::iota_view::iterator::iterator


/*iterator*/() requires std::default_initializable<W> = default; (1) (since C++20)
constexpr explicit /*iterator*/( W value ); (2) (since C++20)


1) Value initializes the data member value_ via its default member initializer (=
W()).
2) Initializes the data member value_ with value. This value will be returned by
operator* and incremented by operator++.

std::ranges::iota_view::iterator::operator*


constexpr W operator*() const (since C++20)
noexcept(std::is_nothrow_copy_constructible_v<W>);


Returns the current value, by value (in other words, this is a read-only view).

std::ranges::iota_view::iterator::operator++


constexpr /*iterator*/& operator++(); (1) (since C++20)
constexpr void operator++(int); (2) (since C++20)
constexpr /*iterator*/ operator++(int) requires (3) (since C++20)
std::incrementable<W>;


1) Equivalent to ++value_; return *this;.
2) Equivalent to ++value_;.
3) Equivalent to auto tmp = *this; ++value_; return tmp;.

std::ranges::iota_view::iterator::operator--


constexpr /*iterator*/& operator--() requires (1) (since C++20)
/*decrementable*/<W>;
constexpr /*iterator*/operator--(int) requires (2) (since C++20)
/*decrementable*/<W>;


1) Equivalent to --value_; return *this;.
2) Equivalent to auto tmp = *this; --value_; return tmp;.

std::ranges::iota_view::iterator::operator+=


constexpr /*iterator*/& operator+=( difference_type n ) (since C++20)
requires /*advanceable*/<W>;


If W is unsigned-integer-like, performs value_ += static_cast<W>(n) if n is
non-negative, value -= static_cast<W>(-n) otherwise, and then returns *this.


Otherwise, equivalent to value_ += n; return *this;.

std::ranges::iota_view::iterator::operator-=


constexpr /*iterator*/& operator-=( difference_type n ) (since C++20)
requires /*advanceable*/<W>;


If W is unsigned-integer-like, performs value_ -= static_cast<W>(n) if n is
non-negative, or value += static_cast<W>(-n) otherwise, and then returns *this.


Otherwise, equivalent to value_ -= n; return *this;.

std::ranges::iota_view::iterator::operator[]


constexpr W operator[]( difference_type n ) const (since C++20)
requires /*advanceable*/<W>;


Equivalent to return W(value_ + n);.

Non-member functions

operator==, <, >, <=, >=, <=>(std::ranges::iota_view::iterator)


friend constexpr bool operator== ( const /*iterator*/& x, const
/*iterator*/& y ) (1) (since C++20)
requires std::equality_comparable<W>;
friend constexpr bool operator< ( const /*iterator*/& x, const
/*iterator*/& y ) (2) (since C++20)
requires std::totally_ordered<W>;
friend constexpr bool operator> ( const /*iterator*/& x, const
/*iterator*/& y ) (3) (since C++20)
requires std::totally_ordered<W>;
friend constexpr bool operator<= ( const /*iterator*/& x, const
/*iterator*/& y ) (4) (since C++20)
requires std::totally_ordered<W>;
friend constexpr bool operator>= ( const /*iterator*/& x, const
/*iterator*/& y ) (5) (since C++20)
requires std::totally_ordered<W>;
friend constexpr bool operator<=>( const /*iterator*/& x, const
/*iterator*/& y ) (6) (since C++20)
requires std::totally_ordered<W> &&
std::three_way_comparable<W>;


1) Equivalent to return x.value_ == y.value_;.
2) Equivalent to return x.value_ < y.value_;.
3) Equivalent to return y < x;.
4) Equivalent to return !(y < x);.
5) Equivalent to return !(x < y);.
6) Equivalent to return x.value_ <=> y.value_;.


The != operator is synthesized from operator==.


These functions are not visible to ordinary unqualified or qualified lookup, and can
only be found by argument-dependent lookup when iterator is an associated class of
the arguments.

operator+(std::ranges::iota_view::iterator)


friend constexpr /*iterator*/ operator+( /*iterator*/ i,
difference_type n ) (1) (since C++20)
requires /*advanceable*/<W>;
friend constexpr /*iterator*/ operator+( difference_type n,
/*iterator*/ i ) (2) (since C++20)
requires /*advanceable*/<W>;


Equivalent to i += n; return i;.


These functions are not visible to ordinary unqualified or qualified lookup, and can
only be found by argument-dependent lookup when iterator is an associated class of
the arguments.

operator-(std::ranges::iota_view::iterator)


friend constexpr /*iterator*/ operator-( /*iterator*/ i,
difference_type n ) (1) (since C++20)
requires /*advanceable*/<W>;
friend constexpr difference_type operator-( const /*iterator*/& x,


const /*iterator*/& y (2) (since C++20)
)


requires /*advanceable*/<W>;


1) Equivalent to i -= n; return i;.
2) Let D be difference_type.
* If W is signed-integer-like, equivalent to return D(D(x.value_) - D(y.value_));.
* Otherwise, if W is unsigned-integer-like, equivalent to return y.value_ >
x.value_ ? D(-D(y.value_ - x.value_)) : D(x.value_ - y.value_);.
* Otherwise, equivalent to return x.value_ - y.value_;.


These functions are not visible to ordinary unqualified or qualified lookup, and can
only be found by argument-dependent lookup when iterator is an associated class of
the arguments.


Defect reports


The following behavior-changing defect reports were applied retroactively to
previously published C++ standards.


DR Applied to Behavior as published Correct behavior
P2259R1 C++20 member iterator_category is always defined only if W satisfies
defined incrementable
LWG 3580 C++20 bodies of operator+ and operator- made suitable for implicit
rule out implicit move move

2024.06.10 http://cppreference.com