source: dev/trunk/jenga/include/smoothie/Class.h@ 171

Last change on this file since 171 was 171, checked in by dai_9181, 17 years ago

コンパイルできるようにした

File size: 5.8 KB
Line 
1#pragma once
2
3#include "Prototype.h"
4#include "Member.h"
5#include "Method.h"
6
7class InheritedInterface
8{
9 CClass *pInterfaceClass;
10 int vtblOffset;
11public:
12 InheritedInterface( CClass *pInterfaceClass, int vtblOffset )
13 : pInterfaceClass( pInterfaceClass )
14 , vtblOffset( vtblOffset )
15 {
16 }
17
18 CClass &GetInterfaceClass() const{
19 return *pInterfaceClass;
20 }
21 int GetVtblOffset() const
22 {
23 return vtblOffset;
24 }
25};
26typedef vector<InheritedInterface> Interfaces;
27
28class CClass : public Prototype
29{
30public:
31 // メンバの参照方法
32 enum RefType{
33 Non = 0, // no reference member
34 Dot, // obj.member
35 Pointer, // obj->member
36 };
37
38 // 型の種類
39 enum ClassType{
40 Class,
41 Interface,
42 Enum,
43 Delegate,
44 Structure,
45 };
46
47private:
48 ClassType classType;
49
50 bool isReady;
51 void Readed(){
52 isReady = true;
53 }
54 bool IsReady() const{
55 return isReady;
56 }
57
58 // importされている名前空間
59 NamespaceScopesCollection importedNamespaces;
60
61 // 継承するインターフェイス
62 Interfaces interfaces;
63
64 // Blittable型情報
65 Type blittableType;
66
67 // 動的メンバ
68 Members dynamicMembers;
69
70 // 静的メンバ
71 Members staticMembers;
72
73 // 動的メソッド
74 Methods methods;
75 int ConstructorMemberSubIndex;
76 int DestructorMemberSubIndex;
77 int vtblNum; // 仮想関数の数
78
79 // 静的メソッド
80 Methods staticMethods;
81
82public:
83 //継承クラスへのポインタ
84 const CClass *pobj_InheritsClass;
85
86 //アラインメント値
87 int iAlign;
88
89 CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name );
90 ~CClass();
91
92 const NamespaceScopesCollection &GetImportedNamespaces() const
93 {
94 return importedNamespaces;
95 }
96
97 // インターフェイス
98 bool HasInterfaces() const
99 {
100 return ( interfaces.size() != 0 );
101 }
102 bool IsInheritsInterface( const CClass *pInterfaceClass ) const;
103
104 // Blittable型
105 bool IsBlittableType() const
106 {
107 return !blittableType.IsNull();
108 }
109 const Type &GetBlittableType() const
110 {
111 return blittableType;
112 }
113 void SetBlittableType( const Type &type ){
114 blittableType = type;
115 }
116
117 bool IsClass() const;
118 bool IsInterface() const;
119 bool IsEnum() const;
120 bool IsDelegate() const;
121 bool IsStructure() const;
122
123 //継承させる
124 bool Inherits( const char *inheritNames, int nowLine );
125 bool InheritsClass( const CClass &inheritsClass, int nowLine );
126 bool InheritsInterface( const CClass &inheritsClass, int nowLine );
127
128 //メンバ、メソッドの追加
129 void AddMember( Prototype::Accessibility accessibility, bool idConst, bool isRef, char *buffer );
130 void AddStaticMember( Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine );
131
132 //重複チェック
133 BOOL DupliCheckAll(const char *name);
134 BOOL DupliCheckMember(const char *name);
135
136 const Members &GetDynamicMembers() const
137 {
138 return dynamicMembers;
139 }
140
141 const Methods &GetMethods() const
142 {
143 return methods;
144 }
145 const Methods &GetStaticMethods() const
146 {
147 return staticMethods;
148 }
149
150 //デフォルト コンストラクタ メソッドを取得
151 const CMethod *GetConstructorMethod() const;
152
153 //デストラクタ メソッドを取得
154 const CMethod *GetDestructorMethod() const;
155
156 // vtblに存在する仮想関数の数
157 int GetVtblNum() const
158 {
159 return vtblNum;
160 }
161 void SetVtblNum( int vtblNum )
162 {
163 this->vtblNum = vtblNum;
164 }
165 void AddVtblNum( int vtblNum )
166 {
167 this->vtblNum += vtblNum;
168 }
169 bool IsExistVirtualFunctions() const
170 {
171 return ( vtblNum > 0 );
172 }
173
174 // メンバの総合サイズを取得
175 int GetSize() const;
176
177 // メンバのオフセットを取得
178 int GetMemberOffset( const char *memberName, int *pMemberNum = NULL ) const;
179
180private:
181 // アラインメント値を取得
182 int GetAlignment() const;
183
184
185 //vtbl
186private:
187 mutable long vtbl_offset;
188public:
189 int GetFuncNumInVtbl( const UserProc *pUserProc ) const;
190 LONG_PTR GetVtblGlobalOffset(void) const;
191 void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
192 bool IsAbstract() const;
193
194
195 //コンストラクタをコンパイルしているかどうかのチェックフラグ
196private:
197 mutable bool isCompilingConstructor;
198public:
199 void NotifyStartConstructorCompile() const;
200 void NotifyFinishConstructorCompile() const;
201 bool IsCompilingConstructor() const;
202
203 //デストラクタをコンパイルしているかどうかのチェックフラグ
204private:
205 mutable bool isCompilingDestructor;
206public:
207 void NotifyStartDestructorCompile() const;
208 void NotifyFinishDestructorCompile() const;
209 bool IsCompilingDestructor() const;
210
211
212 //自身の派生クラスかどうかを確認
213 bool IsSubClass( const CClass *pClass ) const;
214
215 //自身と等しいまたは派生クラスかどうかを確認
216 bool IsEqualsOrSubClass( const CClass *pClass ) const;
217
218 // 自身と等しいまたは派生クラス、基底クラスかどうかを確認
219 bool IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const;
220
221
222 //線形リスト用
223 CClass *pobj_NextClass;
224
225
226 static bool SplitName( const char *desc, char *object, char *member, CClass::RefType &refType ){
227 int lastIndex = -1;
228 for( int i=0; desc[i]; i++ ){
229 if( desc[i] == '(' ){
230 i=BasicSource::JumpStringInPare(desc,i+1);
231 continue;
232 }
233 else if( desc[i] == '[' ){
234 i=BasicSource::JumpStringInBracket(desc,i+1);
235 continue;
236 }
237 else if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM)){
238 lastIndex = i;
239 }
240 }
241 if( lastIndex == -1 ){
242 lstrcpy( member, desc );
243 return false;
244 }
245
246 if(desc[lastIndex]=='.'){
247 lstrcpy(member,desc+lastIndex+1);
248 refType = CClass::Dot;
249 }
250 else{
251 lstrcpy(member,desc+lastIndex+2);
252 refType = CClass::Pointer;
253 }
254
255 if( object ){
256 lstrcpy( object, desc );
257 object[lastIndex]=0;
258 }
259
260 return true;
261 }
262 static bool SplitName( const char *desc, char *object, char *member ){
263 CClass::RefType dummyRefType;
264 return SplitName( desc, object, member, dummyRefType );
265 }
266};
267
268class Classes
269{
270};
Note: See TracBrowser for help on using the repository browser.