20 #ifndef __OpenKarto_MetaType_h__ 21 #define __OpenKarto_MetaType_h__ 50 template <
bool B,
class T =
void>
57 struct enable_if_c<false, T>
61 template <
class Cond,
class T =
void>
62 struct enable_if :
public enable_if_c<Cond::value, T>
66 template <
bool B,
class T>
67 struct lazy_enable_if_c
69 typedef typename T::type type;
73 struct lazy_enable_if_c<false, T>
77 template <
class Cond,
class T>
78 struct lazy_enable_if :
public lazy_enable_if_c<Cond::value, T>
82 template <
bool B,
class T =
void>
89 struct disable_if_c<true, T>
93 template <
class Cond,
class T =
void>
94 struct disable_if :
public disable_if_c<Cond::value, T>
98 template <
bool B,
class T>
99 struct lazy_disable_if_c
101 typedef typename T::type type;
105 struct lazy_disable_if_c<true, T>
109 template <
class Cond,
class T>
110 struct lazy_disable_if :
public lazy_disable_if_c<Cond::value, T>
120 struct remove_reference
127 struct remove_reference<T&>
144 template <
typename T>
154 template <
typename T>
155 struct is_pointer<T*>
170 template <
typename T>
173 static const char* Get(
kt_bool =
true)
176 return T::KARTO_REGISTER_ME_WITH_KARTO_TYPE();
189 template <
typename T>
198 template <
typename T>
199 struct KartoType<const T>
201 typedef typename KartoType<T>::Type Type;
208 template <
typename T>
211 typedef typename KartoType<T>::Type Type;
218 template <
typename T>
221 typedef typename KartoType<T>::Type Type;
231 template <
typename T>
232 const char* GetKartoTypeIdTemplate()
234 return KartoTypeId<typename KartoType<T>::Type>::Get();
240 template <
typename T>
241 const char* GetKartoTypeIdTemplate(
const T&)
243 return KartoTypeId<typename KartoType<T>::Type>::Get();
254 template <
typename T,
typename E =
void>
255 struct KartoObjectTraits
257 typedef T& RefReturnType;
259 static RefReturnType Get(
void* pPointer)
261 return *
static_cast<T*
>(pPointer);
268 template <
typename T>
269 struct KartoObjectTraits<T*>
271 typedef T* RefReturnType;
272 typedef T* PointerType;
274 static RefReturnType Get(
void* pPointer)
276 return static_cast<T*
>(pPointer);
279 static PointerType GetPointer(T* rValue)
288 template <
typename T>
289 struct KartoObjectTraits<T&,
typename disable_if<is_pointer<typename KartoObjectTraits<T>::RefReturnType> >::type>
291 typedef T& RefReturnType;
292 typedef T* PointerType;
294 static RefReturnType Get(
void* pPointer)
296 return *
static_cast<T*
>(pPointer);
299 static PointerType GetPointer(T& rValue)
308 template <
typename T>
309 struct KartoObjectTraits<T&,
typename enable_if< is_pointer< typename KartoObjectTraits< T >::RefReturnType > >::type > : KartoObjectTraits<T>
316 template <
typename T>
317 struct KartoObjectTraits<const T> : KartoObjectTraits<T>
329 template <
typename T>
330 struct KartoTypeHasRtti
335 template <
typename U, const
char* (U::*)() const>
336 struct CheckForMember
340 template <
typename U>
static Yes HasMemberFunction(CheckForMember<U, &U::GetKartoClassId>*);
341 template <
typename U>
static No HasMemberFunction(...);
345 value =
sizeof(HasMemberFunction<typename KartoType<T>::Type>(0)) ==
sizeof(Yes)
357 template <
typename T,
typename E =
void>
358 struct GetKartoTypeIdTemplateRTTI
360 typedef KartoObjectTraits<const T&> Traits;
362 static const char* Get(
const T& rObject)
364 typename Traits::PointerType pointer = Traits::GetPointer(rObject);
365 return pointer ? pointer->GetKartoClassId() : GetKartoTypeIdTemplate<T>();
372 template <
typename T>
373 struct GetKartoTypeIdTemplateRTTI< T, typename disable_if< KartoTypeHasRtti<T> >::type >
375 static const char* Get(
const T&)
377 return GetKartoTypeIdTemplate<T>();
388 template <
typename T>
const char* GetTypeId()
390 return GetKartoTypeIdTemplate<T>();
396 template <
typename T>
const char* GetTypeId(
const T& rObject)
398 return GetKartoTypeIdTemplateRTTI<T>::Get(rObject);
407 #endif // __OpenKarto_MetaType_h__