libstdc++-v3/ChangeLog:
* include/bits/simd_iterator.h: New file.
Signed-off-by: Matthias Kretz <[email protected]>
---
libstdc++-v3/include/bits/simd_iterator.h | 153 ++++++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 libstdc++-v3/include/bits/simd_iterator.h
--
──────────────────────────────────────────────────────────────────────────
Dr. Matthias Kretz https://mattkretz.github.io
GSI Helmholtz Center for Heavy Ion Research https://gsi.de
std::simd
──────────────────────────────────────────────────────────────────────────diff --git a/libstdc++-v3/include/bits/simd_iterator.h b/libstdc++-v3/include/bits/simd_iterator.h
new file mode 100644
index 00000000000..971d03c031c
--- /dev/null
+++ b/libstdc++-v3/include/bits/simd_iterator.h
@@ -0,0 +1,153 @@
+/* SPDX-License-Identifier: GPL-3.0-or-later WITH GCC-exception-3.1 */
+/* Copyright © 2025 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
+ * Matthias Kretz <[email protected]>
+ */
+
+#ifndef _GLIBCXX_SIMD_ITERATOR_H
+#define _GLIBCXX_SIMD_ITERATOR_H 1
+
+#ifdef _GLIBCXX_SYSHDR
+#pragma GCC system_header
+#endif
+
+#if __cplusplus >= 202400L
+
+#include "simd_details.h"
+
+namespace std::simd
+{
+ /** @internal
+ * Iterator type for basic_vec and basic_mask.
+ *
+ * C++26 [simd.iterator]
+ */
+ template <typename _Vp>
+ class __iterator
+ {
+ friend class __iterator<const _Vp>;
+
+ template <typename, typename>
+ friend class basic_vec;
+
+ template <size_t, typename>
+ friend class basic_mask;
+
+ _Vp* _M_data = nullptr;
+
+ __simd_size_type _M_offset = 0;
+
+ constexpr
+ __iterator(_Vp& __d, __simd_size_type __off)
+ : _M_data(&__d), _M_offset(__off)
+ {}
+
+ public:
+ using value_type = typename _Vp::value_type;
+
+ using iterator_category = input_iterator_tag;
+
+ using iterator_concept = random_access_iterator_tag;
+
+ using difference_type = __simd_size_type;
+
+ constexpr __iterator() = default;
+
+ constexpr
+ __iterator(const __iterator &) = default;
+
+ constexpr __iterator&
+ operator=(const __iterator &) = default;
+
+ constexpr
+ __iterator(const __iterator<remove_const_t<_Vp>> &__i) requires is_const_v<_Vp>
+ : _M_data(__i._M_data), _M_offset(__i._M_offset)
+ {}
+
+ constexpr value_type
+ operator*() const
+ { return (*_M_data)[_M_offset]; } // checked in operator[]
+
+ constexpr __iterator&
+ operator++()
+ {
+ ++_M_offset;
+ return *this;
+ }
+
+ constexpr __iterator
+ operator++(int)
+ {
+ __iterator r = *this;
+ ++_M_offset;
+ return r;
+ }
+
+ constexpr __iterator&
+ operator--()
+ {
+ --_M_offset;
+ return *this;
+ }
+
+ constexpr __iterator
+ operator--(int)
+ {
+ __iterator r = *this;
+ --_M_offset;
+ return r;
+ }
+
+ constexpr __iterator&
+ operator+=(difference_type __x)
+ {
+ _M_offset += __x;
+ return *this;
+ }
+
+ constexpr __iterator&
+ operator-=(difference_type __x)
+ {
+ _M_offset -= __x;
+ return *this;
+ }
+
+ constexpr value_type
+ operator[](difference_type __i) const
+ { return (*_M_data)[_M_offset + __i]; } // checked in operator[]
+
+ constexpr friend bool operator==(__iterator __a, __iterator __b) = default;
+
+ constexpr friend bool operator==(__iterator __a, std::default_sentinel_t) noexcept
+ { return __a._M_offset == _Vp::size.value; }
+
+ constexpr friend auto operator<=>(__iterator __a, __iterator __b)
+ { return __a._M_offset <=> __b._M_offset; }
+
+ constexpr friend __iterator
+ operator+(const __iterator& __it, difference_type __x)
+ { return __iterator(*__it._M_data, __it._M_offset + __x); }
+
+ constexpr friend __iterator
+ operator+(difference_type __x, const __iterator& __it)
+ { return __iterator(*__it._M_data, __it._M_offset + __x); }
+
+ constexpr friend __iterator
+ operator-(const __iterator& __it, difference_type __x)
+ { return __iterator(*__it._M_data, __it._M_offset - __x); }
+
+ constexpr friend difference_type
+ operator-(__iterator __a, __iterator __b)
+ { return __a._M_offset - __b._M_offset; }
+
+ constexpr friend difference_type
+ operator-(__iterator __it, std::default_sentinel_t)
+ { return __it._M_offset - difference_type(_Vp::size.value); }
+
+ constexpr friend difference_type
+ operator-(std::default_sentinel_t, __iterator __it)
+ { return difference_type(_Vp::size.value) - __it._M_offset; }
+ };
+}
+
+#endif // C++26
+#endif // _GLIBCXX_SIMD_ITERATOR_H