Skip to content

Commit c42ed8a

Browse files
committed
P3480R6 std::simd is a range
1 parent 6fdb0fc commit c42ed8a

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
@@ -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}
@@ -17198,6 +17454,14 @@
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

@@ -19084,6 +19348,14 @@
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

Comments
 (0)