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