29 Numerics library [numerics]

29.10 Data-parallel types [simd]

29.10.6 Class template simd-iterator [simd.iterator]

namespace std::simd { template<class V> class simd-iterator { // exposition only V* data_ = nullptr; // exposition only simd-size-type offset_ = 0; // exposition only constexpr simd-iterator(V& d, simd-size-type off) noexcept; // exposition only public: using value_type = typename V::value_type; using iterator_category = input_iterator_tag; using iterator_concept = random_access_iterator_tag; using difference_type = simd-size-type; constexpr simd-iterator() = default; constexpr simd-iterator(const simd-iterator&) = default; constexpr simd-iterator& operator=(const simd-iterator&) = default; constexpr simd-iterator(const simd-iterator<remove_const_t<V>>&) requires is_const_v<V>; constexpr value_type operator*() const; constexpr simd-iterator& operator++(); constexpr simd-iterator operator++(int); constexpr simd-iterator& operator--(); constexpr simd-iterator operator--(int); constexpr simd-iterator& operator+=(difference_type n); constexpr simd-iterator& operator-=(difference_type n); constexpr value_type operator[](difference_type n) const; friend constexpr bool operator==(simd-iterator a, simd-iterator b) = default; friend constexpr bool operator==(simd-iterator a, default_sentinel_t) noexcept; friend constexpr auto operator<=>(simd-iterator a, simd-iterator b); friend constexpr simd-iterator operator+(simd-iterator i, difference_type n); friend constexpr simd-iterator operator+(difference_type n, simd-iterator i); friend constexpr simd-iterator operator-(simd-iterator i, difference_type n); friend constexpr difference_type operator-(simd-iterator a, simd-iterator b); friend constexpr difference_type operator-(simd-iterator i, default_sentinel_t) noexcept; friend constexpr difference_type operator-(default_sentinel_t, simd-iterator i) noexcept; }; }
constexpr simd-iterator(V& d, simd-size-type off) noexcept;
Effects: Initializes data_ with addressof(d) and offset_ with off.
constexpr simd-iterator(const simd-iterator<remove_const_t<V>>& i) requires is_const_v<V>;
Effects: Initializes data_ with i.data_ and offset_ with i.offset_.
constexpr value_type operator*() const;
Effects: Equivalent to: return (*data_)[offset_];
constexpr simd-iterator& operator++();
Effects: Equivalent to: return *this += 1;
constexpr simd-iterator operator++(int);
Effects: Equivalent to: simd-iterator tmp = *this; *this += 1; return tmp;
constexpr simd-iterator& operator--();
Effects: Equivalent to: return *this -= 1;
constexpr simd-iterator operator--(int);
Effects: Equivalent to: simd-iterator tmp = *this; *this -= 1; return tmp;
constexpr simd-iterator& operator+=(difference_type n);
Preconditions: offset_ + n is in the range [0, V​::​size()].
Effects: Equivalent to: offset_ += n; return *this;
constexpr simd-iterator& operator-=(difference_type n);
Preconditions: offset_ - n is in the range [0, V​::​size()].
Effects: Equivalent to: offset_ -= n; return *this;
constexpr value_type operator[](difference_type n) const;
Effects: Equivalent to: return (*data_)[offset_ + n];
friend constexpr bool operator==(simd-iterator i, default_sentinel_t) noexcept;
Effects: Equivalent to: return i.offset_ == V​::​size();
friend constexpr auto operator<=>(simd-iterator a, simd-iterator b);
Preconditions: a.data_ == b.data_ is true.
Effects: Equivalent to: return a.offset_ <=> b.offset_;
friend constexpr simd-iterator operator+(simd-iterator i, difference_type n); friend constexpr simd-iterator operator+(difference_type n, simd-iterator i);
Effects: Equivalent to: return i += n;
friend constexpr simd-iterator operator-(simd-iterator i, difference_type n);
Effects: Equivalent to: return i -= n;
friend constexpr difference_type operator-(simd-iterator a, simd-iterator b);
Preconditions: a.data_ == b.data_ is true.
Effects: Equivalent to: return a.offset_ - b.offset_;
friend constexpr difference_type operator-(simd-iterator i, default_sentinel_t) noexcept;
Effects: Equivalent to: return i.offset_ - V​::​size();
friend constexpr difference_type operator-(default_sentinel_t, simd-iterator i) noexcept;
Effects: Equivalent to: return V​::​size() - i.offset_;