Skip to content

Commit 6c19e50

Browse files
committed
P3480R6 std::simd is a range
1 parent b44fb2d commit 6c19e50

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
@@ -17188,6 +17188,262 @@
1718817188
specialization \tcode{\exposid{overaligned-flag}<std::min(N1, N2)>}.
1718917189
\end{itemdescr}
1719017190

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

1719317449
\rSec3[simd.overview]{Class template \tcode{basic_simd} overview}
@@ -17199,6 +17455,14 @@
1719917455
using value_type = T;
1720017456
using mask_type = basic_simd_mask<sizeof(T), Abi>;
1720117457
using abi_type = Abi;
17458+
using iterator = @\exposid{simd-iterator}@<basic_simd>;
17459+
using const_iterator = @\exposid{simd-iterator}@<const basic_simd>;
17460+
17461+
constexpr iterator begin() noexcept { return {*this, 0}; }
17462+
constexpr const_iterator begin() const noexcept { return {*this, 0}; }
17463+
constexpr const_iterator cbegin() const noexcept { return {*this, 0}; }
17464+
constexpr default_sentinel_t end() const noexcept { return {}; }
17465+
constexpr default_sentinel_t cend() const noexcept { return {}; }
1720217466

1720317467
static constexpr integral_constant<@\exposid{simd-size-type}@, @\exposid{simd-size-v}@<T, Abi>> size {};
1720417468

@@ -19085,6 +19349,14 @@
1908519349
public:
1908619350
using value_type = bool;
1908719351
using abi_type = Abi;
19352+
using iterator = @\exposid{simd-iterator}@<basic_simd_mask>;
19353+
using const_iterator = @\exposid{simd-iterator}@<const basic_simd_mask>;
19354+
19355+
constexpr iterator begin() noexcept { return {*this, 0}; }
19356+
constexpr const_iterator begin() const noexcept { return {*this, 0}; }
19357+
constexpr const_iterator cbegin() const noexcept { return {*this, 0}; }
19358+
constexpr default_sentinel_t end() const noexcept { return {}; }
19359+
constexpr default_sentinel_t cend() const noexcept { return {}; }
1908819360

1908919361
static constexpr integral_constant<@\exposid{simd-size-type}@, @\exposid{simd-size-v}@<@\exposid{integer-from}@<Bytes>, Abi>>
1909019362
size {};

0 commit comments

Comments
 (0)