Skip to content

Commit b52c81c

Browse files
mattkretztkoeppe
authored andcommitted
P3480R6 std::simd is a range
1 parent d75f66d commit b52c81c

File tree

1 file changed

+272
-0
lines changed

1 file changed

+272
-0
lines changed

source/numerics.tex

Lines changed: 272 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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* @\exposid{data_}@ = nullptr; // \expos
17213+
@\exposid{simd-size-type}@ @\exposidnc{offset_}@ = 0; // \expos
17214+
17215+
constexpr @\exposidnc{simd-iterator}@(V& d, @\exposidnc{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}
@@ -17215,6 +17471,14 @@
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

@@ -19101,6 +19365,14 @@
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

Comments
 (0)