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

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

インターフェイスメソッドはオーバーライド対象外とした

File size: 6.0 KB
Line 
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
53 virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ) = 0;
54
55 virtual bool IsAbstract() const = 0;
56 virtual void SetAbstractMark( bool isAbstractMark ) = 0;
57 virtual bool IsVirtual() const = 0;
58 virtual bool IsConst() const = 0;
59 virtual bool IsDynamic() const = 0;
60 virtual bool IsStatic() const = 0;
61 virtual const CClass *GetInheritsClassPtr() const = 0;
62 virtual void SetInheritsClassPtr( const CClass *pInheritsClass ) = 0;
63};
64
65class DynamicMethod : public CMethod
66{
67 bool isAbstract;
68 bool isVirtual;
69 bool isConst;
70 const CClass *pInheritsClass;
71
72 // XMLシリアライズ用
73private:
74 friend class boost::serialization::access;
75 template<class Archive> void serialize(Archive& ar, const unsigned int version)
76 {
77 trace_for_serialize( "serializing - DynamicMethod" );
78
79 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( CMethod );
80 ar & BOOST_SERIALIZATION_NVP( isAbstract );
81 ar & BOOST_SERIALIZATION_NVP( isVirtual );
82 ar & BOOST_SERIALIZATION_NVP( isConst );
83 ar & boost::serialization::make_nvp("pInheritsClass", const_cast<CClass *&>(pInheritsClass));
84 }
85
86public:
87 DynamicMethod( UserProc *pUserProc, Prototype::Accessibility accessibility, bool isAbstract, bool isVirtual, bool isConst, const CClass *pInheritsClass = NULL )
88 : CMethod( pUserProc, accessibility )
89 , isAbstract( isAbstract )
90 , isVirtual( isVirtual )
91 , isConst( isConst )
92 , pInheritsClass( pInheritsClass )
93 {
94 }
95 DynamicMethod( const CMethod &method )
96 : CMethod( &method.GetUserProc(), method.GetAccessibility() )
97 , isAbstract( method.IsAbstract() )
98 , isVirtual( method.IsVirtual() )
99 , isConst( method.IsConst() )
100 , pInheritsClass( method.GetInheritsClassPtr() )
101 {
102 }
103 DynamicMethod()
104 {
105 }
106
107 virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier );
108
109 virtual bool IsAbstract() const
110 {
111 return isAbstract;
112 }
113 virtual void SetAbstractMark( bool isAbstract )
114 {
115 this->isAbstract = isAbstract;
116 }
117 virtual bool IsVirtual() const
118 {
119 return isVirtual;
120 }
121 virtual bool IsConst() const
122 {
123 return isConst;
124 }
125 virtual bool IsDynamic() const
126 {
127 return true;
128 }
129 virtual bool IsStatic() const
130 {
131 return false;
132 }
133 virtual const CClass *GetInheritsClassPtr() const
134 {
135 return pInheritsClass;
136 }
137 virtual void SetInheritsClassPtr( const CClass *pInheritsClass )
138 {
139 this->pInheritsClass = pInheritsClass;
140 }
141};
142BOOST_CLASS_EXPORT( DynamicMethod );
143class StaticMethod : public CMethod
144{
145 // XMLシリアライズ用
146private:
147 friend class boost::serialization::access;
148 template<class Archive> void serialize(Archive& ar, const unsigned int version)
149 {
150 trace_for_serialize( "serializing - StaticMethod" );
151
152 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( CMethod );
153 }
154
155public:
156
157 // コンストラクタ
158 StaticMethod( UserProc *pUserProc, Prototype::Accessibility accessibility )
159 : CMethod( pUserProc, accessibility )
160 {
161 }
162
163 // コピーコンストラクタ
164 StaticMethod( const StaticMethod &staticMethod );
165
166 // デストラクタ
167 StaticMethod()
168 {
169 }
170
171 virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ){SetError();return false;}
172
173 virtual bool IsAbstract() const{SetError();return false;}
174 virtual void SetAbstractMark( bool isAbstract ){SetError();}
175 virtual bool IsVirtual() const{
176 return false;
177 }
178 virtual bool IsConst() const{SetError();return false;}
179 virtual bool IsDynamic() const
180 {
181 return false;
182 }
183 virtual bool IsStatic() const
184 {
185 return true;
186 }
187 virtual const CClass *GetInheritsClassPtr() const{SetError();return NULL;}
188 virtual void SetInheritsClassPtr( const CClass *pInheritsClass ){SetError();}
189};
190BOOST_CLASS_EXPORT( StaticMethod );
191
192class Methods : public vector<CMethod *>
193{
194 // XMLシリアライズ用
195private:
196 friend class boost::serialization::access;
197 template<class Archive> void serialize(Archive& ar, const unsigned int version)
198 {
199 trace_for_serialize( "serializing - Methods" );
200
201 ar & boost::serialization::make_nvp("vector_CMethod", boost::serialization::base_object<vector<CMethod *>>(*this));
202 }
203
204public:
205 // コンストラクタ
206 Methods();
207
208 // コピーコンストラクタ
209 Methods( const Methods &methods );
210
211 // デストラクタ
212 ~Methods();
213
214 //メンバ、メソッドの追加
215 void Add( UserProc *pUserProc, Prototype::Accessibility accessibility, bool isConst, bool isAbstract, bool isVirtual );
216 void AddStatic(UserProc *pUserProc,Prototype::Accessibility accessibility);
217
218 // オーバーライドのための検索
219 CMethod *FindForOverride( const UserProc *pUserProc );
220
221 const CMethod *GetMethodPtr( const UserProc *pUserProc ) const;
222 bool IsExist( const char *name ) const;
223 virtual void Enum( const char *methodName, vector<const UserProc *> &subs ) const;
224 virtual void Enum( BYTE idOperatorCalc, vector<const UserProc *> &subs ) const;
225
226 // 仮想メソッドの個数を取得
227 int GetVtblNum() const;
228
229 // vtblを生成
230 void GenerateVTablePart( long &vtableDataTableOffset ) const;
231};
Note: See TracBrowser for help on using the repository browser.