22 #ifndef _BLAZE_MATH_INTRINSICS_INTRINSICTRAIT_H_
23 #define _BLAZE_MATH_INTRINSICS_INTRINSICTRAIT_H_
30 #include <boost/type_traits/remove_cv.hpp>
55 struct IntrinsicTraitHelper;
66 struct IntrinsicTraitHelper<1UL>
68 typedef sse_int8_t Type;
84 struct IntrinsicTraitHelper<2UL>
86 typedef sse_int16_t Type;
102 struct IntrinsicTraitHelper<4UL>
104 typedef sse_int32_t Type;
108 multiplication = 1 };
112 struct IntrinsicTraitHelper<4UL>
114 typedef sse_int32_t Type;
132 struct IntrinsicTraitHelper<8UL>
134 typedef sse_int64_t Type;
138 multiplication = 0 };
142 struct IntrinsicTraitHelper<8UL>
144 typedef sse_int64_t Type;
148 multiplication = 0 };
168 template<
typename T >
169 struct IntrinsicTraitBase
173 alignment = AlignmentTrait<T>::value,
176 multiplication = 0 };
188 struct IntrinsicTraitBase<short>
191 typedef IntrinsicTraitHelper<sizeof(short)> Helper;
194 typedef Helper::Type Type;
195 enum { size = Helper::size,
196 alignment = AlignmentTrait<short>::value,
197 addition = Helper::addition,
198 subtraction = Helper::subtraction,
199 multiplication = Helper::multiplication };
211 struct IntrinsicTraitBase<unsigned short>
214 typedef IntrinsicTraitHelper<sizeof(unsigned short)> Helper;
217 typedef Helper::Type Type;
218 enum { size = Helper::size,
219 alignment = AlignmentTrait<unsigned short>::value,
220 addition = Helper::addition,
221 subtraction = Helper::subtraction,
222 multiplication = Helper::multiplication };
234 struct IntrinsicTraitBase<int>
237 typedef IntrinsicTraitHelper<sizeof(int)> Helper;
240 typedef Helper::Type Type;
241 enum { size = Helper::size,
242 alignment = AlignmentTrait<int>::value,
243 addition = Helper::addition,
244 subtraction = Helper::subtraction,
245 multiplication = Helper::multiplication };
257 struct IntrinsicTraitBase<unsigned int>
260 typedef IntrinsicTraitHelper<sizeof(unsigned int)> Helper;
263 typedef Helper::Type Type;
264 enum { size = Helper::size,
265 alignment = AlignmentTrait<unsigned int>::value,
266 addition = Helper::addition,
267 subtraction = Helper::subtraction,
268 multiplication = Helper::multiplication };
280 struct IntrinsicTraitBase<long>
283 typedef IntrinsicTraitHelper<sizeof(long)> Helper;
286 typedef Helper::Type Type;
287 enum { size = Helper::size,
288 alignment = AlignmentTrait<long>::value,
289 addition = Helper::addition,
290 subtraction = Helper::subtraction,
291 multiplication = Helper::multiplication };
303 struct IntrinsicTraitBase<unsigned long>
306 typedef IntrinsicTraitHelper<sizeof(unsigned long)> Helper;
309 typedef Helper::Type Type;
310 enum { size = Helper::size,
311 alignment = AlignmentTrait<unsigned long>::value,
312 addition = Helper::addition,
313 subtraction = Helper::subtraction,
314 multiplication = Helper::multiplication };
326 struct IntrinsicTraitBase<float>
328 typedef sse_float_t Type;
329 enum { size = ( 64UL /
sizeof(float) ),
330 alignment = AlignmentTrait<float>::value,
333 multiplication = 1 };
337 struct IntrinsicTraitBase<float>
339 typedef sse_float_t Type;
340 enum { size = ( 32UL /
sizeof(float) ),
341 alignment = AlignmentTrait<float>::value,
344 multiplication = 1 };
348 struct IntrinsicTraitBase<float>
350 typedef sse_float_t Type;
352 alignment = AlignmentTrait<float>::value,
369 struct IntrinsicTraitBase<double>
371 typedef sse_double_t Type;
372 enum { size = ( 64UL /
sizeof(double) ),
373 alignment = AlignmentTrait<double>::value,
376 multiplication = 1 };
380 struct IntrinsicTraitBase<double>
382 typedef sse_double_t Type;
383 enum { size = ( 32UL /
sizeof(double) ),
384 alignment = AlignmentTrait<double>::value,
387 multiplication = 1 };
391 struct IntrinsicTraitBase<double>
393 typedef sse_double_t Type;
395 alignment = AlignmentTrait<double>::value,
433 template<
typename T >
434 class IntrinsicTrait :
public IntrinsicTraitBase< typename boost::remove_cv<T>::type >