|
17 | 17 |
|
18 | 18 | namespace xsimd |
19 | 19 | { |
| 20 | + |
| 21 | + /************************************** |
| 22 | + * simd_traits and revert_simd_traits * |
| 23 | + **************************************/ |
| 24 | + |
| 25 | + template <class T, class A = default_arch> |
| 26 | + struct has_simd_register : types::has_simd_register<T, A> |
| 27 | + { |
| 28 | + }; |
| 29 | + |
20 | 30 | namespace detail |
21 | 31 | { |
22 | | - template <class T, class = void> |
23 | | - struct has_batch : std::false_type |
| 32 | + template <class T, bool> |
| 33 | + struct simd_traits_impl; |
| 34 | + |
| 35 | + template <class T> |
| 36 | + struct simd_traits_impl<T, false> |
24 | 37 | { |
| 38 | + using type = T; |
| 39 | + using bool_type = bool; |
| 40 | + static constexpr size_t size = 1; |
25 | 41 | }; |
26 | 42 |
|
27 | 43 | template <class T> |
28 | | - struct has_batch<T, check_size_t<sizeof(batch<T>)>> : std::true_type |
| 44 | + constexpr size_t simd_traits_impl<T, false>::size; |
| 45 | + |
| 46 | + template <class T> |
| 47 | + struct simd_traits_impl<T, true> |
29 | 48 | { |
| 49 | + using type = batch<T>; |
| 50 | + using bool_type = typename type::batch_bool_type; |
| 51 | + static constexpr size_t size = type::size; |
30 | 52 | }; |
| 53 | + |
| 54 | + template <class T> |
| 55 | + constexpr size_t simd_traits_impl<T, true>::size; |
31 | 56 | } |
32 | 57 |
|
33 | | - template <class T, bool = detail::has_batch<T>::value> |
34 | | - struct simd_traits |
| 58 | + template <class T> |
| 59 | + struct simd_traits : detail::simd_traits_impl<T, has_simd_register<T>::value> |
35 | 60 | { |
36 | | - using type = T; |
37 | | - using bool_type = bool; |
38 | | - static constexpr size_t size = 1; |
39 | 61 | }; |
40 | 62 |
|
41 | | - template <class T, bool B> |
42 | | - constexpr size_t simd_traits<T, B>::size; |
43 | | - |
44 | 63 | template <class T> |
45 | | - struct revert_simd_traits |
| 64 | + struct simd_traits<std::complex<T>> |
| 65 | + : detail::simd_traits_impl<std::complex<T>, has_simd_register<T>::value> |
46 | 66 | { |
47 | | - using type = T; |
48 | | - static constexpr size_t size = simd_traits<type>::size; |
49 | 67 | }; |
50 | 68 |
|
51 | | - template <class T> |
52 | | - constexpr size_t revert_simd_traits<T>::size; |
| 69 | +#ifdef XSIMD_ENABLE_XTL_COMPLEX |
| 70 | + template <class T, bool i3ec> |
| 71 | + struct simd_traits<xtl::xcomplex<T, T, i3ec>> |
| 72 | + : detail::simd_traits_impl<std::complex<T>, has_simd_register<T>::value> |
| 73 | + { |
| 74 | + }; |
| 75 | +#endif |
53 | 76 |
|
54 | 77 | template <class T> |
55 | | - struct simd_traits<T, true> |
| 78 | + struct revert_simd_traits |
56 | 79 | { |
57 | | - using type = batch<T>; |
58 | | - using bool_type = typename type::batch_bool_type; |
59 | | - static constexpr size_t size = type::size; |
| 80 | + using type = T; |
| 81 | + static constexpr size_t size = simd_traits<type>::size; |
60 | 82 | }; |
61 | 83 |
|
62 | 84 | template <class T> |
63 | | - constexpr size_t simd_traits<T, true>::size; |
| 85 | + constexpr size_t revert_simd_traits<T>::size; |
64 | 86 |
|
65 | 87 | template <class T> |
66 | 88 | struct revert_simd_traits<batch<T>> |
|
0 commit comments