Mutators for Catalog states.
[shapes.git] / source / classtypes.h
blob1722a6c9fcbf6e0e5944dab89d01f733436736a8
1 #ifndef classtypes_h
2 #define classtypes_h
4 #include "Shapes_Ast_decls.h"
5 #include "Shapes_Lang_decls.h"
7 #include "ptrowner.h"
8 #include "refcount.h"
9 #include "pdfstructure.h"
10 #include "shapesvalue.h"
11 #include "environment.h"
12 #include "charptrless.h"
13 #include "methodid.h"
14 #include "drawabletypes.h"
15 #include "hottypes.h"
17 #include <list>
18 #include <iostream>
19 #include <stack>
20 #include <set>
22 namespace Shapes
24 namespace Lang
27 class Instance : public Lang::Drawable2D
29 protected:
30 mutable Kernel::PassedEnv env;
31 Kernel::PassedEnv privateEnv;
33 Kernel::WarmGroup2D * warm2D;
34 Kernel::WarmGroup3D * warm3D;
35 Kernel::PassedDyn my_dyn;
36 public:
37 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > parents; /* the reference is non-const to allow prepared to be changed */
38 /* public scope is the easy way to let a Class add overrides to its instances */
39 std::map< RefCountPtr< const Lang::Class >, std::map< const char *, RefCountPtr< const Lang::Function >, charPtrLess > > overrides;
40 protected:
41 RefCountPtr< const Lang::Class > myClass;
42 bool prepared;
43 bool protectedAccess;
44 mutable std::map< Kernel::MethodId, RefCountPtr< const Lang::Function > > methodTable;
45 public:
46 Instance( Kernel::PassedEnv _env, Kernel::PassedEnv _privateEnv, RefCountPtr< const Lang::Class > _myClass, bool _protectedAccess, const Kernel::PassedDyn & _my_dyn );
47 virtual ~Instance( );
48 virtual void gcMark( Kernel::GCMarkedSet & marked );
49 void prepare( Kernel::EvalState * evalState );
50 virtual Kernel::VariableHandle getField( const char * fieldID, const RefCountPtr< const Lang::Value > & selfRef ) const;
51 Kernel::VariableHandle getLocalField( const char * fieldID ) const;
52 virtual void tackOn( const char * fieldID, Kernel::EvalState * evalState, const RefCountPtr< const Lang::Value > & piece, const Ast::SourceLocation & callLoc );
53 virtual void tackOnLocal( const char * fieldID, Kernel::EvalState * evalState, const RefCountPtr< const Lang::Value > & piece, const Ast::SourceLocation & callLoc );
54 RefCountPtr< const Lang::Function > getMethod( Kernel::MethodId fieldID ) const;
55 RefCountPtr< const Lang::Function > getLocalMethod( Kernel::MethodId fieldID ) const;
56 RefCountPtr< const Lang::Instance > superReference( RefCountPtr< const Lang::Class > parent ) const;
58 virtual RefCountPtr< const Lang::Geometric2D > transformed( const Lang::Transform2D & tf, const RefCountPtr< const Lang::Geometric2D > & self ) const;
60 virtual void shipout( std::ostream & os, Kernel::PageContentStates * pdfState, const Lang::Transform2D & tf ) const;
61 virtual RefCountPtr< const Lang::ElementaryPath2D > bbox( ) const;
63 virtual const RefCountPtr< const Lang::Class > & getClass( ) const;
64 static RefCountPtr< const char > staticTypeName( );
66 virtual void show( std::ostream & os ) const;
67 DISPATCHDECL;
70 class TransformedInstance : public Lang::Drawable2D
72 Lang::Transform2D tf;
73 RefCountPtr< const Lang::Instance > obj;
74 public:
75 TransformedInstance( const Lang::Transform2D & _tf, const RefCountPtr< const Lang::Instance > & _obj );
76 ~TransformedInstance( );
77 virtual void gcMark( Kernel::GCMarkedSet & marked );
78 virtual Kernel::VariableHandle getField( const char * fieldID, const RefCountPtr< const Lang::Value > & selfRef ) const;
79 RefCountPtr< const Lang::Function > getMethod( Kernel::MethodId fieldID ) const;
81 virtual RefCountPtr< const Lang::Geometric2D > transformed( const Lang::Transform2D & tf, const RefCountPtr< const Lang::Geometric2D > & self ) const;
83 virtual void shipout( std::ostream & os, Kernel::PageContentStates * pdfState, const Lang::Transform2D & tf ) const;
84 virtual RefCountPtr< const Lang::ElementaryPath2D > bbox( ) const;
86 TYPEINFODECL;
87 virtual void show( std::ostream & os ) const;
90 class Class : public Lang::Value
92 public:
93 typedef std::map< Kernel::MethodId, std::set< RefCountPtr< const Lang::Class > > > MessageMapType;
94 private:
95 RefCountPtr< const char > prettyName;
96 protected:
97 mutable RefCountPtr< const Lang::Class > selfRef;
98 bool isFinal;
99 MessageMapType messageMap;
100 std::set< Kernel::MethodId > abstractSet;
101 public:
102 Class( RefCountPtr< const char > _prettyName );
103 virtual ~Class( );
104 void setSelfRef( RefCountPtr< const Lang::Class > _selfRef ) const;
106 virtual Kernel::VariableHandle getField( const char * fieldID, const RefCountPtr< const Lang::Value > & selfRef ) const;
108 RefCountPtr< const char > getPrettyName( ) const;
110 virtual bool isInPublicGetSet( const char * field ) const;
111 virtual bool isInPublicSetSet( const char * field ) const;
112 virtual bool isInProtectedGetSet( const char * field ) const;
113 virtual bool isInProtectedSetSet( const char * field ) const;
114 virtual bool isInTransformingSet( const char * field ) const;
116 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const = 0;
117 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const = 0;
118 // virtual Kernel::ValueRef method_implements( ) const = 0;
120 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const = 0;
121 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const = 0;
122 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
123 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
124 Kernel::Arguments & args,
125 Kernel::EvalState * evalState ) const = 0;
126 virtual void findParents( std::set< RefCountPtr< const Lang::Class > > * _allParents, std::set< RefCountPtr< const Lang::Class > > * _multiParents ) const;
127 virtual bool isRepeatableBase( ) const = 0;
128 virtual void prepareInstance( Kernel::EvalState * evalState, Kernel::PassedEnv privateEnv ) const;
130 bool getFinal( ) const;
131 const MessageMapType & getMessageMap( ) const;
132 const RefCountPtr< const Lang::Class > & getMethodDefinitionClass( const Kernel::MethodId & method ) const;
134 virtual RefCountPtr< const Lang::Function > getMutator( const char * mutatorID ) const;
136 void showAbstractSet( std::ostream & os ) const;
138 TYPEINFODECL;
139 virtual void show( std::ostream & os ) const;
140 DISPATCHDECL;
143 class Object : public Lang::Class
145 Kernel::PassedEnv dummyEnv;
146 public:
147 Object( );
148 virtual ~Object( );
149 virtual void gcMark( Kernel::GCMarkedSet & marked );
151 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
152 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const;
154 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const;
155 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const;
156 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
157 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
158 Kernel::Arguments & emptyArglist,
159 Kernel::EvalState * evalState ) const;
160 virtual bool isRepeatableBase( ) const;
163 class MetaClass : public Lang::Class
165 public:
166 MetaClass( );
167 virtual ~MetaClass( );
169 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
170 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const;
172 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const;
173 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const;
174 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
175 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
176 Kernel::Arguments & emptyArglist,
177 Kernel::EvalState * evalState ) const;
178 virtual void findParents( std::set< RefCountPtr< const Lang::Class > > * _allParents, std::set< RefCountPtr< const Lang::Class > > * _multiParents ) const;
179 virtual bool isRepeatableBase( ) const;
180 virtual void gcMark( Kernel::GCMarkedSet & marked );
183 class SystemFinalClass : public Lang::Class
185 std::map< const char *, RefCountPtr< const Lang::Function >, charPtrLess > mutators_;
186 typedef void ( * RegisterMutatorFunction )( SystemFinalClass * );
187 RegisterMutatorFunction registerMutatorFunction_;
188 public:
189 SystemFinalClass( RefCountPtr< const char > _prettyName );
190 SystemFinalClass( RefCountPtr< const char > _prettyName, RegisterMutatorFunction registerMutatorFunction );
191 virtual ~SystemFinalClass( );
192 void initMutators( );
193 void registerMutator( Lang::CoreFunction * fun );
195 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
196 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const;
198 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const;
199 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const;
200 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
201 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
202 Kernel::Arguments & emptyArglist,
203 Kernel::EvalState * evalState ) const;
204 virtual bool isRepeatableBase( ) const;
205 virtual RefCountPtr< const Lang::Function > getMutator( const char * mutatorID ) const;
206 virtual void gcMark( Kernel::GCMarkedSet & marked );
209 class SystemVirtualInterface : public Lang::Class
211 public:
212 SystemVirtualInterface( RefCountPtr< const char > _prettyName );
213 virtual ~SystemVirtualInterface( );
215 void addVirtual( const char * id );
217 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
218 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const;
220 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const;
221 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const;
222 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
223 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
224 Kernel::Arguments & emptyArglist,
225 Kernel::EvalState * evalState ) const;
226 virtual bool isRepeatableBase( ) const;
227 virtual void gcMark( Kernel::GCMarkedSet & marked );
230 class UserClass : public Lang::Class
232 const Shapes::Ast::ClassFunction * classExpr;
233 Kernel::EvaluatedFormals * formals;
234 Kernel::PassedEnv env;
235 RefCountPtr< std::list< std::pair< RefCountPtr< const Lang::Class >, const Ast::ArgListExprs * > > > parents;
236 std::set< RefCountPtr< const Lang::Class > > allParents;
237 std::set< RefCountPtr< const Lang::Class > > multiParents;
238 std::set< RefCountPtr< const Lang::Class > > immediateParents;
239 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, std::list< Ast::MemberDeclaration * > > > overrides;
240 public:
241 UserClass( const Shapes::Ast::ClassFunction * _classExpr, Kernel::PassedEnv _env, RefCountPtr< const char > _prettyName, Kernel::EvaluatedFormals * _formals, RefCountPtr< std::list< std::pair< RefCountPtr< const Lang::Class >, const Ast::ArgListExprs * > > > _parents, RefCountPtr< std::map< RefCountPtr< const Lang::Class >, std::list< Ast::MemberDeclaration * > > > _overrides, bool _isFinal );
242 virtual ~UserClass( );
244 virtual void gcMark( Kernel::GCMarkedSet & marked );
246 void setupAndCheck( bool declaredAbstract );
248 virtual bool isInPublicGetSet( const char * field ) const;
249 virtual bool isInPublicSetSet( const char * field ) const;
250 virtual bool isInProtectedGetSet( const char * field ) const;
251 virtual bool isInProtectedSetSet( const char * field ) const;
252 virtual bool isInTransformingSet( const char * field ) const;
254 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
255 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const;
257 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const;
258 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const;
259 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
260 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
261 Kernel::Arguments & args,
262 Kernel::EvalState * evalState ) const;
263 virtual void findParents( std::set< RefCountPtr< const Lang::Class > > * _allParents, std::set< RefCountPtr< const Lang::Class > > * _multiParents ) const;
264 virtual bool isRepeatableBase( ) const;
265 virtual void prepareInstance( Kernel::EvalState * evalState, Kernel::PassedEnv privateEnv ) const;
267 void addOverrides( Kernel::EvalState * evalState, RefCountPtr< Lang::Instance > instance, Kernel::PassedEnv privateEnv ) const;
270 class ClassMethodBase : public Lang::Function
272 protected:
273 RefCountPtr< const Lang::Class > self;
274 public:
275 ClassMethodBase( RefCountPtr< const Lang::Class > _self );
276 virtual ~ClassMethodBase( );
277 virtual void gcMark( Kernel::GCMarkedSet & marked );
278 virtual bool isTransforming( ) const;
281 class ClassMethodNew : public Lang::ClassMethodBase
283 public:
284 ClassMethodNew( RefCountPtr< const Lang::Class > _self );
285 virtual void call( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
288 class ClassMethodIsa : public Lang::ClassMethodBase
290 public:
291 ClassMethodIsa( RefCountPtr< const Lang::Class > _self );
292 virtual void call( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
298 #endif