Files
2025-10-25 03:02:53 +03:00

224 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[simd.iterator]
# 29 Numerics library [[numerics]](./#numerics)
## 29.10 Data-parallel types [[simd]](simd#iterator)
### 29.10.6 Class template *simd-iterator* [simd.iterator]
[🔗](#lib:iterator,basic_vec)
namespace std::simd {template<class V>class *simd-iterator* { // *exposition only* V* *data_* = nullptr; // *exposition only**simd-size-type* *offset_* = 0; // *exposition only*constexpr *simd-iterator*(V& d, *simd-size-type* off) noexcept; // *exposition only*public:using value_type = typename V::value_type; using iterator_category = input_iterator_tag; using iterator_concept = random_access_iterator_tag; using difference_type = *simd-size-type*; constexpr *simd-iterator*() = default; constexpr *simd-iterator*(const *simd-iterator*&) = default; constexpr *simd-iterator*& operator=(const *simd-iterator*&) = default; constexpr *simd-iterator*(const *simd-iterator*<remove_const_t<V>>&) requires is_const_v<V>; constexpr value_type operator*() const; constexpr *simd-iterator*& operator++(); constexpr *simd-iterator* operator++(int); constexpr *simd-iterator*& operator--(); constexpr *simd-iterator* operator--(int); constexpr *simd-iterator*& operator+=(difference_type n); constexpr *simd-iterator*& operator-=(difference_type n); constexpr value_type operator[](difference_type n) const; friend constexpr bool operator==(*simd-iterator* a, *simd-iterator* b) = default; friend constexpr bool operator==(*simd-iterator* a, default_sentinel_t) noexcept; friend constexpr auto operator<=>(*simd-iterator* a, *simd-iterator* b); friend constexpr *simd-iterator* operator+(*simd-iterator* i, difference_type n); friend constexpr *simd-iterator* operator+(difference_type n, *simd-iterator* i); friend constexpr *simd-iterator* operator-(*simd-iterator* i, difference_type n); friend constexpr difference_type operator-(*simd-iterator* a, *simd-iterator* b); friend constexpr difference_type operator-(*simd-iterator* i, default_sentinel_t) noexcept; friend constexpr difference_type operator-(default_sentinel_t, *simd-iterator* i) noexcept; };}
[🔗](#itemdecl:1)
`constexpr simd-iterator(V& d, simd-size-type off) noexcept;
`
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17346)
*Effects*: Initializes *data_* with addressof(d) and *offset_* with off[.](#1.sentence-1)
[🔗](#itemdecl:2)
`constexpr simd-iterator(const simd-iterator<remove_const_t<V>>& i) requires is_const_v<V>;
`
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17356)
*Effects*: Initializes *data_* with i.*data_* and *offset_* with i.*offset_*[.](#2.sentence-1)
[🔗](#itemdecl:3)
`constexpr value_type operator*() const;
`
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17366)
*Effects*: Equivalent to: return (**data_*)[*offset_*];
[🔗](#itemdecl:4)
`constexpr simd-iterator& operator++();
`
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17376)
*Effects*: Equivalent to: return *this += 1;
[🔗](#itemdecl:5)
`constexpr simd-iterator operator++(int);
`
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17386)
*Effects*: Equivalent to:*simd-iterator* tmp = *this;*this += 1;return tmp;
[🔗](#itemdecl:6)
`constexpr simd-iterator& operator--();
`
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17401)
*Effects*: Equivalent to: return *this -= 1;
[🔗](#itemdecl:7)
`constexpr simd-iterator operator--(int);
`
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17411)
*Effects*: Equivalent to:*simd-iterator* tmp = *this;*this -= 1;return tmp;
[🔗](#itemdecl:8)
`constexpr simd-iterator& operator+=(difference_type n);
`
[8](#8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17426)
*Preconditions*: *offset_* + n is in the range [0, V::size()][.](#8.sentence-1)
[9](#9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17430)
*Effects*: Equivalent to:*offset_* += n;return *this;
[🔗](#itemdecl:9)
`constexpr simd-iterator& operator-=(difference_type n);
`
[10](#10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17444)
*Preconditions*: *offset_* - n is in the range [0, V::size()][.](#10.sentence-1)
[11](#11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17448)
*Effects*: Equivalent to:*offset_* -= n;return *this;
[🔗](#itemdecl:10)
`constexpr value_type operator[](difference_type n) const;
`
[12](#12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17462)
*Effects*: Equivalent to: return (**data_*)[*offset_* + n];
[🔗](#itemdecl:11)
`friend constexpr bool operator==(simd-iterator i, default_sentinel_t) noexcept;
`
[13](#13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17472)
*Effects*: Equivalent to: return i.*offset_* == V::size();
[🔗](#itemdecl:12)
`friend constexpr auto operator<=>(simd-iterator a, simd-iterator b);
`
[14](#14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17482)
*Preconditions*: a.*data_* == b.*data_* is true[.](#14.sentence-1)
[15](#15)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17486)
*Effects*: Equivalent to: return a.*offset_* <=> b.*offset_*;
[🔗](#itemdecl:13)
`friend constexpr simd-iterator operator+(simd-iterator i, difference_type n);
friend constexpr simd-iterator operator+(difference_type n, simd-iterator i);
`
[16](#16)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17497)
*Effects*: Equivalent to: return i += n;
[🔗](#itemdecl:14)
`friend constexpr simd-iterator operator-(simd-iterator i, difference_type n);
`
[17](#17)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17507)
*Effects*: Equivalent to: return i -= n;
[🔗](#itemdecl:15)
`friend constexpr difference_type operator-(simd-iterator a, simd-iterator b);
`
[18](#18)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17517)
*Preconditions*: a.*data_* == b.*data_* is true[.](#18.sentence-1)
[19](#19)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17521)
*Effects*: Equivalent to: return a.*offset_* - b.*offset_*;
[🔗](#itemdecl:16)
`friend constexpr difference_type operator-(simd-iterator i, default_sentinel_t) noexcept;
`
[20](#20)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17531)
*Effects*: Equivalent to: return i.*offset_* - V::size();
[🔗](#itemdecl:17)
`friend constexpr difference_type operator-(default_sentinel_t, simd-iterator i) noexcept;
`
[21](#21)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17542)
*Effects*: Equivalent to: return V::size() - i.*offset_*;