- Changed DocBook version to 4.3, 5.0 is not officially released yet and most
[supertux.git] / tools / miniswig / tree.h
1 #ifndef __TREE_H__
2 #define __TREE_H__
3
4 #include <vector>
5 #include <string>
6 #include <iostream>
7 #include <sstream>
8 #include <stdexcept>
9 #include <assert.h>
10
11 class Namespace;
12
13 class AtomicType {
14 public:
15     AtomicType()
16         : parent(0)
17     { }
18     virtual ~AtomicType()
19     { }
20
21     virtual void write_c(std::ostream& out)
22     {
23         out << name;
24     }
25
26     std::string name;
27     Namespace* parent;
28 };
29
30 class BasicType : public AtomicType {
31 public:
32     static BasicType VOID;
33     static BasicType BOOL;
34     static BasicType CHAR;
35     static BasicType SHORT;
36     static BasicType INT;
37     static BasicType LONG;
38     static BasicType FLOAT;
39     static BasicType DOUBLE;
40
41 private:
42     BasicType(const std::string& name)
43     { 
44         this->name = name;
45     }                                     
46 };
47
48 class Type {
49 public:
50     Type() 
51         : atomic_type(0), _unsigned(false), _const(false), _static(false),
52         pointer(0), ref(0)
53     { }
54
55     void write_c_type(std::ostream& out)
56     {
57         if(_static)
58             out << "static ";        
59         if(_const)
60             out << "const ";
61         atomic_type->write_c(out);
62         for(int i = 0; i < pointer; ++i)
63             out << "*";
64         for(int i = 0; i < ref; ++i)
65             out << "&";
66     }
67
68     bool is_void() const
69     {
70         if(atomic_type == 0)
71             return true;
72         if(atomic_type == &BasicType::VOID && pointer == 0)
73             return true;
74         return false;
75     }
76
77     AtomicType* atomic_type;
78     bool _unsigned;
79     bool _const;
80     bool _static;
81     // number of '*' in the type declaration...
82     int pointer;
83     // number of '&' in the type declaration...
84     int ref;
85 };
86
87 class HSQUIRRELVMType : public AtomicType {
88 public:
89     HSQUIRRELVMType()
90     {
91         this->name = "HSQUIRRELVM";
92         assert(_instance == 0);
93         _instance = this;
94     }
95     virtual ~HSQUIRRELVMType()
96     {
97         assert(_instance == this);
98         _instance = 0;
99     }
100
101     static HSQUIRRELVMType* instance()
102     {
103         return _instance;
104     }
105 private:
106     static HSQUIRRELVMType* _instance;
107 };
108
109 class StringType : public AtomicType {
110 public:
111     StringType()
112     {
113         this->name = "string";
114         assert(_instance == 0);
115         _instance = this;
116     }
117     virtual ~StringType()
118     {
119         assert(_instance == this);
120         _instance = 0;
121     }
122
123     static StringType* instance()
124     {
125         return _instance;
126     }
127
128     virtual void write_c(std::ostream& out)
129     {
130         out << "std::string";
131     }
132
133 private:
134     static StringType* _instance;   
135 };
136
137 class Parameter {
138 public:
139     std::string name;
140     Type type;
141 };
142
143 class ClassMember {
144 public:
145     virtual ~ClassMember()
146     { }
147
148     enum Visbility {
149         PUBLIC,
150         PROTECTED,
151         PRIVATE
152     };
153     Visbility visibility;
154 };
155
156 class Function : public ClassMember {
157 public:
158     enum FuncType {
159         FUNCTION,
160         CONSTRUCTOR,
161         DESTRUCTOR
162     };
163     FuncType type;
164     std::string docu_comment;
165     std::string name;
166     Type return_type;
167     std::vector<Parameter> parameters;
168 };
169
170 class Class : public AtomicType {
171 public:
172     ~Class() {
173         for(std::vector<ClassMember*>::iterator i = members.begin();
174                 i != members.end(); ++i)
175             delete *i;
176     }
177     
178     std::vector<ClassMember*> members;
179     std::string docu_comment;
180 };
181
182 class Namespace {
183 public:
184     Namespace() {
185         parent = 0;
186     }
187     virtual ~Namespace() {
188         for(std::vector<Function*>::iterator i = functions.begin();
189                 i != functions.end(); ++i)
190             delete *i;
191         for(std::vector<AtomicType*>::iterator i = types.begin();
192                 i != types.end(); ++i)
193             delete *i;
194         for(std::vector<Namespace*>::iterator i = namespaces.begin();
195                 i != namespaces.end(); ++i)
196             delete *i;
197     }
198     void add_type(AtomicType* type)
199     {
200         types.push_back(type);
201         type->parent = this;
202     }
203     void add_namespace(Namespace* ns)
204     {
205         namespaces.push_back(ns);
206         ns->parent = this;
207     }
208     AtomicType* _findType(const std::string& name, bool godown = false) {
209         for(std::vector<AtomicType*>::iterator i = types.begin();
210                 i != types.end(); ++i) {
211             AtomicType* type = *i;
212             if(type->name == name)
213                 return type;
214         }
215         if(godown && parent)
216             return parent->_findType(name, true);
217
218         return 0;
219     }
220
221     Namespace* _findNamespace(const std::string& name, bool godown = false) {
222         for(std::vector<Namespace*>::iterator i = namespaces.begin();
223                 i != namespaces.end(); ++i) {
224             Namespace* ns = *i;
225             if(ns->name == name)
226                 return ns;
227         }
228         if(godown && parent)
229             return parent->_findNamespace(name, true);
230
231         return 0;
232     }
233
234     Namespace* findNamespace(const std::string& name, bool godown = false) {
235         Namespace* ret = _findNamespace(name, godown);
236         if(!ret) {
237             std::ostringstream msg;
238             msg << "Couldn't find namespace '" << name << "'.";
239             throw std::runtime_error(msg.str());
240         }
241
242         return ret;
243     }
244                                                                              
245     std::vector<Function*> functions;
246     std::vector<AtomicType*> types;
247     std::vector<Namespace*> namespaces;
248
249     Namespace* parent;
250     std::string name;
251 };
252
253 class CompilationUnit : public Namespace {
254 public:
255 };
256
257 #endif
258