16template<
bool flag,
typename T,
typename F >
23template<
typename T,
typename F >
24class Select< false, T, F >
32template<
typename T,
typename U >
36 class B {
char dummy[2]; };
43 exists =
sizeof(test(make_T())) ==
sizeof(S),
44 two_way = exists && Conversion<U,T>::exists,
45 exists_2_way = two_way,
51class Conversion<void, void>
54 enum { exists = 1, two_way = 1, exists_2_way = two_way, same_type = 1 };
61 enum { exists = 1, two_way = 1, exists_2_way = two_way, same_type = 1 };
65class Conversion<void, T>
68 enum { exists = 0, two_way = 0, exists_2_way = two_way, same_type = 0 };
72class Conversion<T, void>
75 enum { exists = 0, two_way = 0, exists_2_way = two_way, same_type = 0 };
87 template<
typename U >
class Pointer_traits
90 typedef Null_type Pointee;
91 enum { value =
false };
94 template<
typename U >
class Pointer_traits< U* >
98 enum { value =
true };
101 template<
typename U >
struct Ref_traits
103 enum { value =
false };
107 template<
typename U >
struct Ref_traits<U&>
109 enum { value =
true };
114 template<
typename U >
struct Add_ref {
typedef U &Type; };
115 template<
typename U >
struct Add_ref<U&> {
typedef U Type; };
117 template<
typename U >
struct PMF_traits {
enum { value =
false }; };
118 template<
typename U,
typename F >
struct PMF_traits<U F::*>
119 {
enum { value =
true }; };
122 template<
typename U >
class Is_unsigned {
public:
enum { value =
false }; };
123 template<>
class Is_unsigned<unsigned> {
public:
enum { value =
true }; };
124 template<>
class Is_unsigned<unsigned char> {
125 public:
enum { value =
true };
127 template<>
class Is_unsigned<unsigned short> {
128 public:
enum { value =
true };
130 template<>
class Is_unsigned<unsigned long> {
131 public:
enum { value =
true };
133 template<>
class Is_unsigned<unsigned long long> {
134 public:
enum { value =
true };
137 template<
typename U >
class Is_signed {
public:
enum { value =
false }; };
138 template<>
class Is_signed<signed char> {
public:
enum { value =
true }; };
139 template<>
class Is_signed<signed short> {
public:
enum { value =
true }; };
140 template<>
class Is_signed<signed> {
public:
enum { value =
true }; };
141 template<>
class Is_signed<signed long> {
public:
enum { value =
true }; };
142 template<>
class Is_signed<signed long long> {
143 public:
enum { value =
true };
146 template<
typename U >
class Is_int {
public:
enum { value =
false }; };
147 template<>
class Is_int< char > {
public:
enum { value =
true }; };
148 template<>
class Is_int< bool > {
public:
enum { value =
true }; };
149 template<>
class Is_int< wchar_t > {
public:
enum { value =
true }; };
151 template<
typename U >
class Is_float {
public:
enum { value =
false }; };
152 template<>
class Is_float< float > {
public:
enum { value =
true }; };
153 template<>
class Is_float< double > {
public:
enum { value =
true }; };
154 template<>
class Is_float< long double > {
public:
enum { value =
true }; };
156 template<
typename T>
class Const_traits
159 enum { value =
false };
161 typedef const T Const_type;
164 template<
typename T>
class Const_traits<const T>
167 enum { value =
true };
169 typedef const T Const_type;
173template<
typename T >
180 is_unsigned = TT::Is_unsigned<T>::value,
181 is_signed = TT::Is_signed<T>::value,
182 is_int = TT::Is_int<T>::value,
183 is_float = TT::Is_float<T>::value,
184 is_pointer = TT::Pointer_traits<T>::value,
185 is_pointer_to_member = TT::PMF_traits<T>::value,
186 is_reference = TT::Ref_traits<T>::value,
187 is_scalar = is_unsigned || is_signed || is_int || is_pointer
188 || is_pointer_to_member || is_reference,
189 is_fundamental = is_unsigned || is_signed || is_float
190 || Conversion<T, void>::same_type,
191 is_const = TT::Const_traits<T>::value,
194 (
sizeof(T) >=
sizeof(
unsigned long)
195 ?
sizeof(
unsigned long)
196 : (sizeof(T) >= sizeof(unsigned)
198 : (sizeof(T) >= sizeof(short)
203 typedef typename Select<is_scalar, T, typename TT::Add_ref<typename TT::Const_traits<T>::Const_type>::Type>::Type Param_type;
204 typedef typename TT::Pointer_traits<T>::Pointee Pointee_type;
205 typedef typename TT::Ref_traits<T>::Referee Referee_type;
206 typedef typename TT::Const_traits<T>::Type Non_const_type;
207 typedef typename TT::Const_traits<T>::Const_type Const_type;
209 static unsigned long align(
unsigned long a)
211 return (a +
static_cast<unsigned long>(alignment) - 1UL)
212 & ~(
static_cast<unsigned long>(alignment) - 1UL);