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

Reply via email to