From a509a0239ec4f45953f4d7fbdec5009e1e42ceaf Mon Sep 17 00:00:00 2001 From: Matthias Kretz Date: Sat, 21 Jun 2025 14:52:27 +0300 Subject: [PATCH 1/2] P3480R6 std::simd is a range The feature test macro is not changed, since it was already updated in the previous motion. --- source/numerics.tex | 272 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) diff --git a/source/numerics.tex b/source/numerics.tex index ea3a918429..384ee87a56 100644 --- a/source/numerics.tex +++ b/source/numerics.tex @@ -17204,6 +17204,262 @@ specialization \tcode{\exposid{overaligned-flag}}. \end{itemdescr} +\rSec2[simd.iterator]{Class \exposid{simd-iterator}} +\begin{codeblock} +namespace std::datapar { + template + class @\exposidnc{simd-iterator}@ { // \expos + V* @\exposid{data_}@ = nullptr; // \expos + @\exposid{simd-size-type}@ @\exposidnc{offset_}@ = 0; // \expos + + constexpr @\exposidnc{simd-iterator}@(V& d, @\exposidnc{simd-size-type}@ off) noexcept; // \expos + + public: + using value_type = typename V::value_type; + using iterator_category = input_iterator_tag; + using iterator_concept = random_access_iterator_tag; + using difference_type = @\exposid{simd-size-type}@; + + constexpr @\exposid{simd-iterator}@() = default; + + constexpr @\exposid{simd-iterator}@(const @\exposid{simd-iterator}@&) = default; + constexpr @\exposid{simd-iterator}@& operator=(const @\exposid{simd-iterator}@&) = default; + + constexpr @\exposid{simd-iterator}@(const @\exposid{simd-iterator}@>&) requires is_const_v; + + constexpr value_type operator*() const; + + constexpr @\exposid{simd-iterator}@& operator++(); + constexpr @\exposid{simd-iterator}@ operator++(int); + constexpr @\exposid{simd-iterator}@& operator--(); + constexpr @\exposid{simd-iterator}@ operator--(int); + + constexpr @\exposid{simd-iterator}@& operator+=(difference_type n); + constexpr @\exposid{simd-iterator}@& operator-=(difference_type n); + + constexpr value_type operator[](difference_type n) const; + + friend constexpr bool operator==(@\exposid{simd-iterator}@ a, @\exposid{simd-iterator}@ b) = default; + friend constexpr bool operator==(@\exposid{simd-iterator}@ a, default_sentinel_t) noexcept; + friend constexpr auto operator<=>(@\exposid{simd-iterator}@ a, @\exposid{simd-iterator}@ b); + + friend constexpr @\exposid{simd-iterator}@ operator+(@\exposid{simd-iterator}@ i, difference_type n); + friend constexpr @\exposid{simd-iterator}@ operator+(difference_type n, @\exposid{simd-iterator}@ i); + friend constexpr @\exposid{simd-iterator}@ operator-(@\exposid{simd-iterator}@ i, difference_type n); + + friend constexpr difference_type operator-(@\exposid{simd-iterator}@ a, @\exposid{simd-iterator}@ b); + friend constexpr difference_type operator-(@\exposid{simd-iterator}@ i, default_sentinel_t) noexcept; + friend constexpr difference_type operator-(default_sentinel_t, @\exposid{simd-iterator}@ i) noexcept; + }; +} +\end{codeblock} + +\begin{itemdecl} +constexpr @\exposid{simd-iterator}@(V& d, @\exposid{simd-size-type}@ off) noexcept; +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Initializes \exposid{data_} with \tcode{addressof(d)} and \exposid{offset_} with \tcode{off}. +\end{itemdescr} + +\begin{itemdecl} +constexpr @\exposid{simd-iterator}@(const @\exposid{simd-iterator}@>& i) requires is_const_v; +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Initializes \exposid{data_} with \tcode{i.\exposid{data_}} and \exposid{offset_} with \tcode{i.\exposid{offset_}}. +\end{itemdescr} + +\begin{itemdecl} +constexpr value_type operator*() const; +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return (*\exposid{data_})[\exposid{offset_}];} +\end{itemdescr} + +\begin{itemdecl} +constexpr @\exposid{simd-iterator}@& operator++(); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return *this += 1;} +\end{itemdescr} + +\begin{itemdecl} +constexpr @\exposid{simd-iterator}@ operator++(int); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: +\begin{codeblock} +@\exposid{simd-iterator}@ tmp = *this; +*this += 1; +return tmp; +\end{codeblock} +\end{itemdescr} + +\begin{itemdecl} +constexpr @\exposid{simd-iterator}@& operator--(); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return *this -= 1;} +\end{itemdescr} + +\begin{itemdecl} +constexpr @\exposid{simd-iterator}@ operator--(int); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: +\begin{codeblock} +@\exposid{simd-iterator}@ tmp = *this; +*this -= 1; +return tmp; +\end{codeblock} +\end{itemdescr} + +\begin{itemdecl} +constexpr @\exposid{simd-iterator}@& operator+=(difference_type n); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\expects +\tcode{\exposid{offset_} + n} is in the range \crange{0}{V::size()}. + +\pnum +\effects +Equivalent to: +\begin{codeblock} +@\exposid{offset_}@ += n; +return *this; +\end{codeblock} +\end{itemdescr} + +\begin{itemdecl} +constexpr @\exposid{simd-iterator}@& operator-=(difference_type n); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\expects +\tcode{\exposid{offset_} - n} is in the range \crange{0}{V::size()}. + +\pnum +\effects +Equivalent to: +\begin{codeblock} +@\exposid{offset_}@ -= n; +return *this; +\end{codeblock} +\end{itemdescr} + +\begin{itemdecl} +constexpr value_type operator[](difference_type n) const; +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return (*\exposid{data_})[\exposid{offset_} + n];} +\end{itemdescr} + +\begin{itemdecl} +friend constexpr bool operator==(@\exposid{simd-iterator}@ i, default_sentinel_t) noexcept; +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return i.\exposid{offset_} == V::size();} +\end{itemdescr} + +\begin{itemdecl} +friend constexpr auto operator<=>(@\exposid{simd-iterator}@ a, @\exposid{simd-iterator}@ b); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\expects +\tcode{a.\exposid{data_} == b.\exposid{data_}} is \tcode{true}. + +\pnum +\effects +Equivalent to: \tcode{return a.\exposid{offset_} <=> b.\exposid{offset_};} +\end{itemdescr} + +\begin{itemdecl} +friend constexpr @\exposid{simd-iterator}@ operator+(@\exposid{simd-iterator}@ i, difference_type n); +friend constexpr @\exposid{simd-iterator}@ operator+(difference_type n, @\exposid{simd-iterator}@ i); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return i += n;} +\end{itemdescr} + +\begin{itemdecl} +friend constexpr @\exposid{simd-iterator}@ operator-(@\exposid{simd-iterator}@ i, difference_type n); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return i -= n;} +\end{itemdescr} + +\begin{itemdecl} +friend constexpr difference_type operator-(@\exposid{simd-iterator}@ a, @\exposid{simd-iterator}@ b); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\expects +\tcode{a.\exposid{data_} == b.\exposid{data_}} is \tcode{true}. + +\pnum +\effects +Equivalent to: \tcode{return a.\exposid{offset_} - b.\exposid{offset_};} +\end{itemdescr} + +\begin{itemdecl} +friend constexpr difference_type operator-(@\exposid{simd-iterator}@ i, default_sentinel_t) noexcept; +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return i.\exposid{offset_} - V::size();} +\end{itemdescr} + + +\begin{itemdecl} +friend constexpr difference_type operator-(default_sentinel_t, @\exposid{simd-iterator}@ i) noexcept; +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return V::size() - i.\exposid{offset_};} +\end{itemdescr} + \rSec2[simd.class]{Class template \tcode{basic_simd}} \rSec3[simd.overview]{Class template \tcode{basic_simd} overview} @@ -17215,6 +17471,14 @@ using value_type = T; using mask_type = basic_simd_mask; using abi_type = Abi; + using @\libmember{iterator}{basic_simd}@ = @\exposid{simd-iterator}@; + using @\libmember{const_iterator}{basic_simd}@ = @\exposid{simd-iterator}@; + + constexpr iterator @\libmember{begin}{basic_simd}@() noexcept { return {*this, 0}; } + constexpr const_iterator @\libmember{begin}{basic_simd}@() const noexcept { return {*this, 0}; } + constexpr const_iterator @\libmember{cbegin}{basic_simd}@() const noexcept { return {*this, 0}; } + constexpr default_sentinel_t @\libmember{end}{basic_simd}@() const noexcept { return {}; } + constexpr default_sentinel_t @\libmember{cend}{basic_simd}@() const noexcept { return {}; } static constexpr integral_constant<@\exposid{simd-size-type}@, @\exposid{simd-size-v}@> size {}; @@ -19101,6 +19365,14 @@ public: using value_type = bool; using abi_type = Abi; + using @\libmember{iterator}{basic_simd_mask}@ = @\exposid{simd-iterator}@; + using @\libmember{const_iterator}{basic_simd_mask}@ = @\exposid{simd-iterator}@; + + constexpr iterator @\libmember{begin}{basic_simd_mask}@() noexcept { return {*this, 0}; } + constexpr const_iterator @\libmember{begin}{basic_simd_mask}@() const noexcept { return {*this, 0}; } + constexpr const_iterator @\libmember{cbegin}{basic_simd_mask}@() const noexcept { return {*this, 0}; } + constexpr default_sentinel_t @\libmember{end}{basic_simd_mask}@() const noexcept { return {}; } + constexpr default_sentinel_t @\libmember{cend}{basic_simd_mask}@() const noexcept { return {}; } static constexpr integral_constant<@\exposid{simd-size-type}@, @\exposid{simd-size-v}@<@\exposid{integer-from}@, Abi>> size {}; From 1ddaeace00da44ea30259ed57c90dbad741aab96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20K=C3=B6ppe?= Date: Tue, 15 Jul 2025 19:50:25 +0100 Subject: [PATCH 2/2] [simd.syn] Add simd-iterator to header synopsis --- source/numerics.tex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/numerics.tex b/source/numerics.tex index 384ee87a56..bd3ff637f8 100644 --- a/source/numerics.tex +++ b/source/numerics.tex @@ -16509,6 +16509,10 @@ template requires (has_single_bit(N)) constexpr flags<@\exposid{overaligned-flag}@> flag_overaligned{}; + // \ref{simd.iterator}, Class template \exposid{simd-iterator} + template + class @\exposidnc{simd-iterator}@; // \expos + // \ref{simd.class}, Class template \tcode{basic_simd} template> class basic_simd; template>> @@ -17204,7 +17208,7 @@ specialization \tcode{\exposid{overaligned-flag}}. \end{itemdescr} -\rSec2[simd.iterator]{Class \exposid{simd-iterator}} +\rSec2[simd.iterator]{Class template \exposid{simd-iterator}} \begin{codeblock} namespace std::datapar { template