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