OROCHI
 
Loading...
Searching...
No Matches
GxBase.h
Go to the documentation of this file.
1//===========================================================================
9//===========================================================================
10#pragma once
11
12GX_CORE_NAMESPACE_BEGIN()
13
14#if GX_DEVELOP
15class GxGuiBase;
16#endif //GX_DEVELOP
18
19//===========================================================================
22//===========================================================================
24{
25 //-------------------------------------------------------------
27 //-------------------------------------------------------------
29public:
30 // RTTIの取得
31 static GxRtti& __getStaticRtti(void){ return GxRtti::getRttiRoot(); }
32
34 //-------------------------------------------------------------
36 //-------------------------------------------------------------
38
39#if GX_DEVELOP
41 static GxGuiBase* createGui(GxProperty& property, GxTypedObject* pOwner, const GxRtti& rtti, u32 index = 0);
42#endif //GX_DEVELOP
43
45};
46
47//===========================================================================
49//===========================================================================
51{
52 //-------------------------------------------------------------
54 //-------------------------------------------------------------
56public:
58 constexpr GxClassBaseRoot(void){}
60 constexpr GxClassBaseRoot(const GxClassBaseRoot&){}
62 virtual ~GxClassBaseRoot(void){}
64 constexpr GxClassBaseRoot& operator = (const GxClassBaseRoot& /*classBaseRoot*/){ return *this; }
65
67 //-------------------------------------------------------------
69 //-------------------------------------------------------------
71
73 GX_FORCE_INLINE static GxRtti& __getStaticRtti(void){ return GxRtti::getRttiRoot(); }
75 virtual GxRtti& getRtti(void) const = 0;
77 GX_FORCE_INLINE virtual const GxTypedObject* getDefaultObject(void) { return getRtti().getDefaultObject(); }
79 GX_FORCE_INLINE b32 isDefaultObject(void) { return getDefaultObject() == this; }
80
82};
83
84//===========================================================================
86//===========================================================================
88{
89 //-------------------------------------------------------------
91 //-------------------------------------------------------------
93public:
94 // RTTI定義
95 GX_RTTI_CLASS(GxClassBase, GxClassBaseRoot)
96
97
98 //-------------------------------------------------------------
100 //-------------------------------------------------------------
102
104 constexpr GxClassBase(void){}
106 constexpr GxClassBase(const GxClassBase& base) : GxClassBaseRoot(base){}
108 ~GxClassBase(void) override {}
109#if GX_DEVELOP
111 static GxGuiBase* createGui(GxProperty& property, GxTypedObject* pOwner, const GxRtti& rtti, u32 index){ return GxStructBase::createGui(property, pOwner, rtti, index); }
112#endif //GX_DEVELOP
113
115};
116
118//===========================================================================
120//===========================================================================
122{
123 //-------------------------------------------------------------
125 //-------------------------------------------------------------
127public:
128 // RTTI定義
131 static constexpr s32 DELAY_RELEASE_COUNT_INFINITY = -1;
132
134 //-------------------------------------------------------------
136 //-------------------------------------------------------------
138
144 ~GxClassBaseReference(void) override;
146 virtual void cleanup(void);
148 static void initializeDelayRelease(void);
150 static void terminateDelayRelease(void);
151
153 constexpr GxClassBaseReference& operator = (const GxClassBaseReference& base);
154
155private:
157#if GX_DEBUG_NEW
158 constexpr void* operator new[](size_t size, GX_CSTR filename = __FILE__, u32 line = __LINE__);
159#else // GX_DEBUG_NEW
160 constexpr void* operator new[](size_t size);
161#endif // GX_DEBUG_NEW
162
164 //-------------------------------------------------------------
166 //-------------------------------------------------------------
168public:
170 virtual s32 addReference(void);
172 virtual s32 release(void);
174 static void updateDelayRelease(void);
175#if GX_DEVELOP
177 static GxGuiBase* createGui(GxProperty& property, GxTypedObject* pOwner, const GxRtti& rtti, u32 index){ return GxStructBase::createGui(property, pOwner, rtti, index); }
178#endif //GX_DEVELOP
179
181 //-------------------------------------------------------------
183 //-------------------------------------------------------------
185
187 virtual s32 getReferenceCount(void) const { return _referenceCount; }
189 static b32 isDelayReleaseEnable(void){ return _delayReleaseFlag; }
191 static u32 getDelayReleaseListCount(void);
193 constexpr void setDelayReleaseCount(s32 count) { _delayReleaseCount = count; }
196
198 //-------------------------------------------------------------
200 //-------------------------------------------------------------
202protected:
205private:
206 static GxArrayClassBase* _pDelayReleaseList;
207 static b32 _delayReleaseFlag;
208 static GxCriticalSection** _ppDelayReleaseCriticalSection;
209#if GX_DEVELOP
210 b32 _cleanupFlag;
211#endif //GX_DEVELOP
212
214};
215
216//---------------------------------------------------------------------------
217// オブジェクトメンバ関数へのポインタ
218//---------------------------------------------------------------------------
219typedef void (GxClassBaseRoot::* GX_OBJECT_FUNCTION)(void);
220typedef void (GxClassBaseRoot::* GX_OBJECT_FUNCTION_PARAM)(u32);
221typedef void (GxClassBaseRoot::* GX_OBJECT_FUNCTION_POINTER)(void*);
222
223//---------------------------------------------------------------------------
224// 継承クラス用禁止宣言マクロ (継承クラスはクラス宣言に組み込むこと)
225//---------------------------------------------------------------------------
227#define GX_PROHIBIT_NEW(__CLASS__) \
228 protected: \
229 /* デストラクタ (GX_NEW, GX_RELEASE以外での生成・破棄禁止) */ \
230 ~__CLASS__(void) override {} \
231
233#define GX_PROHIBIT_COPY(__CLASS__) \
234 /* コピーコンストラクタ (コピー禁止) */ \
235 __CLASS__(const __CLASS__&) = delete; \
236 /* 代入演算子 (コピー禁止) */ \
237 GX_FORCE_INLINE const __CLASS__& operator=(const __CLASS__&) = delete; \
238
240#define GX_PROHIBIT_CLASS_BASE(__CLASS__) \
241 GX_PROHIBIT_COPY(__CLASS__) \
242
244#define GX_PROHIBIT_CLASS_BASE_REFERENCE(__CLASS__) \
245 GX_PROHIBIT_NEW(__CLASS__) \
246 GX_PROHIBIT_COPY(__CLASS__) \
247 public:
248
250#define GX_PROHIBIT_CLASS_BASE_REFERENCE_ALLOW_COPY(__CLASS__) \
251 GX_PROHIBIT_NEW(__CLASS__) \
252 public:
253
254//---------------------------------------------------------------------------
255//
256//---------------------------------------------------------------------------
257
258//---------------------------------------------------------------------------
263//---------------------------------------------------------------------------
264template<class T> T gx_cast(GxClassBaseRoot* pObject)
265{
266 if(!pObject)
267 {
268 return nullptr;
269 }
270 else if(!pObject->getRtti().isDerived(((T)0)->GX_RTTI))
271 {
272 return nullptr;
273 }
274 return static_cast<T>(pObject);
275}
276
277//---------------------------------------------------------------------------
282//---------------------------------------------------------------------------
283template<class T> T gx_cast(const GxClassBaseRoot* pObject)
284{
285 if(!pObject)
286 {
287 return nullptr;
288 }
289 else if(!pObject->getRtti().isDerived(((T)0)->GX_RTTI))
290 {
291 return nullptr;
292 }
293 return static_cast<T>(pObject);
294}
295
296//---------------------------------------------------------------------------
297// 代入演算子
300//---------------------------------------------------------------------------
302{
303 if(this == &base)
304 {
305 return *this;
306 }
307 Super::operator = (base);
310 return *this;
311}
312
313GX_CORE_NAMESPACE_END()
314
315
316#define GX_SAFE_RELEASE(__POINTER__) if(__POINTER__){ GxClassBaseReference* __pOld__ = __POINTER__; __POINTER__ = nullptr; __pOld__->release(); }
318#define GX_SET_CLASS_BASE_REFERENCE(__DST__, __SRC__) { \
319 GxClassBaseReference* __pOldBase__ = (__DST__); \
320 __DST__ = (__SRC__); \
321 if(__DST__) \
322 { \
323 (__DST__)->addReference(); \
324 } \
325 GX_SAFE_RELEASE(__pOldBase__); \
326}
T gx_cast(GxClassBaseRoot *pObject)
Definition GxBase.h:264
void GxTypedObject
その他
Definition GxDefine.h:213
配列クラス
Definition GxArrayClassBase.h:18
オブジェクト基底クラス
Definition GxBase.h:88
~GxClassBase(void) override
デストラクタ
Definition GxBase.h:108
constexpr GxClassBase(const GxClassBase &base)
コピーコンストラクタ
Definition GxBase.h:106
参照オブジェクト基底クラス
Definition GxBase.h:122
virtual s32 getReferenceCount(void) const
参照カウンタを取得
Definition GxBase.h:187
static u32 getDelayReleaseListCount(void)
遅延解放待ちの数を取得
Definition GxBase.cpp:383
virtual s32 addReference(void)
参照カウンタを加算
Definition GxBase.cpp:303
static void initializeDelayRelease(void)
遅延解放リストの初期化
Definition GxBase.cpp:258
virtual void cleanup(void)
delete直前に呼び出される関数
Definition GxBase.cpp:248
void setDelayReleaseCountInfinity(b32 on)
無限解放待ちの設定
Definition GxBase.h:195
constexpr GxClassBaseReference & operator=(const GxClassBaseReference &base)
代入演算子
Definition GxBase.h:301
constexpr void setDelayReleaseCount(s32 count)
遅延解放カウンタを設定
Definition GxBase.h:193
s32 _delayReleaseCount
遅延解放カウンタ
Definition GxBase.h:204
static void terminateDelayRelease(void)
遅延解放リストの終了
Definition GxBase.cpp:271
static b32 isDelayReleaseEnable(void)
遅延解放システムの有効判定
Definition GxBase.h:189
virtual s32 release(void)
解放
Definition GxBase.cpp:319
s32 _referenceCount
参照カウンタ
Definition GxBase.h:203
static void updateDelayRelease(void)
遅延解放リストの更新
Definition GxBase.cpp:352
static constexpr s32 DELAY_RELEASE_COUNT_INFINITY
遅延解放の無限待ち定義
Definition GxBase.h:131
基底クラス
Definition GxBase.h:51
GX_FORCE_INLINE b32 isDefaultObject(void)
デフォルトオブジェクト判定
Definition GxBase.h:79
constexpr GxClassBaseRoot(void)
コンストラクタ
Definition GxBase.h:58
constexpr GxClassBaseRoot & operator=(const GxClassBaseRoot &)
代入演算子
Definition GxBase.h:64
constexpr GxClassBaseRoot(const GxClassBaseRoot &)
コピーコンストラクタ
Definition GxBase.h:60
virtual GX_FORCE_INLINE const GxTypedObject * getDefaultObject(void)
デフォルトオブジェクトを取得
Definition GxBase.h:77
static GX_FORCE_INLINE GxRtti & __getStaticRtti(void)
Rttiの取得
Definition GxBase.h:73
virtual ~GxClassBaseRoot(void)
デストラクタ
Definition GxBase.h:62
virtual GxRtti & getRtti(void) const =0
Rttiの取得
クリティカルセクションクラス
Definition GxThread.h:20
プロパティクラス
Definition GxProperty.h:48
実行時型情報クラス
Definition GxRtti.h:154
const GxTypedObject * getDefaultObject(GxTypedObject *pCustomObject=nullptr)
デフォルトオブジェクトを取得
Definition GxRtti.cpp:958
GX_FORCE_INLINE b32 isDerived(const GxRtti &rtti) const
継承されている型か判定
Definition GxRtti.h:372
static GxRtti & getRttiRoot(void)
RTTIルートを取得
Definition GxRtti.cpp:870
Definition GxBase.h:24
32bitブーリアン
Definition GxDefine.h:173