@@ -17204,6 +17204,262 @@
17204
17204
specialization \tcode{\exposid{overaligned-flag}<std::min(N1, N2)>}.
17205
17205
\end{itemdescr}
17206
17206
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
+
17207
17463
\rSec2[simd.class]{Class template \tcode{basic_simd}}
17208
17464
17209
17465
\rSec3[simd.overview]{Class template \tcode{basic_simd} overview}
17215
17471
using value_type = T;
17216
17472
using mask_type = basic_simd_mask<sizeof(T), Abi>;
17217
17473
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 {}; }
17218
17482
17219
17483
static constexpr integral_constant<@\exposid{simd-size-type}@, @\exposid{simd-size-v}@<T, Abi>> size {};
17220
17484
19101
19365
public:
19102
19366
using value_type = bool;
19103
19367
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 {}; }
19104
19376
19105
19377
static constexpr integral_constant<@\exposid{simd-size-type}@, @\exposid{simd-size-v}@<@\exposid{integer-from}@<Bytes>, Abi>>
19106
19378
size {};
0 commit comments