22namespace seqan3::detail
36template <simd_concept index_simd_t>
37class counted_simd_iterator
41 index_simd_t count_simd{};
48 using value_type = index_simd_t;
50 using reference = value_type;
62 counted_simd_iterator() =
default;
63 counted_simd_iterator(counted_simd_iterator
const &) =
default;
64 counted_simd_iterator(counted_simd_iterator &&) =
default;
65 counted_simd_iterator & operator=(counted_simd_iterator
const &) =
default;
66 counted_simd_iterator & operator=(counted_simd_iterator &&) =
default;
67 ~counted_simd_iterator() =
default;
75 template <arithmetic index_scalar_t>
76 explicit counted_simd_iterator(index_scalar_t
const scalar_index) noexcept :
77 count_simd{simd::fill<index_simd_t>(scalar_index)}
86 reference operator*()
const
97 counted_simd_iterator & operator++()
99 count_simd += seqan3::simd::fill<index_simd_t>(1);
104 counted_simd_iterator operator++(
int)
106 counted_simd_iterator tmp{*
this};
112 difference_type operator-(counted_simd_iterator
const & rhs)
const
114 return count_simd[0] - rhs.count_simd[0];
123 friend bool operator==(counted_simd_iterator
const & lhs, counted_simd_iterator
const & rhs)
noexcept
125 return lhs.count_simd[0] == rhs.count_simd[0];
129 friend bool operator!=(counted_simd_iterator
const & lhs, counted_simd_iterator
const & rhs)
noexcept
131 return !(lhs == rhs);
140template <simd_concept index_simd_t>
141class iota_simd_view :
public std::ranges::view_interface<iota_simd_view<index_simd_t>>
145 using index_scalar_type =
typename simd_traits<index_simd_t>::scalar_type;
147 using iterator_type = seqan3::detail::counted_simd_iterator<index_simd_t>;
150 index_scalar_type begin_index{};
152 index_scalar_type end_index{};
158 iota_simd_view() =
default;
159 iota_simd_view(iota_simd_view
const &)
noexcept =
default;
160 iota_simd_view(iota_simd_view &&) =
default;
161 iota_simd_view & operator=(iota_simd_view
const &) =
default;
162 iota_simd_view & operator=(iota_simd_view &&) =
default;
163 ~iota_simd_view() =
default;
170 iota_simd_view(index_scalar_type
const begin_index, index_scalar_type
const end_index) :
171 begin_index{begin_index},
180 iterator_type
begin() const noexcept
182 return iterator_type{begin_index};
186 iterator_type
end() const noexcept
188 return iterator_type{end_index};
197template <simd_concept index_simd_t>
198struct iota_simd_view_fn
201 using index_scalar_type =
typename simd_traits<index_simd_t>::scalar_type;
210 constexpr auto operator()(index_scalar_type
const begin_index, index_scalar_type
const end_index)
const
212 return iota_simd_view<index_simd_t>{begin_index, end_index};
273template <simd_concept index_simd_t>
274inline constexpr detail::iota_simd_view_fn<index_simd_t>
iota_simd{};
278#ifdef __cpp_lib_ranges
282template <seqan3::simd_concept index_simd_t>
283inline constexpr bool enable_borrowed_range<seqan3::detail::iota_simd_view<index_simd_t>> =
true;
Provides algorithms to modify seqan3::simd::simd_type.
The SeqAn namespace for views.
Definition: char_strictly_to.hpp:22
constexpr detail::iota_simd_view_fn< index_simd_t > iota_simd
An iota view over a simd vector.
Definition: iota_simd.hpp:274
Provides seqan3::simd::simd_traits.
Provides concepts that do not have equivalents in C++20.
Provides seqan3::simd::simd_concept.