OpenBarnyard
 
Loading...
Searching...
No Matches
TClass.cpp
Go to the documentation of this file.
1#include "ToshiPCH.h"
2#include "TClass.h"
3#include "TSystem.h"
4#include "Toshi/Typedefs.h"
5
6//-----------------------------------------------------------------------------
7// Enables memory debugging.
8// Note: Should be the last include!
9//-----------------------------------------------------------------------------
10#include "Core/TMemoryDebugOn.h"
11
13
14TClass::TClass( const TCHAR* a_szName, TClass* a_pParentClass, CreateObject_t a_fnCreate, CreateObjectInPlace_t a_fnCreateInPlace, Initialise_t a_fnInitialise, Deinitialise_t a_fnUnitialise, TUINT16 a_uiVersionMajor, TUINT16 a_uiVersionMinor, TUINT32 a_uiClassSize, TUINT32 a_uiClassAlignment )
15 : m_szName( a_szName ), m_pParent( a_pParentClass ), m_fnCreate( a_fnCreate ), m_fnCreateInPlace( a_fnCreateInPlace ), m_fnInitialise( a_fnInitialise ), m_fnDeinitialise( a_fnUnitialise ), m_uiVersionMajor( a_uiVersionMajor ), m_uiVersionMinor( a_uiVersionMinor ), m_uiClassSize( a_uiClassSize ), m_uiClassAlignment( a_uiClassAlignment ), m_bInitialised( TFALSE )
16{
17 if ( m_pParent )
18 {
19 TClass* pClass = m_pParent->m_pLastChildren;
20
21 while ( pClass != TNULL )
22 {
23 if ( pClass == this ) return;
24 pClass = pClass->m_pPrevious;
25 }
26
27 m_pPrevious = m_pParent->m_pLastChildren;
28 m_pParent->m_pLastChildren = this;
29 }
30}
31
33{
34 m_pLastChildren = TNULL;
35 m_pPrevious = TNULL;
36 m_pParent = TNULL;
37
38 // Uninitialize static
39 if ( m_bInitialised && m_fnDeinitialise )
40 {
41 m_bInitialised = TFALSE;
42 m_fnDeinitialise();
43 }
44}
45
47{
48 if ( m_fnInitialise )
49 {
50 m_fnInitialise();
51 m_bInitialised = TTRUE;
52 }
53}
54
56{
57 TBOOL valid = fCheck( this, custom );
58
59 if ( valid )
60 {
61 if ( fBaseBegin ) fBaseBegin( this, custom );
62 RecurseTree2( fBaseBegin, fBaseEnd, fCheck, custom );
63 if ( fBaseEnd ) fBaseEnd( this, custom );
64 }
65}
66
68{
69 for ( TClass* pClass = m_pLastChildren; pClass != TNULL; pClass = pClass->m_pPrevious )
70 {
71 if ( fCheck ) fCheck( pClass, custom );
72
73 if ( pClass->m_pLastChildren )
74 {
75 if ( fBaseBegin ) fBaseBegin( pClass, custom );
76 pClass->RecurseTree2( fBaseBegin, fBaseEnd, fCheck, custom );
77 if ( fBaseEnd ) fBaseEnd( pClass, custom );
78 }
79 }
80}
81
82TClass* TClass::FindRecurse( const TCHAR* const& name, TClass* parent, TBOOL hasPrevious )
83{
84 while ( parent )
85 {
86 TClass* previous = hasPrevious ? parent->m_pPrevious : TNULL;
87 TINT difference = Toshi::TStringManager::String8CompareNoCase( parent->m_szName, name, -1 );
88
89 if ( difference == 0 )
90 {
91 return parent;
92 }
93
94 if ( parent->m_pLastChildren )
95 {
96 TClass* result = FindRecurse( name, parent->m_pLastChildren, TTRUE );
97
98 if ( result )
99 {
100 return result;
101 }
102 }
103
104 parent = previous;
105 }
106
107 return TNULL;
108}
109
110TClass* TClass::Find( const TCHAR* name, TClass* parent )
111{
112 if ( parent == TNULL ) parent = &TObject::TClassObjectName;
113 return FindRecurse( name, parent, TFALSE );
114}
115
117{
118 if ( m_fnCreate != TNULL )
119 {
120 return m_fnCreate();
121 }
122
123 return TNULL;
124}
125
127{
128 if ( cmpClass->m_pLastChildren == TNULL )
129 {
130 return ( this == cmpClass );
131 }
132 else
133 {
134 TClass* pClass = this;
135
136 while ( pClass != TNULL )
137 {
138 if ( pClass == cmpClass )
139 {
140 return TTRUE;
141 }
142
143 pClass = pClass->m_pParent;
144 }
145 }
146
147 return TFALSE;
148}
149
151{
152 auto GetMaxSizeOfClass = []( TClass* a_pClass, void* a_pSize ) -> TBOOL {
153 if ( *(TUINT32*)a_pSize < a_pClass->m_uiClassSize )
154 {
155 *(TUINT32*)a_pSize = a_pClass->m_uiClassSize;
156 }
157
158 return TTRUE;
159 };
160
161 TUINT32 uiClassSize = 0;
162 if ( GetMaxSizeOfClass( this, &uiClassSize ) )
163 {
164 RecurseTree2( TNULL, TNULL, GetMaxSizeOfClass, &uiClassSize );
165 }
166
167 return uiClassSize;
168}
169
171{
172 auto GetMaxAlignmentOfClass = []( TClass* a_pClass, void* a_pAlignment ) -> TBOOL {
173 if ( *(TUINT32*)a_pAlignment < a_pClass->m_uiClassAlignment )
174 {
175 *(TUINT32*)a_pAlignment = a_pClass->m_uiClassAlignment;
176 }
177
178 return TTRUE;
179 };
180
181 TUINT32 uiAlignment = 0;
182 if ( GetMaxAlignmentOfClass( this, &uiAlignment ) )
183 {
184 RecurseTree2( TNULL, TNULL, GetMaxAlignmentOfClass, &uiAlignment );
185 }
186
187 return uiAlignment;
188}
189
191{
192 if ( !tClass->IsInitialized() )
193 {
194 tClass->Initialize();
195 }
196
197 return TTRUE;
198}
199
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
uint16_t TUINT16
Definition Typedefs.h:15
char TCHAR
Definition Typedefs.h:20
#define TNULL
Definition Typedefs.h:23
uint32_t TUINT32
Definition Typedefs.h:13
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
TObject *(*)() CreateObject_t
Definition TClass.h:10
class TObject * CreateObject() const
Definition TClass.cpp:116
TBOOL IsInitialized() const
Definition TClass.h:56
~TClass()
Definition TClass.cpp:32
static TClass * Find(const TCHAR *name, TClass *parent=TNULL)
Definition TClass.cpp:110
void(*)() Initialise_t
Definition TClass.h:12
void(*)() Deinitialise_t
Definition TClass.h:13
void RecurseTree(RecurseTreeBaseBeginCb_t fBaseBegin, RecurseTreeBaseEndCb_t fBaseEnd, RecurseTreeCheck_t fCheck, void *custom)
Definition TClass.cpp:55
void Initialize()
Definition TClass.cpp:46
TBOOL(*)(TClass *, void *) RecurseTreeCheck_t
Definition TClass.h:15
void(*)(TClass *, void *) RecurseTreeBaseEndCb_t
Definition TClass.h:17
TBOOL IsA(TClass *pClass)
Definition TClass.cpp:126
static TBOOL TryInitialize(TClass *tClass)
Definition TClass.cpp:190
void(*)(TClass *, void *) RecurseTreeBaseBeginCb_t
Definition TClass.h:16
TUINT32 GetMaxAlignmentOfDerivedClasses()
Definition TClass.cpp:170
static TClass * FindRecurse(const TCHAR *const &name, TClass *parent, TBOOL hasPrevious)
Definition TClass.cpp:82
void RecurseTree2(RecurseTreeBaseBeginCb_t fBaseBegin, RecurseTreeBaseEndCb_t fBaseEnd, RecurseTreeCheck_t fCheck, void *custom)
Definition TClass.cpp:67
TUINT32 GetMaxSizeOfDerivedClasses()
Definition TClass.cpp:150
TObject *(*)(void *a_pPtr) CreateObjectInPlace_t
Definition TClass.h:11
TClass(const TCHAR *a_szName, TClass *a_pParentClass, CreateObject_t a_fnCreate, CreateObjectInPlace_t a_fnCreateInPlace, Initialise_t a_fnInitialise, Deinitialise_t a_fnUnitialise, TUINT16 a_uiVersionMajor, TUINT16 a_uiVersionMinor, TUINT32 a_uiClassSize, TUINT32 a_uiClassAlignment)
Definition TClass.cpp:14