OpenBarnyard
 
Loading...
Searching...
No Matches
TObject.h
Go to the documentation of this file.
1#pragma once
2#include "TClass.h"
3
4#include <type_traits>
5
6//-----------------------------------------------------------------------------
7// Disabled memory debugging.
8// Note: Should be the last include!
9//-----------------------------------------------------------------------------
11
12#define TClassObjectName ms_oClass
13#define TGetClass( CLASS ) CLASS::TClassObjectName
14
15//-----------------------------------------------------------------------------
16// Declares default methods used to register class in the dynamic class system.
17// Note: Doesn't declare ms_oClass object (Use TDECLARE_CLASS to auto-declare).
18//-----------------------------------------------------------------------------
19#define TDECLARE_CLASS_BODY( THIS_CLASS, PARENT_CLASS ) \
20public: \
21 using ThisClass = THIS_CLASS; \
22 using BaseClass = PARENT_CLASS; \
23 static constexpr Toshi::TClass* PARENTCLASS = &TGetClass( PARENT_CLASS ); \
24 \
25 virtual Toshi::TClass* GetClass() override; \
26 \
27 static Toshi::TObject* CreateTObject(); \
28 static Toshi::TObject* CreateTObjectInPlace( void* a_pPtr ); \
29 static void InitialiseClass(); \
30 static void DeinitialiseClass(); \
31 \
32 static TFORCEINLINE Toshi::TClass* GetClassStatic() { return std::addressof( TClassObjectName ); }
33
34//-----------------------------------------------------------------------------
35// Declares default methods to register derived class and ms_oClass object.
36// Note: Use one of the TDEFINE_CLASS macros in a cpp file to register class.
37//-----------------------------------------------------------------------------
38#define TDECLARE_CLASS( THIS_CLASS, PARENT_CLASS ) \
39 TDECLARE_CLASS_BODY( THIS_CLASS, PARENT_CLASS ); \
40 static Toshi::TClass TClassObjectName
41
42//-----------------------------------------------------------------------------
43// Declares default methods to register class and ms_oClass object.
44// Note: Use one of the TDEFINE_CLASS macros in a cpp file to register class.
45//-----------------------------------------------------------------------------
46#define TDECLARE_CLASS_COMPILETIME( THIS_CLASS, PARENT_CLASS ) \
47 TDECLARE_CLASS_BODY( THIS_CLASS, PARENT_CLASS ); \
48 static constinit Toshi::TClass TClassObjectName;
49
50//-----------------------------------------------------------------------------
51// Defines core methods of TObject and allows creating object at runtime.
52//-----------------------------------------------------------------------------
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(); }
59
60//-----------------------------------------------------------------------------
61// Defines core methods of TObject and prohibits creating object at runtime.
62//-----------------------------------------------------------------------------
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() \
68 { \
69 TASSERT( TFALSE, "This class cannot be created at runtime!" ); \
70 return TNULL; \
71 } \
72 Toshi::TObject* CLASS::CreateTObjectInPlace( void* a_pPtr ) \
73 { \
74 TASSERT( TFALSE, "This class cannot be created at runtime!" ); \
75 return TNULL; \
76 }
77
78//-----------------------------------------------------------------------------
79// Defines core methods of TObject and allows creating object at runtime.
80// Note: Doesn't have type checks.
81//-----------------------------------------------------------------------------
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(); }
87
88//-----------------------------------------------------------------------------
89// Defines core methods of TObject and allows creating object at runtime.
90// Also, adds empty InitialiseClass and DeinitialiseClass methods.
91//-----------------------------------------------------------------------------
92#define TDEFINE_CLASS_FULL( CLASS ) \
93 TDEFINE_CLASS_CORE( CLASS ) \
94 void CLASS::InitialiseClass() {} \
95 void CLASS::DeinitialiseClass() {}
96
97//-----------------------------------------------------------------------------
98// Defines core methods of TObject and prohibits creating object at runtime.
99// Also, adds empty InitialiseClass and DeinitialiseClass methods.
100//-----------------------------------------------------------------------------
101#define TDEFINE_CLASS_FULL_NORUNTIME( CLASS ) \
102 TDEFINE_CLASS_CORE_NORUNTIME( CLASS ) \
103 void CLASS::InitialiseClass() {} \
104 void CLASS::DeinitialiseClass() {}
105
106//-----------------------------------------------------------------------------
107// Defines core methods of TObject and allows creating object at runtime.
108// Also, adds empty InitialiseClass and DeinitialiseClass methods.
109// Note: Doesn't have type checks.
110//-----------------------------------------------------------------------------
111#define TDEFINE_CLASS_FULL_COMPILETIME( CLASS ) \
112 TDEFINE_CLASS_CORE_COMPILETIME( CLASS ) \
113 void CLASS::InitialiseClass() {} \
114 void CLASS::DeinitialiseClass() {}
115
116//-----------------------------------------------------------------------------
117// Defines all TObject methods and the ms_oClass object.
118// Note: Can be created at runtime.
119//-----------------------------------------------------------------------------
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 ) );
127
128//-----------------------------------------------------------------------------
129// Defines all TObject methods and the ms_oClass object.
130// Note: Cannot be created at runtime!
131//-----------------------------------------------------------------------------
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__ )
139
140//-----------------------------------------------------------------------------
141// Defines core TObject methods and the ms_oClass object.
142// Provide InitialiseClass and DeinitialiseClass methods manually.
143// Note: Can be created at runtime.
144//-----------------------------------------------------------------------------
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__ )
152
153//-----------------------------------------------------------------------------
154// Defines core TObject methods and the ms_oClass object.
155// Provide InitialiseClass and DeinitialiseClass methods manually.
156// Note: Cannot be created at runtime!
157//-----------------------------------------------------------------------------
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__ )
165
166//-----------------------------------------------------------------------------
167// Defines all TObject methods and the ms_oClass object.
168// Note: ms_oClass object is created at compile time.
169//-----------------------------------------------------------------------------
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 ) );
173
175
177{
178public:
179 enum
180 {
182 };
183 static constexpr Toshi::TClass* PARENTCLASS = TNULL;
184
185public:
186 virtual Toshi::TClass* GetClass();
187 virtual void Delete();
188 virtual ~TObject();
189
190public:
191 TBOOL IsExactly( TClass* a_pClass ) { return GetClass() == a_pClass; }
192 TBOOL IsA( TClass* a_pClass ) { return GetClass()->IsA( a_pClass ); }
193
194public:
195 static Toshi::TObject* CreateTObject();
196 static Toshi::TObject* CreateTObjectInPlace( void* a_pPtr );
197 static void InitialiseClass();
198 static void DeinitialiseClass();
199
200 static TFORCEINLINE TClass* GetClassStatic() { return std::addressof( TClassObjectName ); }
201
202public:
203 static constinit Toshi::TClass TClassObjectName;
204};
205
207
208//-----------------------------------------------------------------------------
209// Safely casts TObject to specified TClass
210//-----------------------------------------------------------------------------
211template <class T>
212TFORCEINLINE T* TDynamicCast( Toshi::TObject* a_pObject )
213{
214 TSTATICASSERT( T::IsTObject );
215
216 if ( a_pObject )
217 {
218 if ( a_pObject->IsA( &TGetClass( T ) ) )
219 {
220 return TSTATICCAST( T, a_pObject );
221 }
222 }
223
224 return TNULL;
225}
226
227#define TDYNAMICCAST( T, OBJECT ) ( TDynamicCast<T>( OBJECT ) )
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TFORCEINLINE
Definition Defines.h:74
#define TSTATICASSERT(...)
Definition Defines.h:67
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
#define TClassObjectName
Definition TObject.h:12
#define TGetClass(CLASS)
Definition TObject.h:13
TOSHI_NAMESPACE_END TFORCEINLINE T * TDynamicCast(Toshi::TObject *a_pObject)
Definition TObject.h:212
#define TNULL
Definition Typedefs.h:23
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
Definition TClass.h:8
@ IsTObject
Definition TObject.h:181
static constexpr Toshi::TClass * PARENTCLASS
Definition TObject.h:183
static void DeinitialiseClass()
Definition TObject.cpp:12
static TFORCEINLINE TClass * GetClassStatic()
Definition TObject.h:200
static Toshi::TObject * CreateTObjectInPlace(void *a_pPtr)
Definition TObject.cpp:12
static Toshi::TObject * CreateTObject()
Definition TObject.cpp:12
virtual Toshi::TClass * GetClass()
Definition TObject.cpp:12
TBOOL IsA(TClass *a_pClass)
Definition TObject.h:192
virtual ~TObject()
Definition TObject.cpp:19
TBOOL IsExactly(TClass *a_pClass)
Definition TObject.h:191
static void InitialiseClass()
Definition TObject.cpp:12
virtual void Delete()
Definition TObject.cpp:14