SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
utility/simd/concept.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <concepts>
13#include <type_traits>
14
16
17namespace seqan3::detail
18{
20template <template <typename> typename rebind>
21struct simd_traits_has_rebind : std::true_type
22{};
23// NOTE: this definition should be used for seqan3::simd, but gcc has a bug that it will not fail silently if
24// simd_t is a pointer to a incomplete type. Furthermore the is_pointer_v should prevent those cases by checking the type
25// beforehand, but for some reasons the short-circuit semantic of `&&` does not work in this case and gcc still evaluates
26// the requires clause which in turn triggers the error.
27//
28// If this concept is used directly on incomplete types it will produces this compiler error:
29// error: invalid use of incomplete type ‘struct incomplete::template_type<int>’
30// requires std::same_as<decltype(a - b), simd_t>;
31template <typename simd_t>
32concept simd_concept =
33 requires (simd_t a, simd_t b) {
34 typename simd_traits<std::remove_reference_t<simd_t>>::scalar_type;
35 typename simd_traits<std::remove_reference_t<simd_t>>::mask_type;
36 typename simd_traits<std::remove_reference_t<simd_t>>::swizzle_type;
37 requires simd_traits_has_rebind<simd_traits<std::remove_reference_t<simd_t>>::template rebind>::value;
38
39 // require that static member variables are defined
40 requires std::integral<decltype(simd_traits<std::remove_reference_t<simd_t>>::length)>;
41 requires std::integral<decltype(simd_traits<std::remove_reference_t<simd_t>>::max_length)>;
42
43 // assume array access that returns a scalar_type type
44 {
45 a[0]
46 } -> std::convertible_to<typename simd_traits<std::remove_reference_t<simd_t>>::scalar_type>;
47
48 // require comparison operators
49 {
50 a == b
51 } -> std::same_as<typename simd_traits<std::remove_reference_t<simd_t>>::mask_type>;
52 {
53 a != b
54 } -> std::same_as<typename simd_traits<std::remove_reference_t<simd_t>>::mask_type>;
55 {
56 a < b
57 } -> std::same_as<typename simd_traits<std::remove_reference_t<simd_t>>::mask_type>;
58 {
59 a > b
60 } -> std::same_as<typename simd_traits<std::remove_reference_t<simd_t>>::mask_type>;
61 {
62 a <= b
63 } -> std::same_as<typename simd_traits<std::remove_reference_t<simd_t>>::mask_type>;
64 {
65 a >= b
66 } -> std::same_as<typename simd_traits<std::remove_reference_t<simd_t>>::mask_type>;
67
68 // require arithmetic operators
69 {
70 a + b
71 } -> std::same_as<std::remove_reference_t<simd_t>>;
72 {
73 a - b
74 } -> std::same_as<std::remove_reference_t<simd_t>>;
75 {
76 a * b
77 } -> std::same_as<std::remove_reference_t<simd_t>>;
78 {
79 a / b
80 } -> std::same_as<std::remove_reference_t<simd_t>>;
81 {
82 a += b
83 } -> std::same_as<std::remove_reference_t<simd_t> &>;
84 {
85 a -= b
86 } -> std::same_as<std::remove_reference_t<simd_t> &>;
87 {
88 a *= b
89 } -> std::same_as<std::remove_reference_t<simd_t> &>;
90 {
91 a /= b
92 } -> std::same_as<std::remove_reference_t<simd_t> &>;
93 };
95
96} // namespace seqan3::detail
97
98namespace seqan3
99{
100
101inline namespace simd
102{
103
118template <typename simd_t>
119concept simd_concept = !
120std::is_pointer_v<std::decay_t<simd_t>> && detail::simd_concept<simd_t>;
122
132template <typename t>
133concept simd_index =
134 simd::simd_concept<t>
135 && requires () { requires std::integral<typename simd_traits<std::remove_reference_t<t>>::scalar_type>; };
137
138} // namespace simd
139
140} // namespace seqan3
The generic simd concept.
Refines the seqan3::simd::simd_concept requiring the underlying scalar type to model std::integral.
The internal SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
The main SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
Provides seqan3::simd::simd_traits.
Hide me