Vc  1.1.0
SIMD Vector Classes for C++
type_traits.h
1 /* This file is part of the Vc library. {{{
2 Copyright © 2013-2015 Matthias Kretz <kretz@kde.org>
3 All rights reserved.
4 
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7  * Redistributions of source code must retain the above copyright
8  notice, this list of conditions and the following disclaimer.
9  * Redistributions in binary form must reproduce the above copyright
10  notice, this list of conditions and the following disclaimer in the
11  documentation and/or other materials provided with the distribution.
12  * Neither the names of contributing organizations nor the
13  names of its contributors may be used to endorse or promote products
14  derived from this software without specific prior written permission.
15 
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
20 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 
27 }}}*/
28 
29 #ifndef VC_TRAITS_TYPE_TRAITS_H_
30 #define VC_TRAITS_TYPE_TRAITS_H_
31 
32 #include <type_traits>
33 #include "decay.h"
34 #include "has_no_allocated_data.h"
35 #include "has_contiguous_storage.h"
36 #include "is_initializer_list.h"
37 #include "is_load_arguments.h"
38 #include "is_functor_argument_immutable.h"
39 #include "is_output_iterator.h"
40 #include "is_index_sequence.h"
41 #include "is_implicit_cast_allowed.h"
42 
43 namespace Vc_VERSIONED_NAMESPACE
44 {
45 // meta-programming helpers
46 struct enable_if_default_type
47 {
48  constexpr enable_if_default_type() {}
49 };
50 static constexpr enable_if_default_type nullarg;
51 template <bool Test, typename T = enable_if_default_type> using enable_if = typename std::enable_if<Test, T>::type;
52 
53 namespace Traits
54 {
55 #include "has_subscript_operator.h"
56 #include "has_multiply_operator.h"
57 #include "has_addition_operator.h"
58 #include "has_equality_operator.h"
59 
60 template<typename T> struct is_simd_mask_internal : public std::false_type {};
61 template<typename T> struct is_simd_vector_internal : public std::false_type {};
62 template<typename T> struct is_subscript_operation_internal : public std::false_type {};
63 template<typename T> struct is_simdarray_internal : public std::false_type {};
64 template<typename T> struct is_simd_mask_array_internal : public std::false_type {};
65 template<typename T> struct is_loadstoreflag_internal : public std::false_type {};
66 
67 #include "is_gather_signature.h"
68 
69 template <std::size_t, typename... Args> struct is_cast_arguments_internal : public std::false_type {};
70 template <typename Arg>
71 struct is_cast_arguments_internal<1, Arg> : public std::integral_constant<
72  bool,
73  is_simdarray_internal<Arg>::value ||
74  is_simd_vector_internal<Arg>::value>
75 {
76 };
77 
78 template <typename T, bool = is_simd_vector_internal<T>::value> struct is_integral_internal;
79 template <typename T, bool = is_simd_vector_internal<T>::value> struct is_floating_point_internal;
80 template <typename T, bool = is_simd_vector_internal<T>::value> struct is_signed_internal;
81 template <typename T, bool = is_simd_vector_internal<T>::value> struct is_unsigned_internal;
82 
83 template <typename T> struct is_integral_internal <T, false> : public std::is_integral <T> {};
84 template <typename T> struct is_floating_point_internal<T, false> : public std::is_floating_point<T> {};
85 template <typename T> struct is_signed_internal <T, false> : public std::is_signed <T> {};
86 template <typename T> struct is_unsigned_internal <T, false> : public std::is_unsigned <T> {};
87 
88 template <typename V> struct is_integral_internal <V, true> : public std::is_integral <typename V::EntryType> {};
89 template <typename V> struct is_floating_point_internal<V, true> : public std::is_floating_point<typename V::EntryType> {};
90 template <typename V> struct is_signed_internal <V, true> : public std::is_signed <typename V::EntryType> {};
91 template <typename V> struct is_unsigned_internal <V, true> : public std::is_unsigned <typename V::EntryType> {};
92 
93 template <typename T>
94 struct is_arithmetic_internal
95  : public std::integral_constant<
96  bool,
97  (is_floating_point_internal<T>::value || is_integral_internal<T>::value)>
98 {
99 };
100 
101 template <typename T,
102  bool = (is_simd_vector_internal<T>::value || is_simd_mask_internal<T>::value ||
103  is_simdarray_internal<T>::value ||
104  is_simd_mask_array_internal<T>::value)>
105 struct vector_size_internal;
106 
107 template <typename T>
108 struct vector_size_internal<T, true> : public std::integral_constant<std::size_t, T::Size>
109 {
110 };
111 template <typename T>
112 struct vector_size_internal<T, false> : public std::integral_constant<std::size_t, 0>
113 {
114 };
115 
117 
122 template <typename T>
123 struct is_simd_mask : public std::integral_constant<bool,
124  (is_simd_mask_internal<decay<T>>::value ||
125  is_simd_mask_array_internal<decay<T>>::value)>
126 {
127 };
128 
133 template <typename T>
135  : public std::integral_constant<bool,
136  (is_simd_vector_internal<decay<T>>::value ||
137  is_simdarray_internal<decay<T>>::value)>
138 {
139 };
140 
142 template <typename T>
143 struct isSimdArray : public is_simdarray_internal<decay<T>>
144 {
145 };
146 
148 template <typename T>
149 struct isSimdMaskArray : public is_simd_mask_array_internal<decay<T>>
150 {
151 };
152 
154 template <typename T> struct is_subscript_operation : public is_subscript_operation_internal<decay<T>> {};
156 template <typename T> struct is_load_store_flag : public is_loadstoreflag_internal<decay<T>> {};
158 template <typename... Args> struct is_cast_arguments : public is_cast_arguments_internal<sizeof...(Args), decay<Args>...> {};
159 
161 template <typename T> struct is_atomic_simdarray_internal : public std::false_type {};
162 template <typename T> using isAtomicSimdArray = is_atomic_simdarray_internal<decay<T>>;
163 
165 template <typename T> struct is_atomic_simd_mask_array_internal : public std::false_type {};
166 template <typename T> using isAtomicSimdMaskArray = is_atomic_simd_mask_array_internal<decay<T>>;
167 
172 template <typename T> struct simd_vector_size : public vector_size_internal<decay<T>> {};
173 
174 template <typename T> struct is_integral : public is_integral_internal<decay<T>> {};
175 template <typename T> struct is_floating_point : public is_floating_point_internal<decay<T>> {};
176 template <typename T> struct is_arithmetic : public is_arithmetic_internal<decay<T>> {};
177 template <typename T> struct is_signed : public is_signed_internal<decay<T>> {};
178 template <typename T> struct is_unsigned : public is_unsigned_internal<decay<T>> {};
179 
180 template <typename T, bool IsSimdVector> struct scalar_type_internal { using type = T; };
181 template <typename T> struct scalar_type_internal<T, true> { using type = typename T::EntryType; };
182 template <typename T> using scalar_type = typename scalar_type_internal<decay<T>, is_simd_vector<T>::value>::type;
183 
184 } // namespace Traits
185 } // namespace Vc
186 
187 #include "entry_type_of.h"
188 
189 #endif // VC_TRAITS_TYPE_TRAITS_H_
Identifies any possible SimdArray type (independent of const/volatile or reference) ...
Definition: type_traits.h:143
Identifies any possible SimdMaskArray type (independent of const/volatile or reference) ...
Definition: type_traits.h:149
The value member will either be the number of SIMD vector entries or 0 if T is not a SIMD type...
Definition: type_traits.h:172
Identifies any SIMD vector type (independent of implementation or whether it's SimdArray).
Definition: type_traits.h:134
Identifies any SIMD mask type (independent of implementation or whether it's SimdMaskArray).
Definition: type_traits.h:123