source: dev/trunk/abdev/BasicCompiler_Common/include/Method.h@ 352

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

基底クラスからインターフェイスメソッドを実装できるようにした。

File size: 6.6 KB
RevLine 
[206]1#pragma once
2
3#include <string>
4#include <vector>
5
6#include <option.h>
7#include <Program.h>
8#include <Class.h>
9#include <Procedure.h>
10
11#include <windows.h>
12
13using namespace std;
14
15class UserProc;
16class CClass;
17void SetError();
18
19class CMethod : public MemberPrototype
20{
21 const UserProc *pUserProc;
22
23 // XMLシリアライズ用
24private:
25 friend class boost::serialization::access;
26 template<class Archive> void serialize(Archive& ar, const unsigned int version)
27 {
28 trace_for_serialize( "serializing - CMethod" );
29
30 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( MemberPrototype );
31 ar & boost::serialization::make_nvp("pUserProc", const_cast<UserProc *&>(pUserProc));
32 }
33
34public:
35 CMethod( const UserProc *pUserProc, Prototype::Accessibility accessibility )
36 : MemberPrototype( accessibility )
37 , pUserProc( pUserProc )
38 {
39 }
40 CMethod()
41 {
42 }
43
44 const UserProc &GetUserProc() const
45 {
46 return *pUserProc;
47 }
48 void SetUserProcPtr( const UserProc *pUserProc )
49 {
50 this->pUserProc = pUserProc;
51 }
52
[351]53 virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ) = 0;
54
[206]55 virtual bool IsAbstract() const = 0;
[351]56 virtual void SetAbstractMark( bool isAbstractMark ) = 0;
[206]57 virtual bool IsVirtual() const = 0;
58 virtual bool IsConst() const = 0;
[336]59 virtual bool IsDynamic() const = 0;
[206]60 virtual bool IsStatic() const = 0;
61 virtual const CClass *GetInheritsClassPtr() const = 0;
62 virtual void SetInheritsClassPtr( const CClass *pInheritsClass ) = 0;
[352]63 virtual bool IsNotUse() const = 0;
64 virtual void SetNotUseMark( bool isNotUse ) = 0;
[206]65};
66
67class DynamicMethod : public CMethod
68{
69 bool isAbstract;
70 bool isVirtual;
71 bool isConst;
72 const CClass *pInheritsClass;
73
[352]74 // 他のインターフェイスへ実装が移った場合(基底クラスメソッドのインターフェイス実装)はこのフラグをオンにする
75 bool isNotUse;
76
[206]77 // XMLシリアライズ用
78private:
79 friend class boost::serialization::access;
80 template<class Archive> void serialize(Archive& ar, const unsigned int version)
81 {
82 trace_for_serialize( "serializing - DynamicMethod" );
83
84 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( CMethod );
85 ar & BOOST_SERIALIZATION_NVP( isAbstract );
86 ar & BOOST_SERIALIZATION_NVP( isVirtual );
87 ar & BOOST_SERIALIZATION_NVP( isConst );
88 ar & boost::serialization::make_nvp("pInheritsClass", const_cast<CClass *&>(pInheritsClass));
[352]89 ar & BOOST_SERIALIZATION_NVP( isNotUse );
[206]90 }
91
92public:
93 DynamicMethod( UserProc *pUserProc, Prototype::Accessibility accessibility, bool isAbstract, bool isVirtual, bool isConst, const CClass *pInheritsClass = NULL )
94 : CMethod( pUserProc, accessibility )
95 , isAbstract( isAbstract )
96 , isVirtual( isVirtual )
97 , isConst( isConst )
98 , pInheritsClass( pInheritsClass )
[352]99 , isNotUse( false )
[206]100 {
101 }
102 DynamicMethod( const CMethod &method )
103 : CMethod( &method.GetUserProc(), method.GetAccessibility() )
104 , isAbstract( method.IsAbstract() )
105 , isVirtual( method.IsVirtual() )
106 , isConst( method.IsConst() )
107 , pInheritsClass( method.GetInheritsClassPtr() )
[352]108 , isNotUse( false )
[206]109 {
110 }
111 DynamicMethod()
112 {
113 }
114
[351]115 virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier );
116
[206]117 virtual bool IsAbstract() const
118 {
119 return isAbstract;
120 }
[351]121 virtual void SetAbstractMark( bool isAbstract )
[206]122 {
[351]123 this->isAbstract = isAbstract;
[206]124 }
125 virtual bool IsVirtual() const
126 {
127 return isVirtual;
128 }
129 virtual bool IsConst() const
130 {
131 return isConst;
132 }
[336]133 virtual bool IsDynamic() const
134 {
135 return true;
136 }
[206]137 virtual bool IsStatic() const
138 {
139 return false;
140 }
141 virtual const CClass *GetInheritsClassPtr() const
142 {
143 return pInheritsClass;
144 }
145 virtual void SetInheritsClassPtr( const CClass *pInheritsClass )
146 {
147 this->pInheritsClass = pInheritsClass;
148 }
[352]149 virtual bool IsNotUse() const
150 {
151 return isNotUse;
152 }
153 virtual void SetNotUseMark( bool isNotUse )
154 {
155 this->isNotUse = isNotUse;
156 }
[206]157};
158BOOST_CLASS_EXPORT( DynamicMethod );
159class StaticMethod : public CMethod
160{
161 // XMLシリアライズ用
162private:
163 friend class boost::serialization::access;
164 template<class Archive> void serialize(Archive& ar, const unsigned int version)
165 {
166 trace_for_serialize( "serializing - StaticMethod" );
167
168 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( CMethod );
169 }
170
171public:
[351]172
173 // コンストラクタ
[206]174 StaticMethod( UserProc *pUserProc, Prototype::Accessibility accessibility )
175 : CMethod( pUserProc, accessibility )
176 {
177 }
[351]178
179 // コピーコンストラクタ
180 StaticMethod( const StaticMethod &staticMethod );
181
182 // デストラクタ
[206]183 StaticMethod()
184 {
185 }
186
[351]187 virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ){SetError();return false;}
188
[206]189 virtual bool IsAbstract() const{SetError();return false;}
[351]190 virtual void SetAbstractMark( bool isAbstract ){SetError();}
[206]191 virtual bool IsVirtual() const{
192 return false;
193 }
194 virtual bool IsConst() const{SetError();return false;}
[336]195 virtual bool IsDynamic() const
196 {
197 return false;
198 }
[206]199 virtual bool IsStatic() const
200 {
201 return true;
202 }
203 virtual const CClass *GetInheritsClassPtr() const{SetError();return NULL;}
204 virtual void SetInheritsClassPtr( const CClass *pInheritsClass ){SetError();}
[352]205 virtual bool IsNotUse() const
206 {
207 return false;
208 }
209 virtual void SetNotUseMark( bool isNotUse )
210 {
211 SetError();
212 }
[206]213};
214BOOST_CLASS_EXPORT( StaticMethod );
215
216class Methods : public vector<CMethod *>
217{
218 // XMLシリアライズ用
219private:
220 friend class boost::serialization::access;
221 template<class Archive> void serialize(Archive& ar, const unsigned int version)
222 {
223 trace_for_serialize( "serializing - Methods" );
224
225 ar & boost::serialization::make_nvp("vector_CMethod", boost::serialization::base_object<vector<CMethod *>>(*this));
226 }
227
228public:
[351]229 // コンストラクタ
[206]230 Methods();
[351]231
232 // コピーコンストラクタ
233 Methods( const Methods &methods );
234
235 // デストラクタ
[206]236 ~Methods();
237
238 //メンバ、メソッドの追加
239 void Add( UserProc *pUserProc, Prototype::Accessibility accessibility, bool isConst, bool isAbstract, bool isVirtual );
240 void AddStatic(UserProc *pUserProc,Prototype::Accessibility accessibility);
241
[351]242 // オーバーライドのための検索
243 CMethod *FindForOverride( const UserProc *pUserProc );
[346]244
[206]245 const CMethod *GetMethodPtr( const UserProc *pUserProc ) const;
246 bool IsExist( const char *name ) const;
247 virtual void Enum( const char *methodName, vector<const UserProc *> &subs ) const;
248 virtual void Enum( BYTE idOperatorCalc, vector<const UserProc *> &subs ) const;
[347]249
250 // 仮想メソッドの個数を取得
251 int GetVtblNum() const;
252
253 // vtblを生成
254 void GenerateVTablePart( long &vtableDataTableOffset ) const;
[206]255};
Note: See TracBrowser for help on using the repository browser.