1#ifndef CLHEP_TYPE_TRAITS_H
2#define CLHEP_TYPE_TRAITS_H
17#if defined(__GXX_EXPERIMENTAL_CXX0X__)
18# define CLHEP_HAS_RVALUE_REFERENCE
20# define CLHEP_NO_RVALUE_REFERENCE
31template<
typename T, T v >
struct integral_constant;
32typedef integral_constant<bool, true >
true_type;
33typedef integral_constant<bool, false >
false_type;
36template<
typename T >
struct is_void;
37template<
typename T >
struct is_integral;
38template<
typename T >
struct is_floating_point;
39template<
typename T >
struct is_array;
40template<
typename T >
struct is_pointer;
41template<
typename T >
struct is_lvalue_reference;
42template<
typename T >
struct is_rvalue_reference;
43template<
typename T >
struct is_member_object_pointer;
44template<
typename T >
struct is_member_function_pointer;
45template<
typename T >
struct is_enum;
46template<
typename T >
struct is_union;
47template<
typename T >
struct is_class;
48template<
typename T >
struct is_function;
51template<
typename T >
struct is_reference;
52template<
typename T >
struct is_arithmetic;
53template<
typename T >
struct is_fundamental;
54template<
typename T >
struct is_object;
55template<
typename T >
struct is_scalar;
56template<
typename T >
struct is_compound;
57template<
typename T >
struct is_member_pointer;
60template<
typename T >
struct is_const;
61template<
typename T >
struct is_volatile;
63template<
typename T >
struct is_trivial;
64template<
typename T >
struct is_trivially_copyable;
65template<
typename T >
struct is_standard_layout;
66template<
typename T >
struct is_pod;
67template<
typename T >
struct is_literal_type;
68template<
typename T >
struct is_empty;
69template<
typename T >
struct is_polymorphic;
71template<
typename T >
struct is_abstract;
73template<
typename T,
typename... Args >
struct is_constructible;
74template<
typename T,
typename... Args >
struct is_nothrow_constructible;
75template<
typename T >
struct has_default_constructor;
76template<
typename T >
struct has_copy_constructor;
77template<
typename T >
struct has_copy_assign;
78template<
typename T >
struct has_move_constructor;
79template<
typename T >
struct has_move_assign;
80template<
typename T >
struct has_trivial_default_constructor;
81template<
typename T >
struct has_trivial_copy_constructor;
82template<
typename T >
struct has_trivial_move_constructor;
83template<
typename T >
struct has_trivial_copy_assign;
84template<
typename T >
struct has_trivial_move_assign;
85template<
typename T >
struct has_trivial_destructor;
86template<
typename T >
struct has_nothrow_default_constructor;
87template<
typename T >
struct has_nothrow_copy_constructor;
88template<
typename T >
struct has_nothrow_move_constructor;
89template<
typename T >
struct has_nothrow_copy_assign;
90template<
typename T >
struct has_nothrow_move_assign;
91template<
typename T >
struct has_virtual_destructor;
93template<
typename T >
struct is_signed;
94template<
typename T >
struct is_unsigned;
96template<
typename T >
struct alignment_of;
98template<
typename T >
struct rank;
99template<
typename T,
unsigned I = 0 >
struct extent;
102template<
typename T,
typename U >
struct is_same;
104template<
typename Base,
typename Derived >
struct is_base_of;
106template<
typename From,
typename To >
struct is_convertible;
108template<
typename From,
typename To >
struct is_explicitly_convertible;
112template<
typename T >
struct remove_const;
113template<
typename T >
struct remove_volatile;
114template<
typename T >
struct remove_cv;
115template<
typename T >
struct add_const;
116template<
typename T >
struct add_volatile;
117template<
typename T >
struct add_cv;
120template<
typename T >
struct remove_reference;
121template<
typename T >
struct add_lvalue_reference;
122template<
typename T >
struct add_rvalue_reference;
126template<
typename T >
struct make_signed;
127template<
typename T >
struct make_unsigned;
131template<
typename T >
struct remove_extent;
132template<
typename T >
struct remove_all_extents;
135template<
typename T >
struct remove_pointer;
136template<
typename T >
struct add_pointer;
140template< std::
size_t Len, std::
size_t Align >
struct aligned_storage;
141template< std::size_t Len,
typename... Types >
struct aligned_union;
142template<
typename T >
struct decay;
144template<
bool,
typename T =
void >
struct enable_if;
145template<
bool,
typename T,
typename F >
struct conditional;
147template<
typename... T >
struct common_type;
148template<
typename T >
struct underlying_type;
149template<
typename >
typename result_of;
150template<
typename F,
typename... ArgTypes >
typename result_of<F(ArgTypes...)>;
154template<
typename From,
typename To >
struct is_ptr_convertible;
155template<
typename From,
typename To,
typename R=
void >
struct enable_if_convertible;
156template<
typename From,
typename To,
typename R=
void >
struct enable_if_ptr_convertible;
157template<
typename P,
typename R=
void >
struct enable_if_auto_ptr;
164template<
typename T, T v >
165 struct integral_constant
168 typedef integral_constant<T,v>
type;
182typedef char (&
yes_t);
183typedef char (&
no_t ) [2];
216template<
typename U >
218template<
typename U >
226template<
typename T >
237template<
typename T >
238 struct encode<T const> :
public encode<T> { };
239template<
typename T >
240 struct encode<T volatile> :
public encode<T> { };
241template<
typename T >
242 struct encode<T const volatile> :
public encode<T> { };
245template<
typename T >
248template<
typename T >
249 struct encode<T const[]>
251template<
typename T >
252 struct encode<T volatile[]>
254template<
typename T >
255 struct encode<T const volatile[]>
257template<
typename T,
unsigned N >
260template<
typename T,
unsigned N >
261 struct encode<T const[N]>
263template<
typename T,
unsigned N >
264 struct encode<T volatile[N]>
266template<
typename T,
unsigned N >
267 struct encode<T const volatile[N]>
278 struct encode<long
double>
286 struct encode<signed char>
292 struct encode<unsigned char>
296 struct encode<wchar_t>
303 struct encode<unsigned short>
309 struct encode<unsigned int>
315 struct encode<unsigned long>
319template<
typename T,
typename C >
320 struct encode<T (C::*)()>
322template<
typename T,
typename C >
323 struct encode<T (C::*)() const>
325template<
typename T,
typename C >
326 struct encode<T (C::*)() volatile>
328template<
typename T,
typename C >
329 struct encode<T (C::*)() const volatile>
331template<
typename T,
typename C
333 struct encode<T (C::*)(A1)>
335template<
typename T,
typename C
337 struct encode<T (C::*)(A1) const>
339template<
typename T,
typename C
341 struct encode<T (C::*)(A1) volatile>
343template<
typename T,
typename C
345 struct encode<T (C::*)(A1) const volatile>
347template<
typename T,
typename C
348 ,
typename A1,
typename A2 >
349 struct encode<T (C::*)(A1,A2)>
351template<
typename T,
typename C
352 ,
typename A1,
typename A2 >
353 struct encode<T (C::*)(A1,A2) const>
355template<
typename T,
typename C
356 ,
typename A1,
typename A2 >
357 struct encode<T (C::*)(A1,A2) volatile>
359template<
typename T,
typename C
360 ,
typename A1,
typename A2 >
361 struct encode<T (C::*)(A1,A2) const volatile>
363template<
typename T,
typename C
364 ,
typename A1,
typename A2,
typename A3 >
365 struct encode<T (C::*)(A1,A2,A3)>
367template<
typename T,
typename C
368 ,
typename A1,
typename A2,
typename A3 >
369 struct encode<T (C::*)(A1,A2,A3) const>
371template<
typename T,
typename C
372 ,
typename A1,
typename A2,
typename A3 >
373 struct encode<T (C::*)(A1,A2,A3) volatile>
375template<
typename T,
typename C
376 ,
typename A1,
typename A2,
typename A3 >
377 struct encode<T (C::*)(A1,A2,A3) const volatile>
379template<
typename T,
typename C
380 ,
typename A1,
typename A2,
typename A3,
typename A4 >
381 struct encode<T (C::*)(A1,A2,A3,A4)>
383template<
typename T,
typename C
384 ,
typename A1,
typename A2,
typename A3,
typename A4 >
385 struct encode<T (C::*)(A1,A2,A3,A4) const>
387template<
typename T,
typename C
388 ,
typename A1,
typename A2,
typename A3,
typename A4 >
389 struct encode<T (C::*)(A1,A2,A3,A4) volatile>
391template<
typename T,
typename C
392 ,
typename A1,
typename A2,
typename A3,
typename A4 >
393 struct encode<T (C::*)(A1,A2,A3,A4) const volatile>
395template<
typename T,
typename C
396 ,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5 >
397 struct encode<T (C::*)(A1,A2,A3,A4,A5)>
399template<
typename T,
typename C
400 ,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5 >
401 struct encode<T (C::*)(A1,A2,A3,A4,A5) const>
403template<
typename T,
typename C
404 ,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5 >
405 struct encode<T (C::*)(A1,A2,A3,A4,A5) volatile>
407template<
typename T,
typename C
408 ,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5 >
409 struct encode<T (C::*)(A1,A2,A3,A4,A5) const volatile>
413template<
typename T,
typename C >
414 struct encode<T C::*>
418template<
typename T >
423template<
typename T >
428#if defined(CLHEP_HAS_RVALUE_REFERENCE)
429template<
typename T >
440template<
typename T,
unsigned int p >
441 struct primary : integral_constant<bool, bool(p & encode<T>::value)> { };
450template<
typename T >
452 :
public tt::primary<T, tt::_void > { };
459template<
typename T >
461 :
public tt::primary<T, tt::_integral > { };
468template<
typename T >
469 struct is_floating_point
470 :
public tt::primary<T, tt::_floating_point > { };
476template<
typename T >
478 :
public tt::primary<T, tt::_array > { };
485template<
typename T >
487 :
public tt::primary<T, tt::_pointer > { };
494template<
typename T >
495 struct is_lvalue_reference
496 :
public tt::primary<T, tt::_lvalue_reference > { };
503template<
typename T >
struct is_rvalue_reference
504 :
public tt::primary<T, tt::_rvalue_reference > { };
511template<
typename T >
struct is_member_object_pointer
512 :
public conditional< is_member_function_pointer<T>::value
514 , tt::primary<T, tt::_member_object_pointer>
523template<
typename T >
524 struct is_member_function_pointer
525 :
public tt::primary<T, tt::_member_function_pointer > { };
532template<
typename T >
534 :
public tt::primary<T, tt::_enum > { };
541template<
typename T >
543 :
public tt::primary<T, tt::_union > { };
550template<
typename T >
552 :
public tt::primary<T, tt::_class > { };
559template<
typename T >
561 :
public tt::primary<T, tt::_function > { };
568template<
typename T >
570 :
public tt::primary< T, tt::_lvalue_reference
571 | tt::_rvalue_reference
580template<
typename T >
582 :
public tt::primary< T, tt::_integral
583 | tt::_floating_point
592template<
typename T >
593 struct is_fundamental
594 :
public tt::primary< T, tt::_integral
595 | tt::_floating_point
605template<
typename T >
607 :
public tt::primary< T, tt::_array
610 | tt::_floating_point
612 | tt::_member_object_pointer
613 | tt::_member_function_pointer
624template<
typename T >
626 :
public tt::primary< T, tt::_integral
627 | tt::_floating_point
630 | tt::_member_object_pointer
631 | tt::_member_function_pointer
640template<
typename T >
642 :
public tt::primary< T, tt::_array
644 | tt::_lvalue_reference
645 | tt::_rvalue_reference
646 | tt::_member_object_pointer
647 | tt::_member_function_pointer
660template<
typename T >
661 struct is_member_pointer
662 :
public tt::primary< T, tt::_member_object_pointer
663 | tt::_member_function_pointer
674template<
typename T >
677 static bool const is_c =
false;
678 static bool const is_v =
false;
687template<
typename T >
690 static bool const is_c =
true;
691 static bool const is_v =
false;
700template<
typename T >
701 struct cv<T volatile>
703 static bool const is_c =
false;
704 static bool const is_v =
true;
713template<
typename T >
714 struct cv<T const volatile>
716 static bool const is_c =
true;
717 static bool const is_v =
true;
726template<
typename T >
729 static bool const is_c =
false;
730 static bool const is_v =
false;
731 typedef T & add_c_type;
732 typedef T & add_v_type;
733 typedef T & add_cv_type;
734 typedef T & rem_c_type;
735 typedef T & rem_v_type;
736 typedef T & rem_cv_type;
746template<
typename T >
748 :
public integral_constant<bool, tt::cv<T>::is_c > { };
755template<
typename T >
757 :
public integral_constant<bool, tt::cv<T>::is_v > { };
766template<
typename,
bool >
767 struct is_abstract_class
770template<
typename C >
771 struct is_abstract_class<C,true>
774 template<
typename T >
776 template<
typename T >
780 static bool const value =
sizeof( take<C>(0) ) ==
sizeof(
yes_t);
790template<
typename T >
807 struct is_signed<signed char>
810 struct is_signed<short>
813 struct is_signed<int>
816 struct is_signed<long>
819template<
typename T >
820 struct is_signed<T const>
821 :
public is_signed<T> { };
822template<
typename T >
823 struct is_signed<T volatile>
824 :
public is_signed<T> { };
825template<
typename T >
826 struct is_signed<T const volatile>
827 :
public is_signed<T> { };
839 struct is_unsigned<unsigned char>
842 struct is_unsigned<unsigned short>
845 struct is_unsigned<unsigned int>
848 struct is_unsigned<unsigned long>
851template<
typename T >
852 struct is_unsigned<T const>
853 :
public is_unsigned<T> { };
854template<
typename T >
855 struct is_unsigned<T volatile>
856 :
public is_unsigned<T> { };
857template<
typename T >
858 struct is_unsigned<T const volatile>
859 :
public is_unsigned<T> { };
868template<
typename T >
874 static int const rank = 0;
876 template<
unsigned I >
877 struct extent {
static int const value = 0; };
880template<
typename T,
unsigned N >
888 template<
unsigned I >
893 : tt::arr<T>::template extent<I>::
value;
897template<
typename T >
903 static int const rank = 1;
905 template<
unsigned I >
906 struct extent {
static int const value = 0; };
916template<
typename T >
918 :
public integral_constant<int, tt::arr<T>::rank> { };
925template<
typename T,
unsigned I >
927 :
public integral_constant<int, tt::arr<T>::template extent<I>::value> { };
934template<
typename T,
typename U >
936template<
typename T >
937 struct is_same<T,T> :
public true_type { };
948 template<
typename T >
950 template<
typename T >
963template<
typename From,
typename To,
bool >
967template<
typename From,
typename To >
968struct converts<From,To,false>
976 static bool const value
977 =
sizeof( take( from, 0 ) ) ==
sizeof(
yes_t);
987template<
typename From,
typename To >
989 :
public tt::converts<From,To,is_abstract<To>::value> { };
991template< >
struct is_convertible<void,void>
994template<
typename T >
995 struct is_convertible<T,void>
998template<
typename T >
999 struct is_convertible<void,T>
1003 struct is_convertible<const void,const void>
1006template<
typename T >
1007 struct is_convertible<T,const void>
1010template<
typename T >
1011 struct is_convertible<const void,T>
1015 struct is_convertible<volatile void,volatile void>
1018template<
typename T >
1019 struct is_convertible<T,volatile void>
1022template<
typename T >
1023 struct is_convertible<volatile void,T>
1027 struct is_convertible<const volatile void,const volatile void>
1030template<
typename T >
1031 struct is_convertible<T,const volatile void>
1034template<
typename T >
1035 struct is_convertible<const volatile void,T>
1038template<
typename From,
int N,
typename To >
1039 struct is_convertible<From[N],To>
1040 :
public is_convertible<From*,To> { };
1042template<
typename From,
typename To,
int N >
1043 struct is_convertible<From,To[N]>
1051template<
typename T >
1062template<
typename T >
1063 struct remove_volatile
1073template<
typename T >
1084template<
typename T >
1095template<
typename T >
1106template<
typename T >
1125 #if defined(CLHEP_HAS_RVALUE_REFERENCE)
1126 typedef T&& add_rref_type;
1131template<
typename T >
1134 typedef T& add_lref_type;
1135 typedef T& add_rref_type;
1136 typedef T rem_ref_type;
1139#if defined(CLHEP_HAS_RVALUE_REFERENCE)
1140template<
typename T >
1143 typedef T& add_lref_type;
1144 typedef T&& add_rref_type;
1145 typedef T rem_ref_type;
1149template<
typename T >
1153 typedef T add_rref_type;
1164template<
typename T >
1165 struct remove_reference
1175template<
typename T >
1176 struct add_lvalue_reference
1186template<
typename T >
1187 struct add_rvalue_reference
1189 typedef typename tt::ref<T>::add_rref_type
type;
1199template<
typename T >
1206template<
typename T >
1209 typedef T * * add_ptr_type;
1210 typedef T rem_ptr_type;
1213template<
typename T >
1214 struct ptr<T *
const>
1216 typedef T *
const * add_ptr_type;
1217 typedef T rem_ptr_type;
1220template<
typename T >
1221 struct ptr<T *
volatile>
1223 typedef T *
volatile * add_ptr_type;
1224 typedef T rem_ptr_type;
1227template<
typename T >
1228 struct ptr<T *
const volatile>
1230 typedef T *
const volatile * add_ptr_type;
1231 typedef T rem_ptr_type;
1241template<
typename T >
1242 struct remove_extent
1252template<
typename T >
1253 struct remove_all_extents
1263template<
typename T >
1264 struct remove_pointer
1274template<
typename T >
1285template<
typename T >
struct enable_if<true ,T> {
typedef T type; };
1286template<
typename T >
struct enable_if<false,T> { };
1293template<
typename T,
typename F >
struct conditional<true ,T,F> {
typedef T type; };
1294template<
typename T,
typename F >
struct conditional<false,T,F> {
typedef F type; };
1301template<
typename From,
typename To >
1302 struct is_ptr_convertible
1309 static bool const value
1310 =
sizeof(
take(
static_cast<From*
>(0) ) ) ==
sizeof(
tt::yes_t);
1318template<
typename From
1323 :
public enable_if< is_convertible<From,To>::value, R > { };
1330template<
typename From
1334 struct enable_if_ptr_convertible
1335 :
public enable_if< is_ptr_convertible<From,To>::value, R > { };
1345 struct enable_if_auto_ptr { };
1347template<
typename P,
typename R >
1348 struct enable_if_auto_ptr< std::auto_ptr<P>, R >
@ _member_function_pointer
no_t isAfunction(U(*)[1])
yes_t isAclass(void(U::*)())
integral_constant< bool, true > true_type
integral_constant< bool, false > false_type
tt::cv< T >::add_c_type type
tt::cv< T >::add_cv_type type
tt::ref< T >::add_lref_type type
tt::ptr< T >::add_ptr_type type
tt::ref< T >::add_rref_type type
tt::cv< T >::add_v_type type
static value_type const value
integral_constant< T, v > type
static tt::yes_t take(To *)
static tt::no_t take(...)
tt::arr< T >::rem_arr_type type
tt::cv< T >::rem_c_type type
tt::cv< T >::rem_cv_type type
tt::arr< T >::rem_ext_type type
tt::ptr< T >::rem_ptr_type type
tt::ref< T >::rem_ref_type type
tt::cv< T >::rem_v_type type
any_conversion(T const volatile &)
static yes_t take(To, int)
static no_t take(any_conversion,...)
T const volatile add_cv_type
static primary_code const value
static no_t take(T(*)[1])
tt::ref< T >::rem_ref_type * add_ptr_type