@@ -17204,6 +17204,262 @@
1720417204 specialization \tcode{\exposid{overaligned-flag}<std::min(N1, N2)>}.
1720517205\end{itemdescr}
1720617206
17207+ \rSec2[simd.iterator]{Class \exposid{simd-iterator}}
17208+ \begin{codeblock}
17209+ namespace std::datapar {
17210+ template<class V>
17211+ class @\exposidnc{simd-iterator}@ { // \expos
17212+ V* @\exposidnc{data_}@ = nullptr; // \expos
17213+ @\exposidnc{simd-size-type} \exposidnc{offset_}@ = 0; // \expos
17214+
17215+ constexpr @\exposid{simd-iterator}@(V& d, @\exposid{simd-size-type}@ off) noexcept; // \expos
17216+
17217+ public:
17218+ using value_type = typename V::value_type;
17219+ using iterator_category = input_iterator_tag;
17220+ using iterator_concept = random_access_iterator_tag;
17221+ using difference_type = @\exposid{simd-size-type}@;
17222+
17223+ constexpr @\exposid{simd-iterator}@() = default;
17224+
17225+ constexpr @\exposid{simd-iterator}@(const @\exposid{simd-iterator}@&) = default;
17226+ constexpr @\exposid{simd-iterator}@& operator=(const @\exposid{simd-iterator}@&) = default;
17227+
17228+ constexpr @\exposid{simd-iterator}@(const @\exposid{simd-iterator}@<remove_const_t<V>>&) requires is_const_v<V>;
17229+
17230+ constexpr value_type operator*() const;
17231+
17232+ constexpr @\exposid{simd-iterator}@& operator++();
17233+ constexpr @\exposid{simd-iterator}@ operator++(int);
17234+ constexpr @\exposid{simd-iterator}@& operator--();
17235+ constexpr @\exposid{simd-iterator}@ operator--(int);
17236+
17237+ constexpr @\exposid{simd-iterator}@& operator+=(difference_type n);
17238+ constexpr @\exposid{simd-iterator}@& operator-=(difference_type n);
17239+
17240+ constexpr value_type operator[](difference_type n) const;
17241+
17242+ friend constexpr bool operator==(@\exposid{simd-iterator}@ a, @\exposid{simd-iterator}@ b) = default;
17243+ friend constexpr bool operator==(@\exposid{simd-iterator}@ a, default_sentinel_t) noexcept;
17244+ friend constexpr auto operator<=>(@\exposid{simd-iterator}@ a, @\exposid{simd-iterator}@ b);
17245+
17246+ friend constexpr @\exposid{simd-iterator}@ operator+(@\exposid{simd-iterator}@ i, difference_type n);
17247+ friend constexpr @\exposid{simd-iterator}@ operator+(difference_type n, @\exposid{simd-iterator}@ i);
17248+ friend constexpr @\exposid{simd-iterator}@ operator-(@\exposid{simd-iterator}@ i, difference_type n);
17249+
17250+ friend constexpr difference_type operator-(@\exposid{simd-iterator}@ a, @\exposid{simd-iterator}@ b);
17251+ friend constexpr difference_type operator-(@\exposid{simd-iterator}@ i, default_sentinel_t) noexcept;
17252+ friend constexpr difference_type operator-(default_sentinel_t, @\exposid{simd-iterator}@ i) noexcept;
17253+ };
17254+ }
17255+ \end{codeblock}
17256+
17257+ \begin{itemdecl}
17258+ constexpr @\exposid{simd-iterator}@(V& d, @\exposid{simd-size-type}@ off) noexcept;
17259+ \end{itemdecl}
17260+
17261+ \begin{itemdescr}
17262+ \pnum
17263+ \effects
17264+ Initializes \exposid{data_} with \tcode{addressof(d)} and \exposid{offset_} with \tcode{off}.
17265+ \end{itemdescr}
17266+
17267+ \begin{itemdecl}
17268+ constexpr @\exposid{simd-iterator}@(const @\exposid{simd-iterator}@<remove_const_t<V>>& i) requires is_const_v<V>;
17269+ \end{itemdecl}
17270+
17271+ \begin{itemdescr}
17272+ \pnum
17273+ \effects
17274+ Initializes \exposid{data_} with \tcode{i.\exposid{data_}} and \exposid{offset_} with \tcode{i.\exposid{offset_}}.
17275+ \end{itemdescr}
17276+
17277+ \begin{itemdecl}
17278+ constexpr value_type operator*() const;
17279+ \end{itemdecl}
17280+
17281+ \begin{itemdescr}
17282+ \pnum
17283+ \effects
17284+ Equivalent to: \tcode{return (*\exposid{data_})[\exposid{offset_}];}
17285+ \end{itemdescr}
17286+
17287+ \begin{itemdecl}
17288+ constexpr @\exposid{simd-iterator}@& operator++();
17289+ \end{itemdecl}
17290+
17291+ \begin{itemdescr}
17292+ \pnum
17293+ \effects
17294+ Equivalent to: \tcode{return *this += 1;}
17295+ \end{itemdescr}
17296+
17297+ \begin{itemdecl}
17298+ constexpr @\exposid{simd-iterator}@ operator++(int);
17299+ \end{itemdecl}
17300+
17301+ \begin{itemdescr}
17302+ \pnum
17303+ \effects
17304+ Equivalent to:
17305+ \begin{codeblock}
17306+ @\exposid{simd-iterator}@ tmp = *this;
17307+ *this += 1;
17308+ return tmp;
17309+ \end{codeblock}
17310+ \end{itemdescr}
17311+
17312+ \begin{itemdecl}
17313+ constexpr @\exposid{simd-iterator}@& operator--();
17314+ \end{itemdecl}
17315+
17316+ \begin{itemdescr}
17317+ \pnum
17318+ \effects
17319+ Equivalent to: \tcode{return *this -= 1;}
17320+ \end{itemdescr}
17321+
17322+ \begin{itemdecl}
17323+ constexpr @\exposid{simd-iterator}@ operator--(int);
17324+ \end{itemdecl}
17325+
17326+ \begin{itemdescr}
17327+ \pnum
17328+ \effects
17329+ Equivalent to:
17330+ \begin{codeblock}
17331+ @\exposid{simd-iterator}@ tmp = *this;
17332+ *this -= 1;
17333+ return tmp;
17334+ \end{codeblock}
17335+ \end{itemdescr}
17336+
17337+ \begin{itemdecl}
17338+ constexpr @\exposid{simd-iterator}@& operator+=(difference_type n);
17339+ \end{itemdecl}
17340+
17341+ \begin{itemdescr}
17342+ \pnum
17343+ \expects
17344+ \tcode{\exposid{offset_} + n} is in the range \crange{0}{V::size()}.
17345+
17346+ \pnum
17347+ \effects
17348+ Equivalent to:
17349+ \begin{codeblock}
17350+ @\exposid{offset_}@ += n;
17351+ return *this;
17352+ \end{codeblock}
17353+ \end{itemdescr}
17354+
17355+ \begin{itemdecl}
17356+ constexpr @\exposid{simd-iterator}@& operator-=(difference_type n);
17357+ \end{itemdecl}
17358+
17359+ \begin{itemdescr}
17360+ \pnum
17361+ \expects
17362+ \tcode{\exposid{offset_} - n} is in the range \crange{0}{V::size()}.
17363+
17364+ \pnum
17365+ \effects
17366+ Equivalent to:
17367+ \begin{codeblock}
17368+ @\exposid{offset_}@ -= n;
17369+ return *this;
17370+ \end{codeblock}
17371+ \end{itemdescr}
17372+
17373+ \begin{itemdecl}
17374+ constexpr value_type operator[](difference_type n) const;
17375+ \end{itemdecl}
17376+
17377+ \begin{itemdescr}
17378+ \pnum
17379+ \effects
17380+ Equivalent to: \tcode{return (*\exposid{data_})[\exposid{offset_} + n];}
17381+ \end{itemdescr}
17382+
17383+ \begin{itemdecl}
17384+ friend constexpr bool operator==(@\exposid{simd-iterator}@ i, default_sentinel_t) noexcept;
17385+ \end{itemdecl}
17386+
17387+ \begin{itemdescr}
17388+ \pnum
17389+ \effects
17390+ Equivalent to: \tcode{return i.\exposid{offset_} == V::size();}
17391+ \end{itemdescr}
17392+
17393+ \begin{itemdecl}
17394+ friend constexpr auto operator<=>(@\exposid{simd-iterator}@ a, @\exposid{simd-iterator}@ b);
17395+ \end{itemdecl}
17396+
17397+ \begin{itemdescr}
17398+ \pnum
17399+ \expects
17400+ \tcode{a.\exposid{data_} == b.\exposid{data_}} is \tcode{true}.
17401+
17402+ \pnum
17403+ \effects
17404+ Equivalent to: \tcode{return a.\exposid{offset_} <=> b.\exposid{offset_};}
17405+ \end{itemdescr}
17406+
17407+ \begin{itemdecl}
17408+ friend constexpr @\exposid{simd-iterator}@ operator+(@\exposid{simd-iterator}@ i, difference_type n);
17409+ friend constexpr @\exposid{simd-iterator}@ operator+(difference_type n, @\exposid{simd-iterator}@ i);
17410+ \end{itemdecl}
17411+
17412+ \begin{itemdescr}
17413+ \pnum
17414+ \effects
17415+ Equivalent to: \tcode{return i += n;}
17416+ \end{itemdescr}
17417+
17418+ \begin{itemdecl}
17419+ friend constexpr @\exposid{simd-iterator}@ operator-(@\exposid{simd-iterator}@ i, difference_type n);
17420+ \end{itemdecl}
17421+
17422+ \begin{itemdescr}
17423+ \pnum
17424+ \effects
17425+ Equivalent to: \tcode{return i -= n;}
17426+ \end{itemdescr}
17427+
17428+ \begin{itemdecl}
17429+ friend constexpr difference_type operator-(@\exposid{simd-iterator}@ a, @\exposid{simd-iterator}@ b);
17430+ \end{itemdecl}
17431+
17432+ \begin{itemdescr}
17433+ \pnum
17434+ \expects
17435+ \tcode{a.\exposid{data_} == b.\exposid{data_}} is \tcode{true}.
17436+
17437+ \pnum
17438+ \effects
17439+ Equivalent to: \tcode{return a.\exposid{offset_} - b.\exposid{offset_};}
17440+ \end{itemdescr}
17441+
17442+ \begin{itemdecl}
17443+ friend constexpr difference_type operator-(@\exposid{simd-iterator}@ i, default_sentinel_t) noexcept;
17444+ \end{itemdecl}
17445+
17446+ \begin{itemdescr}
17447+ \pnum
17448+ \effects
17449+ Equivalent to: \tcode{return i.\exposid{offset_} - V::size();}
17450+ \end{itemdescr}
17451+
17452+
17453+ \begin{itemdecl}
17454+ friend constexpr difference_type operator-(default_sentinel_t, @\exposid{simd-iterator}@ i) noexcept;
17455+ \end{itemdecl}
17456+
17457+ \begin{itemdescr}
17458+ \pnum
17459+ \effects
17460+ Equivalent to: \tcode{return V::size() - i.\exposid{offset_};}
17461+ \end{itemdescr}
17462+
1720717463\rSec2[simd.class]{Class template \tcode{basic_simd}}
1720817464
1720917465\rSec3[simd.overview]{Class template \tcode{basic_simd} overview}
1721517471 using value_type = T;
1721617472 using mask_type = basic_simd_mask<sizeof(T), Abi>;
1721717473 using abi_type = Abi;
17474+ using @\libmember{iterator}{basic_simd}@ = @\exposid{simd-iterator}@<basic_simd>;
17475+ using @\libmember{const_iterator}{basic_simd}@ = @\exposid{simd-iterator}@<const basic_simd>;
17476+
17477+ constexpr iterator @\libmember{begin}{basic_simd}@() noexcept { return {*this, 0}; }
17478+ constexpr const_iterator @\libmember{begin}{basic_simd}@() const noexcept { return {*this, 0}; }
17479+ constexpr const_iterator @\libmember{cbegin}{basic_simd}@() const noexcept { return {*this, 0}; }
17480+ constexpr default_sentinel_t @\libmember{end}{basic_simd}@() const noexcept { return {}; }
17481+ constexpr default_sentinel_t @\libmember{cend}{basic_simd}@() const noexcept { return {}; }
1721817482
1721917483 static constexpr integral_constant<@\exposid{simd-size-type}@, @\exposid{simd-size-v}@<T, Abi>> size {};
1722017484
1910119365 public:
1910219366 using value_type = bool;
1910319367 using abi_type = Abi;
19368+ using @\libmember{iterator}{basic_simd_mask}@ = @\exposid{simd-iterator}@<basic_simd_mask>;
19369+ using @\libmember{const_iterator}{basic_simd_mask}@ = @\exposid{simd-iterator}@<const basic_simd_mask>;
19370+
19371+ constexpr iterator @\libmember{begin}{basic_simd_mask}@() noexcept { return {*this, 0}; }
19372+ constexpr const_iterator @\libmember{begin}{basic_simd_mask}@() const noexcept { return {*this, 0}; }
19373+ constexpr const_iterator @\libmember{cbegin}{basic_simd_mask}@() const noexcept { return {*this, 0}; }
19374+ constexpr default_sentinel_t @\libmember{end}{basic_simd_mask}@() const noexcept { return {}; }
19375+ constexpr default_sentinel_t @\libmember{cend}{basic_simd_mask}@() const noexcept { return {}; }
1910419376
1910519377 static constexpr integral_constant<@\exposid{simd-size-type}@, @\exposid{simd-size-v}@<@\exposid{integer-from}@<Bytes>, Abi>>
1910619378 size {};
0 commit comments