@@ -17187,6 +17187,262 @@
17187
17187
specialization \tcode{\exposid{overaligned-flag}<std::min(N1, N2)>}.
17188
17188
\end{itemdescr}
17189
17189
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
+
17190
17446
\rSec2[simd.class]{Class template \tcode{basic_simd}}
17191
17447
17192
17448
\rSec3[simd.overview]{Class template \tcode{basic_simd} overview}
17198
17454
using value_type = T;
17199
17455
using mask_type = basic_simd_mask<sizeof(T), Abi>;
17200
17456
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 {}; }
17201
17465
17202
17466
static constexpr integral_constant<@\exposid{simd-size-type}@, @\exposid{simd-size-v}@<T, Abi>> size {};
17203
17467
19084
19348
public:
19085
19349
using value_type = bool;
19086
19350
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 {}; }
19087
19359
19088
19360
static constexpr integral_constant<@\exposid{simd-size-type}@, @\exposid{simd-size-v}@<@\exposid{integer-from}@<Bytes>, Abi>>
19089
19361
size {};
0 commit comments