35 #ifndef _BLAZE_UTIL_TYPETRAITS_HASMEMBER_H_
36 #define _BLAZE_UTIL_TYPETRAITS_HASMEMBER_H_
100 #define BLAZE_CREATE_HAS_DATA_OR_FUNCTION_MEMBER_TYPE_TRAIT( TYPE_TRAIT_NAME, MEMBER_NAME ) \
102 template < typename TYPE1230 > \
103 class TYPE_TRAIT_NAME##HELPER \
106 typedef char YES[1]; \
107 typedef char NO [2]; \
111 template< typename U, U > struct CHECK; \
113 struct FALLBACK { int MEMBER_NAME; }; \
116 : blaze::If< blaze::IsBuiltin<TYPE1230>, BASE, TYPE1230 >::Type \
120 template < typename U > \
121 static NO& TEST( CHECK<int FALLBACK::*, &U::MEMBER_NAME>* ); \
123 template < typename U > \
124 static YES& TEST( ... ); \
127 enum { value = sizeof( TEST<DERIVED>( NULL ) ) == sizeof( YES ) }; \
128 typedef typename blaze::SelectType<value,blaze::TrueType,blaze::FalseType>::Type Type; \
131 template< typename TYPE1230 > \
132 struct TYPE_TRAIT_NAME : public TYPE_TRAIT_NAME##HELPER<TYPE1230>::Type \
134 enum { value = TYPE_TRAIT_NAME##HELPER<TYPE1230>::value }; \
135 typedef typename TYPE_TRAIT_NAME##HELPER<TYPE1230>::Type Type; \
187 #define BLAZE_CREATE_HAS_TYPE_MEMBER_TYPE_TRAIT( TYPE_TRAIT_NAME, MEMBER_NAME ) \
189 template < typename TYPE1231 > \
190 struct TYPE_TRAIT_NAME##HELPER \
193 typedef char YES[1]; \
194 typedef char NO [2]; \
198 struct FALLBACK { struct MEMBER_NAME { }; }; \
201 : blaze::If< blaze::IsBuiltin<TYPE1231>, BASE, TYPE1231 >::Type \
205 template < class U > \
206 static NO& TEST( typename U::MEMBER_NAME* ); \
208 template < typename U > \
209 static YES& TEST( U* ); \
212 enum { value = sizeof( TEST<DERIVED>( NULL ) ) == sizeof( YES ) }; \
213 typedef typename blaze::SelectType<value,blaze::TrueType,blaze::FalseType>::Type Type; \
216 template< typename TYPE1231 > \
217 struct TYPE_TRAIT_NAME : public TYPE_TRAIT_NAME##HELPER<TYPE1231>::Type \
219 enum { value = TYPE_TRAIT_NAME##HELPER<TYPE1231>::value }; \
220 typedef typename TYPE_TRAIT_NAME##HELPER<TYPE1231>::Type Type; \
272 #define BLAZE_CREATE_HAS_MEMBER_TYPE_TRAIT( TYPE_TRAIT_NAME, MEMBER_NAME ) \
274 template< typename Type1232 > \
275 struct TYPE_TRAIT_NAME##HELPER \
278 BLAZE_CREATE_HAS_DATA_OR_FUNCTION_MEMBER_TYPE_TRAIT( LOCAL_TYPE_TRAIT_1, MEMBER_NAME ); \
279 BLAZE_CREATE_HAS_TYPE_MEMBER_TYPE_TRAIT( LOCAL_TYPE_TRAIT_2, MEMBER_NAME ); \
282 enum { value = LOCAL_TYPE_TRAIT_1<Type1232>::value || LOCAL_TYPE_TRAIT_2<Type1232>::value }; \
283 typedef typename blaze::SelectType<value,blaze::TrueType,blaze::FalseType>::Type Type; \
286 template< typename Type1232 > \
287 struct TYPE_TRAIT_NAME : public TYPE_TRAIT_NAME##HELPER<Type1232>::Type \
290 enum { value = TYPE_TRAIT_NAME##HELPER<Type1232>::value }; \
291 typedef typename TYPE_TRAIT_NAME##HELPER<Type1232>::Type Type; \
Header file for the FalseType type/value trait base class.
Header file for the If class template.
Header file for the SelectType class template.
Header file for the IsBuiltin type trait.
Header file for the TrueType type/value trait base class.