source: dev/trunk/ab5.0/abdev/ab_common/include/Lexical/Method.h@ 829

Last change on this file since 829 was 829, checked in by イグトランス (egtra), 12 years ago

svn:eol-styleとsvn:mime-type(文字コード指定含む)の設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/plain; charset=Shift_JIS
File size: 7.9 KB
Line 
1#pragma once
2
3class UserProc;
4class CClass;
5
6class CMethod : public MemberPrototype
7{
8 const UserProc *pUserProc;
9
10 // XMLシリアライズ用
11private:
12 friend class boost::serialization::access;
13 template<class Archive> void serialize(Archive& ar, const unsigned int version)
14 {
15 trace_for_serialize( "serializing - CMethod" );
16
17 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( MemberPrototype );
18 ar & boost::serialization::make_nvp("pUserProc", const_cast<UserProc *&>(pUserProc));
19 }
20
21public:
22 CMethod( const UserProc *pUserProc, Prototype::Accessibility accessibility )
23 : MemberPrototype( accessibility )
24 , pUserProc( pUserProc )
25 {
26 }
27
28 CMethod()
29 : MemberPrototype()
30 , pUserProc()
31 {
32 }
33
34protected:
35 CMethod(CMethod const& y)
36 : MemberPrototype(y)
37 , pUserProc(y.pUserProc)
38 {
39 }
40
41public:
42 const UserProc &GetUserProc() const
43 {
44 return *pUserProc;
45 }
46 void SetUserProcPtr( const UserProc *pUserProc )
47 {
48 this->pUserProc = pUserProc;
49 }
50
51 virtual bool IsAbstract() const = 0;
52 virtual void SetAbstractMark( bool isAbstractMark ) = 0;
53 virtual bool IsVirtual() const = 0;
54 virtual bool IsConst() const = 0;
55 virtual bool IsDynamic() const = 0;
56 virtual bool IsStatic() const = 0;
57 virtual const CClass *GetInheritsClassPtr() const = 0;
58 virtual void SetInheritsClassPtr( const CClass *pInheritsClass ) = 0;
59 virtual bool IsNotUse() const = 0;
60 virtual void SetNotUseMark( bool isNotUse ) = 0;
61
62 virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
63
64private:
65 CMethod& operator =(CMethod const&);
66};
67
68class DynamicMethod : public CMethod
69{
70public:
71 struct OverrideResult
72 {
73 enum EnumType
74 {
75 Successful = 0, // オーバーライドに成功
76 NotVirtual, // 非Virtualメソッドに対してオーバーライドを行おうとした
77 NotUseOverrideModifier, // Override修飾子が無い状況で基底クラスの実体メソッドをオーバーライドしようとした
78 DifferentAccesibility, // オーバーライド元、先のアクセシビリティに相違がある
79 };
80
81 EnumType enumType;
82 const CMethod *pMethod;
83 };
84
85private:
86 bool isAbstract;
87 bool isVirtual;
88 bool isConst;
89 const CClass *pInheritsClass;
90
91 // 他のインターフェイスへ実装が移った場合(基底クラスメソッドのインターフェイス実装)はこのフラグをオンにする
92 bool isNotUse;
93
94 // XMLシリアライズ用
95private:
96 friend class boost::serialization::access;
97 template<class Archive> void serialize(Archive& ar, const unsigned int version)
98 {
99 trace_for_serialize( "serializing - DynamicMethod" );
100
101 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( CMethod );
102 ar & BOOST_SERIALIZATION_NVP( isAbstract );
103 ar & BOOST_SERIALIZATION_NVP( isVirtual );
104 ar & BOOST_SERIALIZATION_NVP( isConst );
105 ar & boost::serialization::make_nvp("pInheritsClass", const_cast<CClass *&>(pInheritsClass));
106 ar & BOOST_SERIALIZATION_NVP( isNotUse );
107 }
108
109public:
110 DynamicMethod( UserProc *pUserProc, Prototype::Accessibility accessibility, bool isAbstract, bool isVirtual, bool isConst, const CClass *pInheritsClass = NULL )
111 : CMethod( pUserProc, accessibility )
112 , isAbstract( isAbstract )
113 , isVirtual( isVirtual )
114 , isConst( isConst )
115 , pInheritsClass( pInheritsClass )
116 , isNotUse( false )
117 {
118 }
119 explicit DynamicMethod( const CMethod &method )
120 : CMethod( &method.GetUserProc(), method.GetAccessibility() )
121 , isAbstract( method.IsAbstract() )
122 , isVirtual( method.IsVirtual() )
123 , isConst( method.IsConst() )
124 , pInheritsClass( method.GetInheritsClassPtr() )
125 , isNotUse( false )
126 {
127 }
128 DynamicMethod()
129 {
130 }
131
132 DynamicMethod(DynamicMethod&& y)
133 : CMethod(std::move(y))
134 , isAbstract(std::move(y.isAbstract))
135 , isVirtual(std::move(y.isVirtual))
136 , isConst(std::move(y.isConst))
137 , pInheritsClass(std::move(y.pInheritsClass))
138 , isNotUse(std::move(y.isNotUse))
139 {
140 }
141
142 DynamicMethod(DynamicMethod const& y)
143 : CMethod(y)
144 , isAbstract(y.isAbstract)
145 , isVirtual(y.isVirtual)
146 , isConst(y.isConst)
147 , pInheritsClass(y.pInheritsClass)
148 , isNotUse(y.isNotUse)
149 {
150 }
151
152 DynamicMethod& operator =(DynamicMethod const&);
153
154 DynamicMethod::OverrideResult::EnumType Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier );
155
156 virtual bool IsAbstract() const
157 {
158 return isAbstract;
159 }
160 virtual void SetAbstractMark( bool isAbstract )
161 {
162 this->isAbstract = isAbstract;
163 }
164 virtual bool IsVirtual() const
165 {
166 return isVirtual;
167 }
168 virtual bool IsConst() const
169 {
170 return isConst;
171 }
172 virtual bool IsDynamic() const
173 {
174 return true;
175 }
176 virtual bool IsStatic() const
177 {
178 return false;
179 }
180 virtual const CClass *GetInheritsClassPtr() const
181 {
182 return pInheritsClass;
183 }
184 virtual void SetInheritsClassPtr( const CClass *pInheritsClass )
185 {
186 this->pInheritsClass = pInheritsClass;
187 }
188 virtual bool IsNotUse() const
189 {
190 return isNotUse;
191 }
192 virtual void SetNotUseMark( bool isNotUse )
193 {
194 this->isNotUse = isNotUse;
195 }
196
197 virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
198};
199BOOST_CLASS_EXPORT_KEY( DynamicMethod );
200class StaticMethod : public CMethod
201{
202 // XMLシリアライズ用
203private:
204 friend class boost::serialization::access;
205 template<class Archive> void serialize(Archive& ar, const unsigned int version)
206 {
207 trace_for_serialize( "serializing - StaticMethod" );
208
209 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( CMethod );
210 }
211
212public:
213
214 // コンストラクタ
215 StaticMethod( UserProc *pUserProc, Prototype::Accessibility accessibility )
216 : CMethod( pUserProc, accessibility )
217 {
218 }
219
220 // ムーブコンストラクタ
221 StaticMethod(StaticMethod&& y);
222
223 // コピーコンストラクタ
224 StaticMethod( const StaticMethod &staticMethod );
225
226 // デストラクタ
227 StaticMethod()
228 {
229 }
230
231 virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier )
232 {
233 throw;
234 }
235
236 virtual bool IsAbstract() const
237 {
238 throw;
239 }
240 virtual void SetAbstractMark( bool isAbstract )
241 {
242 throw;
243 }
244 virtual bool IsVirtual() const{
245 return false;
246 }
247 virtual bool IsConst() const
248 {
249 throw;
250 }
251 virtual bool IsDynamic() const
252 {
253 return false;
254 }
255 virtual bool IsStatic() const
256 {
257 return true;
258 }
259 virtual const CClass *GetInheritsClassPtr() const
260 {
261 throw;
262 }
263 virtual void SetInheritsClassPtr( const CClass *pInheritsClass )
264 {
265 throw;
266 }
267 virtual bool IsNotUse() const
268 {
269 return false;
270 }
271 virtual void SetNotUseMark( bool isNotUse )
272 {
273 throw;
274 }
275
276 virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
277};
278BOOST_CLASS_EXPORT_KEY( StaticMethod );
279
280class Methods : public std::vector<CMethod *>
281{
282 // XMLシリアライズ用
283private:
284 friend class boost::serialization::access;
285 template<class Archive> void serialize(Archive& ar, const unsigned int version)
286 {
287 trace_for_serialize( "serializing - Methods" );
288
289 ar & boost::serialization::make_nvp("vector_CMethod", boost::serialization::base_object<vector<CMethod *>>(*this));
290 }
291
292public:
293 // コンストラクタ
294 Methods();
295
296 // ムーブコンストラクタ
297 Methods(Methods&& methods);
298
299 // コピーコンストラクタ
300 Methods(const Methods &methods);
301
302 Methods& operator =(Methods&& methods)
303 {
304 std::vector<CMethod *>::operator =(std::move(methods));
305 return *this;
306 }
307
308 Methods& operator =(const Methods &methods)
309 {
310 return *this = Methods(methods);
311 }
312
313 // デストラクタ
314 ~Methods();
315
316 //メンバ、メソッドの追加
317 void Add( UserProc *pUserProc, Prototype::Accessibility accessibility, bool isConst, bool isAbstract, bool isVirtual );
318 void AddStatic(UserProc *pUserProc,Prototype::Accessibility accessibility);
319
320 /*!
321 @brief オーバーライドのための検索
322 @param actualTypeParametersForThisMethods thisオブジェクトで保有するメソッド群を対象とした実型パラメータ
323 pUserProc 照らし合わせる関数
324 */
325 DynamicMethod *FindForOverride( const Types &actualTypeParametersForThisMethods, const UserProc *pUserProc );
326
327 const CMethod *GetMethodPtr( const UserProc *pUserProc ) const;
328 bool IsExist( const char *name ) const;
329 virtual void Enum( const char *methodName, std::vector<const UserProc *> &subs ) const;
330 virtual void Enum( BYTE idOperatorCalc, std::vector<const UserProc *> &subs ) const;
331
332 // 仮想メソッドの個数を取得
333 int GetVtblNum() const;
334};
Note: See TracBrowser for help on using the repository browser.