7 #ifndef PXR_BASE_TF_TYPE_IMPL_H
8 #define PXR_BASE_TF_TYPE_IMPL_H
12 template <
class DERIVED,
class BASE>
16 template <
typename TypeVector>
22 static const size_t NumBases = 0;
23 std::type_info
const **baseTypeInfos =
nullptr;
26 template <
typename... Bases>
29 static const size_t NumBases =
sizeof...(Bases);
30 std::type_info
const *baseTypeInfos[NumBases] = { &
typeid(Bases)... };
33 template <
class Derived,
typename TypeVector>
36 template <
class Derived>
43 template <
class Derived,
typename... Bases>
48 &Tf_CastToParent<Derived, Bases>... };
51 template <
class T,
class BaseTypes>
56 return _DeclareImpl(
typeid(
T), btis.baseTypeInfos, btis.NumBases);
59 template <
typename T,
typename BaseTypes>
66 typeid(
T), btis.baseTypeInfos, tcfs.castFunctions, btis.NumBases,
74 return Define<T, Bases<>>();
79 template <
class DERIVED,
class BASE>
85 DERIVED* derived =
reinterpret_cast<DERIVED*
>(addr);
90 BASE* base =
reinterpret_cast<BASE*
>(addr);
91 DERIVED* derived =
static_cast<DERIVED*
>(base);
98 #endif // PXR_BASE_TF_TYPE_IMPL_H
void *(*)(void *, bool) CastFunction
static TfType const & Declare()
static TfType const & Define()
Metafunction returning sizeof(T) for a type T (or 0 if T is a void type).
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
PXR_NAMESPACE_OPEN_SCOPE void * Tf_CastToParent(void *addr, bool derivedToBase)
#define PXR_NAMESPACE_CLOSE_SCOPE
void *(*)(void *, bool) CastFunction