Update procedures
[shapes.git] / source / classtypes.h
blob1f324b902448f8e3ddf6f06b1464a35bfbe868f4
1 /* This file is part of Shapes.
3 * Shapes is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * any later version.
8 * Shapes is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with Shapes. If not, see <http://www.gnu.org/licenses/>.
16 * Copyright 2008, 2013 Henrik Tidefelt
19 #pragma once
21 #include "Shapes_Ast_decls.h"
22 #include "Shapes_Lang_decls.h"
23 #include "Shapes_Kernel_decls.h"
25 #include "ptrowner.h"
26 #include "refcount.h"
27 #include "pdfstructure.h"
28 #include "shapesvalue.h"
29 #include "environment.h"
30 #include "charptrless.h"
31 #include "methodid.h"
32 #include "drawabletypes.h"
33 #include "hottypes.h"
35 #include <list>
36 #include <iostream>
37 #include <stack>
38 #include <set>
40 namespace Shapes
42 namespace Lang
45 class Instance : public Lang::Drawable2D
47 protected:
48 mutable Kernel::PassedEnv env;
49 Kernel::PassedEnv privateEnv;
51 Kernel::WarmGroup2D * warm2D;
52 Kernel::WarmGroup3D * warm3D;
53 Kernel::PassedDyn my_dyn;
54 public:
55 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > parents; /* the reference is non-const to allow prepared to be changed */
56 /* public scope is the easy way to let a Class add overrides to its instances */
57 std::map< RefCountPtr< const Lang::Class >, std::map< const char *, RefCountPtr< const Lang::Function >, charPtrLess > > overrides;
58 protected:
59 RefCountPtr< const Lang::Class > myClass;
60 bool prepared;
61 bool protectedAccess;
62 mutable std::map< Kernel::MethodId, RefCountPtr< const Lang::Function > > methodTable;
63 public:
64 Instance( Kernel::PassedEnv _env, Kernel::PassedEnv _privateEnv, RefCountPtr< const Lang::Class > _myClass, bool _protectedAccess, const Kernel::PassedDyn & _my_dyn );
65 virtual ~Instance( );
66 virtual void gcMark( Kernel::GCMarkedSet & marked );
67 void prepare( Kernel::EvalState * evalState );
68 virtual Kernel::VariableHandle getField( const char * fieldID, const RefCountPtr< const Lang::Value > & selfRef ) const;
69 Kernel::VariableHandle getLocalField( const char * fieldID ) const;
70 virtual void tackOn( const char * fieldID, Kernel::EvalState * evalState, const RefCountPtr< const Lang::Value > & piece, const Ast::SourceLocation & callLoc );
71 virtual void tackOnLocal( const char * fieldID, Kernel::EvalState * evalState, const RefCountPtr< const Lang::Value > & piece, const Ast::SourceLocation & callLoc );
72 RefCountPtr< const Lang::Function > getMethod( Kernel::MethodId fieldID ) const;
73 RefCountPtr< const Lang::Function > getLocalMethod( Kernel::MethodId fieldID ) const;
74 RefCountPtr< const Lang::Instance > superReference( RefCountPtr< const Lang::Class > parent ) const;
76 virtual RefCountPtr< const Lang::Geometric2D > transformed( const Lang::Transform2D & tf, const RefCountPtr< const Lang::Geometric2D > & self ) const;
78 virtual void shipout( std::ostream & os, Kernel::PageContentStates * pdfState, const Lang::Transform2D & tf ) const;
79 virtual RefCountPtr< const Lang::ElementaryPath2D > bbox( Lang::Drawable2D::BoxType boxType ) const;
81 virtual const RefCountPtr< const Lang::Class > & getClass( ) const;
82 static RefCountPtr< const char > staticTypeName( );
84 virtual void show( std::ostream & os ) const;
85 DISPATCHDECL;
88 class TransformedInstance : public Lang::Drawable2D
90 Lang::Transform2D tf;
91 RefCountPtr< const Lang::Instance > obj;
92 public:
93 TransformedInstance( const Lang::Transform2D & _tf, const RefCountPtr< const Lang::Instance > & _obj );
94 ~TransformedInstance( );
95 virtual void gcMark( Kernel::GCMarkedSet & marked );
96 virtual Kernel::VariableHandle getField( const char * fieldID, const RefCountPtr< const Lang::Value > & selfRef ) const;
97 RefCountPtr< const Lang::Function > getMethod( Kernel::MethodId fieldID ) const;
99 virtual RefCountPtr< const Lang::Geometric2D > transformed( const Lang::Transform2D & tf, const RefCountPtr< const Lang::Geometric2D > & self ) const;
101 virtual void shipout( std::ostream & os, Kernel::PageContentStates * pdfState, const Lang::Transform2D & tf ) const;
102 virtual RefCountPtr< const Lang::ElementaryPath2D > bbox( Lang::Drawable2D::BoxType boxType ) const;
104 TYPEINFODECL;
105 virtual void show( std::ostream & os ) const;
108 class Class : public Lang::Value
110 public:
111 typedef std::map< Kernel::MethodId, std::set< RefCountPtr< const Lang::Class > > > MessageMapType;
112 private:
113 RefCountPtr< const char > prettyName;
114 protected:
115 mutable RefCountPtr< const Lang::Class > selfRef;
116 bool isFinal;
117 MessageMapType messageMap;
118 std::set< Kernel::MethodId > abstractSet;
119 public:
120 Class( RefCountPtr< const char > _prettyName );
121 virtual ~Class( );
122 void setSelfRef( RefCountPtr< const Lang::Class > _selfRef ) const;
124 virtual Kernel::VariableHandle getField( const char * fieldID, const RefCountPtr< const Lang::Value > & selfRef ) const;
126 RefCountPtr< const char > getPrettyName( ) const;
128 virtual bool isInPublicGetSet( const char * field ) const;
129 virtual bool isInPublicSetSet( const char * field ) const;
130 virtual bool isInProtectedGetSet( const char * field ) const;
131 virtual bool isInProtectedSetSet( const char * field ) const;
132 virtual bool isInTransformingSet( const char * field ) const;
134 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const = 0;
135 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const = 0;
136 // virtual Kernel::ValueRef method_implements( ) const = 0;
138 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const = 0;
139 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const = 0;
140 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
141 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
142 Kernel::Arguments & args,
143 Kernel::EvalState * evalState ) const = 0;
144 virtual void findParents( std::set< RefCountPtr< const Lang::Class > > * _allParents, std::set< RefCountPtr< const Lang::Class > > * _multiParents ) const;
145 virtual bool isRepeatableBase( ) const = 0;
146 virtual void prepareInstance( Kernel::EvalState * evalState, Kernel::PassedEnv privateEnv ) const;
148 bool getFinal( ) const;
149 const MessageMapType & getMessageMap( ) const;
150 const RefCountPtr< const Lang::Class > & getMethodDefinitionClass( const Kernel::MethodId & method ) const;
152 virtual Kernel::VariableHandle getMethod( const RefCountPtr< const Lang::Value > & self, const char * methodID ) const;
153 virtual RefCountPtr< const Lang::Function > getMutator( const char * mutatorID ) const;
155 void showAbstractSet( std::ostream & os ) const;
157 TYPEINFODECL;
158 virtual void show( std::ostream & os ) const;
159 DISPATCHDECL;
162 class Object : public Lang::Class
164 Kernel::PassedEnv dummyEnv;
165 public:
166 Object( );
167 virtual ~Object( );
168 virtual void gcMark( Kernel::GCMarkedSet & marked );
170 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
171 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const;
173 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const;
174 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const;
175 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
176 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
177 Kernel::Arguments & emptyArglist,
178 Kernel::EvalState * evalState ) const;
179 virtual bool isRepeatableBase( ) const;
182 class MetaClass : public Lang::Class
184 public:
185 MetaClass( );
186 virtual ~MetaClass( );
188 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
189 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const;
191 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const;
192 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const;
193 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
194 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
195 Kernel::Arguments & emptyArglist,
196 Kernel::EvalState * evalState ) const;
197 virtual void findParents( std::set< RefCountPtr< const Lang::Class > > * _allParents, std::set< RefCountPtr< const Lang::Class > > * _multiParents ) const;
198 virtual bool isRepeatableBase( ) const;
199 virtual void gcMark( Kernel::GCMarkedSet & marked );
202 class SystemFinalClass : public Lang::Class
204 std::map< const char *, RefCountPtr< const Kernel::MethodFactoryBase >, charPtrLess > methods_;
205 std::map< const char *, RefCountPtr< const Lang::Function >, charPtrLess > mutators_;
206 typedef void ( * RegisterFunction )( SystemFinalClass * );
207 RegisterFunction registerFunction_;
208 public:
209 SystemFinalClass( RefCountPtr< const char > _prettyName );
210 SystemFinalClass( RefCountPtr< const char > _prettyName, RegisterFunction registerFunction );
211 virtual ~SystemFinalClass( );
212 void init( );
213 void registerMethod( Kernel::MethodFactoryBase * factory );
214 void registerMutator( Lang::CoreMutator * fun, const char * alias = 0 );
216 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
217 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const;
219 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const;
220 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const;
221 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
222 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
223 Kernel::Arguments & emptyArglist,
224 Kernel::EvalState * evalState ) const;
225 virtual bool isRepeatableBase( ) const;
226 virtual Kernel::VariableHandle getMethod( const RefCountPtr< const Lang::Value > & self, const char * methodID ) const;
227 virtual RefCountPtr< const Lang::Function > getMutator( const char * mutatorID ) const;
228 virtual void gcMark( Kernel::GCMarkedSet & marked );
231 class SystemVirtualInterface : public Lang::Class
233 public:
234 SystemVirtualInterface( RefCountPtr< const char > _prettyName );
235 virtual ~SystemVirtualInterface( );
237 void addVirtual( const char * id );
239 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
240 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const;
242 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const;
243 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const;
244 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
245 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
246 Kernel::Arguments & emptyArglist,
247 Kernel::EvalState * evalState ) const;
248 virtual bool isRepeatableBase( ) const;
249 virtual void gcMark( Kernel::GCMarkedSet & marked );
252 class UserClass : public Lang::Class
254 const Shapes::Ast::ClassFunction * classExpr;
255 Kernel::EvaluatedFormals * formals;
256 // Kernel::PassedEnv env; /* Currently not used, quiet compiler warning. */
257 RefCountPtr< std::list< std::pair< RefCountPtr< const Lang::Class >, const Ast::ArgListExprs * > > > parents;
258 std::set< RefCountPtr< const Lang::Class > > allParents;
259 std::set< RefCountPtr< const Lang::Class > > multiParents;
260 std::set< RefCountPtr< const Lang::Class > > immediateParents;
261 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, std::list< Ast::MemberDeclaration * > > > overrides;
262 public:
263 UserClass( const Shapes::Ast::ClassFunction * _classExpr, 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 );
264 virtual ~UserClass( );
266 virtual void gcMark( Kernel::GCMarkedSet & marked );
268 void setupAndCheck( bool declaredAbstract );
270 virtual bool isInPublicGetSet( const char * field ) const;
271 virtual bool isInPublicSetSet( const char * field ) const;
272 virtual bool isInProtectedGetSet( const char * field ) const;
273 virtual bool isInProtectedSetSet( const char * field ) const;
274 virtual bool isInTransformingSet( const char * field ) const;
276 virtual Kernel::ValueRef method_new( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
277 virtual bool method_isa( RefCountPtr< const Lang::Class > T ) const;
279 virtual void findMultiplyInheritedClasses( std::set< RefCountPtr< Lang::Class > > * visited, std::set< RefCountPtr< Lang::Class > > * found ) const;
280 virtual void assertMethodOverridable( const char * id, const RefCountPtr< const Lang::Class > & caller ) const;
281 virtual void superNew( RefCountPtr< Lang::Instance > instanceSelf,
282 RefCountPtr< std::map< RefCountPtr< const Lang::Class >, RefCountPtr< Lang::Instance > > > createdObjects,
283 Kernel::Arguments & args,
284 Kernel::EvalState * evalState ) const;
285 virtual void findParents( std::set< RefCountPtr< const Lang::Class > > * _allParents, std::set< RefCountPtr< const Lang::Class > > * _multiParents ) const;
286 virtual bool isRepeatableBase( ) const;
287 virtual void prepareInstance( Kernel::EvalState * evalState, Kernel::PassedEnv privateEnv ) const;
289 void addOverrides( Kernel::EvalState * evalState, RefCountPtr< Lang::Instance > instance, Kernel::PassedEnv privateEnv ) const;
292 class ClassMethodBase : public Lang::Function
294 protected:
295 RefCountPtr< const Lang::Class > self;
296 public:
297 ClassMethodBase( RefCountPtr< const Lang::Class > _self );
298 virtual ~ClassMethodBase( );
299 virtual void gcMark( Kernel::GCMarkedSet & marked );
300 virtual bool isTransforming( ) const;
303 class ClassMethodNew : public Lang::ClassMethodBase
305 public:
306 ClassMethodNew( RefCountPtr< const Lang::Class > _self );
307 virtual void call( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;
310 class ClassMethodIsa : public Lang::ClassMethodBase
312 public:
313 ClassMethodIsa( RefCountPtr< const Lang::Class > _self );
314 virtual void call( Kernel::EvalState * evalState, Kernel::Arguments & args, const Ast::SourceLocation & callLoc ) const;