12#define TClassObjectName ms_oClass
13#define TGetClass( CLASS ) CLASS::TClassObjectName
19#define TDECLARE_CLASS_BODY( THIS_CLASS, PARENT_CLASS ) \
21 using ThisClass = THIS_CLASS; \
22 using BaseClass = PARENT_CLASS; \
23 static constexpr Toshi::TClass* PARENTCLASS = &TGetClass( PARENT_CLASS ); \
25 virtual Toshi::TClass* GetClass() override; \
27 static Toshi::TObject* CreateTObject(); \
28 static Toshi::TObject* CreateTObjectInPlace( void* a_pPtr ); \
29 static void InitialiseClass(); \
30 static void DeinitialiseClass(); \
32 static TFORCEINLINE Toshi::TClass* GetClassStatic() { return std::addressof( TClassObjectName ); }
38#define TDECLARE_CLASS( THIS_CLASS, PARENT_CLASS ) \
39 TDECLARE_CLASS_BODY( THIS_CLASS, PARENT_CLASS ); \
40 static Toshi::TClass TClassObjectName
46#define TDECLARE_CLASS_COMPILETIME( THIS_CLASS, PARENT_CLASS ) \
47 TDECLARE_CLASS_BODY( THIS_CLASS, PARENT_CLASS ); \
48 static constinit Toshi::TClass TClassObjectName;
53#define TDEFINE_CLASS_CORE( CLASS ) \
54 TSTATICASSERT( CLASS::IsTObject ); \
55 TSTATICASSERT( std::is_base_of<CLASS::BaseClass, CLASS>::value && !std::is_same<CLASS::BaseClass, CLASS>::value ); \
56 Toshi::TClass* CLASS::GetClass() { return CLASS::GetClassStatic(); } \
57 Toshi::TObject* CLASS::CreateTObject() { return new CLASS(); } \
58 Toshi::TObject* CLASS::CreateTObjectInPlace( void* a_pPtr ) { return new ( a_pPtr ) CLASS(); }
63#define TDEFINE_CLASS_CORE_NORUNTIME( CLASS ) \
64 TSTATICASSERT( CLASS::IsTObject ); \
65 TSTATICASSERT( std::is_base_of<CLASS::BaseClass, CLASS>::value && !std::is_same<CLASS::BaseClass, CLASS>::value ); \
66 Toshi::TClass* CLASS::GetClass() { return CLASS::GetClassStatic(); } \
67 Toshi::TObject* CLASS::CreateTObject() \
69 TASSERT( TFALSE, "This class cannot be created at runtime!" ); \
72 Toshi::TObject* CLASS::CreateTObjectInPlace( void* a_pPtr ) \
74 TASSERT( TFALSE, "This class cannot be created at runtime!" ); \
82#define TDEFINE_CLASS_CORE_COMPILETIME( CLASS ) \
83 TSTATICASSERT( CLASS::IsTObject ); \
84 Toshi::TClass* CLASS::GetClass() { return CLASS::GetClassStatic(); } \
85 Toshi::TObject* CLASS::CreateTObject() { return new CLASS(); } \
86 Toshi::TObject* CLASS::CreateTObjectInPlace( void* a_pPtr ) { return new ( a_pPtr ) CLASS(); }
92#define TDEFINE_CLASS_FULL( CLASS ) \
93 TDEFINE_CLASS_CORE( CLASS ) \
94 void CLASS::InitialiseClass() {} \
95 void CLASS::DeinitialiseClass() {}
101#define TDEFINE_CLASS_FULL_NORUNTIME( CLASS ) \
102 TDEFINE_CLASS_CORE_NORUNTIME( CLASS ) \
103 void CLASS::InitialiseClass() {} \
104 void CLASS::DeinitialiseClass() {}
111#define TDEFINE_CLASS_FULL_COMPILETIME( CLASS ) \
112 TDEFINE_CLASS_CORE_COMPILETIME( CLASS ) \
113 void CLASS::InitialiseClass() {} \
114 void CLASS::DeinitialiseClass() {}
120#define TDEFINE_CLASS( ... ) CALL_OVERLOAD( TDEFINE_CLASS, __VA_ARGS__ )
121#define TDEFINE_CLASS1( CLASS ) \
122 TDEFINE_CLASS_FULL( CLASS ) \
123 Toshi::TClass CLASS::TClassObjectName = Toshi::TClass( #CLASS, CLASS::PARENTCLASS, CLASS::CreateTObject, CLASS::CreateTObjectInPlace, CLASS::InitialiseClass, CLASS::DeinitialiseClass, 0, 1, sizeof( CLASS ), alignof( CLASS ) );
124#define TDEFINE_CLASS3( CLASS, VER_MAJOR, VER_MINOR ) \
125 TDEFINE_CLASS_FULL( CLASS ) \
126 Toshi::TClass CLASS::TClassObjectName = Toshi::TClass( #CLASS, CLASS::PARENTCLASS, CLASS::CreateTObject, CLASS::CreateTObjectInPlace, CLASS::InitialiseClass, CLASS::DeinitialiseClass, VER_MAJOR, VER_MINOR, sizeof( CLASS ), alignof( CLASS ) );
132#define TDEFINE_CLASS_NORUNTIME1( CLASS ) \
133 TDEFINE_CLASS_FULL_NORUNTIME( CLASS ) \
134 Toshi::TClass CLASS::TClassObjectName = Toshi::TClass( #CLASS, CLASS::PARENTCLASS, CLASS::CreateTObject, CLASS::CreateTObjectInPlace, CLASS::InitialiseClass, CLASS::DeinitialiseClass, 0, 1, sizeof( CLASS ), alignof( CLASS ) );
135#define TDEFINE_CLASS_NORUNTIME3( CLASS, VER_MAJOR, VER_MINOR ) \
136 TDEFINE_CLASS_FULL_NORUNTIME( CLASS ) \
137 Toshi::TClass CLASS::TClassObjectName = Toshi::TClass( #CLASS, CLASS::PARENTCLASS, CLASS::CreateTObject, CLASS::CreateTObjectInPlace, CLASS::InitialiseClass, CLASS::DeinitialiseClass, VER_MAJOR, VER_MINOR, sizeof( CLASS ), alignof( CLASS ) );
138#define TDEFINE_CLASS_NORUNTIME( ... ) CALL_OVERLOAD( TDEFINE_CLASS_NORUNTIME, __VA_ARGS__ )
145#define TDEFINE_CLASS_INIT1( CLASS ) \
146 TDEFINE_CLASS_CORE( CLASS ) \
147 Toshi::TClass CLASS::TClassObjectName = Toshi::TClass( #CLASS, CLASS::PARENTCLASS, CLASS::CreateTObject, CLASS::CreateTObjectInPlace, CLASS::InitialiseClass, CLASS::DeinitialiseClass, 0, 1, sizeof( CLASS ), alignof( CLASS ) );
148#define TDEFINE_CLASS_INIT3( CLASS, VER_MAJOR, VER_MINOR ) \
149 TDEFINE_CLASS_CORE( CLASS ) \
150 Toshi::TClass CLASS::TClassObjectName = Toshi::TClass( #CLASS, CLASS::PARENTCLASS, CLASS::CreateTObject, CLASS::CreateTObjectInPlace, CLASS::InitialiseClass, CLASS::DeinitialiseClass, VER_MAJOR, VER_MINOR, sizeof( CLASS ), alignof( CLASS ) );
151#define TDEFINE_CLASS_INIT( ... ) CALL_OVERLOAD( TDEFINE_CLASS_INIT, __VA_ARGS__ )
158#define TDEFINE_CLASS_INIT_NORUNTIME1( CLASS ) \
159 TDEFINE_CLASS_CORE_NORUNTIME( CLASS ) \
160 Toshi::TClass CLASS::TClassObjectName = Toshi::TClass( #CLASS, CLASS::PARENTCLASS, CLASS::CreateTObject, CLASS::CreateTObjectInPlace, CLASS::InitialiseClass, CLASS::DeinitialiseClass, 0, 1, sizeof( CLASS ), alignof( CLASS ) );
161#define TDEFINE_CLASS_INIT_NORUNTIME3( CLASS, VER_MAJOR, VER_MINOR ) \
162 TDEFINE_CLASS_CORE_NORUNTIME( CLASS ) \
163 Toshi::TClass CLASS::TClassObjectName = Toshi::TClass( #CLASS, CLASS::PARENTCLASS, CLASS::CreateTObject, CLASS::CreateTObjectInPlace, CLASS::InitialiseClass, CLASS::DeinitialiseClass, VER_MAJOR, VER_MINOR, sizeof( CLASS ), alignof( CLASS ) );
164#define TDEFINE_CLASS_INIT_NORUNTIME( ... ) CALL_OVERLOAD( TDEFINE_CLASS_INIT_NORUNTIME, __VA_ARGS__ )
170#define TDEFINE_CLASS_COMPILETIME( CLASS, VER_MAJOR, VER_MINOR ) \
171 TDEFINE_CLASS_FULL_COMPILETIME( CLASS ) \
172 constinit Toshi::TClass CLASS::TClassObjectName = Toshi::TClass( #CLASS, CLASS::CreateTObject, CLASS::CreateTObjectInPlace, CLASS::InitialiseClass, CLASS::DeinitialiseClass, VER_MAJOR, VER_MINOR, sizeof( CLASS ), alignof( CLASS ) );
227#define TDYNAMICCAST( T, OBJECT ) ( TDynamicCast<T>( OBJECT ) )
#define TSTATICCAST(POINTERTYPE, VALUE)
#define TOSHI_NAMESPACE_START
#define TSTATICASSERT(...)
#define TOSHI_NAMESPACE_END
TOSHI_NAMESPACE_END TFORCEINLINE T * TDynamicCast(Toshi::TObject *a_pObject)
static constexpr Toshi::TClass * PARENTCLASS
static void DeinitialiseClass()
static TFORCEINLINE TClass * GetClassStatic()
static Toshi::TObject * CreateTObjectInPlace(void *a_pPtr)
static Toshi::TObject * CreateTObject()
virtual Toshi::TClass * GetClass()
TBOOL IsA(TClass *a_pClass)
TBOOL IsExactly(TClass *a_pClass)
static void InitialiseClass()