OROCHI
 
Loading...
Searching...
No Matches
GxSysBase.h
Go to the documentation of this file.
1//===========================================================================
9//===========================================================================
10#pragma once
11
12GX_CORE_NAMESPACE_BEGIN()
13
14//===========================================================================
16//===========================================================================
17class GxSysBase : public GxClassBase
18{
19 //-------------------------------------------------------------
21 //-------------------------------------------------------------
23public:
24 // RTTI定義
25 GX_RTTI_ABSTRACT_CLASS(GxSysBase, GxClassBase)
26 // GxClassBase継承クラス用禁止宣言
28 // new, delete定義
29 GX_OPERATOR_NEW_DELETE(GxAllocatorList::ALLOCATOR_TYPE::SYSTEM)
30
31protected:
33 enum class LOCK_TYPE
34 {
35 SEQUENTIAL_THREAD_SAFE,
36 THREAD_SAFE,
37 };
38
39 class GxScopeLock;
40
42 //-------------------------------------------------------------
44 //-------------------------------------------------------------
46public:
48 GxSysBase(void) : _pModules(nullptr){}
50 ~GxSysBase(void) override {}
51
53 virtual b32 initialize(const GxClassBase* pInitialiInformation = nullptr);
55 virtual void terminate(void);
56protected:
58 void terminateGxModules(void);
59
61 //-------------------------------------------------------------
63 //-------------------------------------------------------------
65public:
67 virtual void update(void);
68protected:
70 void lock(LOCK_TYPE type = LOCK_TYPE::THREAD_SAFE);
72 void unlock(LOCK_TYPE type = LOCK_TYPE::THREAD_SAFE);
73
75 template<typename T> T* addModule(void)
76 {
77 if (!_pModules)
78 {
79 _pModules = GX_NEW GxArrayClassBase;
80 }
81#if GX_DEVELOP
82 for (auto* pModule : *_pModules)
83 {
84 if (static_cast<GxModSysBase*>(pModule)->getRtti().isDerived(T::GX_RTTI)
85 || T::GX_RTTI.isDerived(static_cast<GxModSysBase*>(pModule)->getRtti()))
86 {
87 GX_ERROR(false, "Module(%s) is already craeted", T::GX_RTTI.getName());
88 return nullptr;
89 }
90 }
91#endif //GX_DEVELOP
92 if (getRtti().isDerived(T::getOwnerDerivedRtti()))
93 {
94 auto pModule = static_cast<T*>(T::GX_RTTI.GX_CREATE_INSTANCE());
95 GX_ASSERT(pModule, "Module(%s) create error", T::GX_RTTI.getName());
96 pModule->setOwner(this);
97 _pModules->addBottom(pModule);
98 return pModule;
99 }
100 return nullptr;
101 }
102
104 template<typename T> void removeModule(void)
105 {
106 if (_pModules)
107 {
108 for (u32 i = 0; i < _pModules->getCount(); i++)
109 {
110 auto* pModule = static_cast<GxModSysBase*>((*_pModules)[i]);
111 if (pModule->getRtti() == T::GX_RTTI)
112 {
113 _pModules->remove(i);
114 GX_SAFE_DELETE(pModule);
115 break;
116 }
117 }
118 }
119 }
120public:
122 b32 isLocked(void);
124 void sleep(f32 time);
125
127 //-------------------------------------------------------------
129 //-------------------------------------------------------------
131public:
133 template<typename T> T* getModule(void) const
134 {
135 if (_pModules)
136 {
137 for (auto* pModule : *_pModules)
138 {
139 if (static_cast<GxModSysBase*>(pModule)->getRtti() == T::GX_RTTI)
140 {
141 return static_cast<T*>(pModule);
142 }
143 }
144 }
145 return nullptr;
146 }
147
149 //-------------------------------------------------------------
151 //-------------------------------------------------------------
153private:
154 GxCriticalSection _criticalSection;
155 GxArrayClassBase* _pModules;
156
158};
159
160//===========================================================================
162//===========================================================================
164{
165 //-----------------------------------------------------------
167 //-----------------------------------------------------------
169public:
171 GxScopeLock(GxSysBase* pSystem, GxSysBase::LOCK_TYPE type = LOCK_TYPE::THREAD_SAFE) : _pSysBase(pSystem), _type(type) { _pSysBase->lock(type); }
173 virtual ~GxScopeLock(void) { _pSysBase->unlock(_type); }
174
177
178
179 //-----------------------------------------------------------
181 //-----------------------------------------------------------
183private:
184 GxSysBase* _pSysBase;
186
188};
189
190GX_CORE_NAMESPACE_END()
#define GX_PROHIBIT_COPY(__CLASS__)
コピー禁止
Definition GxBase.h:233
#define GX_PROHIBIT_CLASS_BASE(__CLASS__)
GxClassBase継承の禁止宣言
Definition GxBase.h:240
配列クラス
Definition GxArrayClassBase.h:18
オブジェクト基底クラス
Definition GxBase.h:88
クリティカルセクションクラス
Definition GxThread.h:20
システムモジュール基礎クラス
Definition GxModSysBase.h:20
スコープ内システムロッククラス
Definition GxSysBase.h:164
GxScopeLock(GxSysBase *pSystem, GxSysBase::LOCK_TYPE type=LOCK_TYPE::THREAD_SAFE)
コンストラクタ
Definition GxSysBase.h:171
virtual ~GxScopeLock(void)
デストラクタ
Definition GxSysBase.h:173
システム基底クラス
Definition GxSysBase.h:18
void unlock(LOCK_TYPE type=LOCK_TYPE::THREAD_SAFE)
クリティカルセクションを出る
Definition GxSysBase.cpp:123
~GxSysBase(void) override
デストラクタ
Definition GxSysBase.h:50
void removeModule(void)
モジュールを削除
Definition GxSysBase.h:104
T * getModule(void) const
モジュールを取得
Definition GxSysBase.h:133
T * addModule(void)
モジュールを作成
Definition GxSysBase.h:75
LOCK_TYPE
ロックタイプ
Definition GxSysBase.h:34
@ THREAD_SAFE
全スレッドセーフ
void lock(LOCK_TYPE type=LOCK_TYPE::THREAD_SAFE)
クリティカルセクションに入る
Definition GxSysBase.cpp:94
GxSysBase(void)
デフォルトコンストラクタ
Definition GxSysBase.h:48
32bitブーリアン
Definition GxDefine.h:173