Updating the changelog in the VERSION file, and version_sync.
[shapes.git] / source / containertypes.h
blob679b7b4c572c333cfc377d1ad527060574c65a31
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 Henrik Tidefelt
19 #pragma once
21 #include <list>
22 #include <iostream>
23 #include <stack>
24 #include <set>
26 #include "ptrowner.h"
27 #include "refcount.h"
28 #include "pdfstructure.h"
29 #include "shapesvalue.h"
30 #include "environment.h"
31 #include "charptrless.h"
33 namespace Shapes
35 namespace Lang
38 class SingleList : public Lang::NoOperatorOverloadValue
40 public:
41 SingleList( );
42 virtual ~SingleList( );
43 virtual bool isNull( ) const = 0;
44 virtual void foldl( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, const Ast::SourceLocation & callLoc ) const = 0;
45 virtual void foldr( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, const Ast::SourceLocation & callLoc ) const = 0;
46 virtual void foldsl( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, Kernel::StateHandle state, const Ast::SourceLocation & callLoc ) const = 0;
47 virtual void foldsr( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, Kernel::StateHandle state, const Ast::SourceLocation & callLoc ) const = 0;
48 virtual Kernel::VariableHandle getField( const char * fieldID, const RefCountPtr< const Lang::Value > & selfRef ) const;
49 TYPEINFODECL;
52 class SingleListPair : public Lang::SingleList
54 public:
55 /* The data is provided public becase it is used in function application
57 Kernel::VariableHandle car_;
58 RefCountPtr< const Lang::SingleList > cdr_;
60 SingleListPair( const Kernel::VariableHandle & car, const RefCountPtr< const Lang::SingleList > & cdr );
61 virtual ~SingleListPair( );
62 virtual bool isNull( ) const;
63 virtual void foldl( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, const Ast::SourceLocation & callLoc ) const;
64 virtual void foldr( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, const Ast::SourceLocation & callLoc ) const;
65 virtual void foldsl( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, Kernel::StateHandle state, const Ast::SourceLocation & callLoc ) const;
66 virtual void foldsr( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, Kernel::StateHandle state, const Ast::SourceLocation & callLoc ) const;
67 virtual void gcMark( Kernel::GCMarkedSet & marked );
70 class SingleListNull : public Lang::SingleList
72 public:
73 SingleListNull( );
74 virtual ~SingleListNull( );
75 virtual bool isNull( ) const;
76 virtual void foldl( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, const Ast::SourceLocation & callLoc ) const;
77 virtual void foldr( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, const Ast::SourceLocation & callLoc ) const;
78 virtual void foldsl( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, Kernel::StateHandle state, const Ast::SourceLocation & callLoc ) const;
79 virtual void foldsr( Kernel::EvalState * evalState, const RefCountPtr< const Lang::Function > & op, const Kernel::VariableHandle & nullResult, Kernel::StateHandle state, const Ast::SourceLocation & callLoc ) const;
80 virtual void gcMark( Kernel::GCMarkedSet & marked ){ };
83 class Structure : public Lang::NoOperatorOverloadValue
85 bool argListOwner_;
86 public:
87 /* The data is provided public becase it is used in function application
89 const Ast::ArgListExprs * argList_;
90 RefCountPtr< const Lang::SingleList > values_;
91 Structure( const Ast::ArgListExprs * argList, const RefCountPtr< const Lang::SingleList > & values, bool argListOwner = false );
92 virtual ~Structure( );
93 virtual Kernel::VariableHandle getField( const char * fieldID, const RefCountPtr< const Lang::Value > & selfRef ) const;
94 Kernel::VariableHandle getPosition( size_t pos, const RefCountPtr< const Lang::Value > & selfRef ) const;
95 RefCountPtr< const Lang::Structure > getSink( size_t consumedArguments ) const;
96 virtual void gcMark( Kernel::GCMarkedSet & marked );
97 TYPEINFODECL;
100 class ConsPair : public Lang::NoOperatorOverloadValue
102 Kernel::VariableHandle car_;
103 Kernel::VariableHandle cdr_;
104 public:
105 ConsPair( const Kernel::VariableHandle & car, const Kernel::VariableHandle & cdr );
106 virtual ~ConsPair( );
107 virtual void show( std::ostream & os ) const;
108 virtual Kernel::VariableHandle getField( const char * fieldID, const RefCountPtr< const Lang::Value > & selfRef ) const;
109 virtual void gcMark( Kernel::GCMarkedSet & marked );
110 TYPEINFODECL;
115 namespace Kernel
117 class StructureFactory
119 const Ast::ArgListExprs * argList_;
120 std::map< const char *, Kernel::VariableHandle, charPtrLess > values_;
121 private:
122 void init( const std::list< const char * > & fields );
123 public:
124 StructureFactory( const std::list< const char * > & fields );
125 StructureFactory( const char * field1 );
126 StructureFactory( const char * field1, const char * field2 );
127 StructureFactory( const char * field1, const char * field2, const char * field3 );
128 StructureFactory( const char * field1, const char * field2, const char * field3, const char * field4 );
129 void clear( );
130 void set( const char * field, const Kernel::VariableHandle & value );
131 RefCountPtr< const Lang::Structure > build( );
134 class UnnamedStructureFactory
136 mutable std::map< size_t, const Ast::ArgListExprs * > argLists_;
137 public:
138 UnnamedStructureFactory( );
139 RefCountPtr< const Lang::Structure > build( const RefCountPtr< const Lang::SingleList > & values ) const;