10 const Operator Operator::operators[] =
12 { "[", 2, BINARY, LEFT_TO_RIGHT },
13 { "(", 2, BINARY, LEFT_TO_RIGHT },
14 { ".", 2, BINARY, LEFT_TO_RIGHT },
15 { "++", 2, POSTFIX, LEFT_TO_RIGHT },
16 { "--", 2, POSTFIX, LEFT_TO_RIGHT },
17 { "++", 3, PREFIX, RIGHT_TO_LEFT },
18 { "--", 3, PREFIX, RIGHT_TO_LEFT },
19 { "+", 3, PREFIX, RIGHT_TO_LEFT },
20 { "-", 3, PREFIX, RIGHT_TO_LEFT },
21 { "~", 3, PREFIX, RIGHT_TO_LEFT },
22 { "!", 3, PREFIX, RIGHT_TO_LEFT },
23 { "*", 4, BINARY, LEFT_TO_RIGHT },
24 { "/", 4, BINARY, LEFT_TO_RIGHT },
25 { "%", 4, BINARY, LEFT_TO_RIGHT },
26 { "+", 5, BINARY, LEFT_TO_RIGHT },
27 { "-", 5, BINARY, LEFT_TO_RIGHT },
28 { "<<", 6, BINARY, LEFT_TO_RIGHT },
29 { ">>", 6, BINARY, LEFT_TO_RIGHT },
30 { "<", 7, BINARY, LEFT_TO_RIGHT },
31 { ">", 7, BINARY, LEFT_TO_RIGHT },
32 { "<=", 7, BINARY, LEFT_TO_RIGHT },
33 { ">=", 7, BINARY, LEFT_TO_RIGHT },
34 { "==", 8, BINARY, LEFT_TO_RIGHT },
35 { "!=", 8, BINARY, LEFT_TO_RIGHT },
36 { "&", 9, BINARY, LEFT_TO_RIGHT },
37 { "^", 10, BINARY, LEFT_TO_RIGHT },
38 { "|", 11, BINARY, LEFT_TO_RIGHT },
39 { "&&", 12, BINARY, LEFT_TO_RIGHT },
40 { "^^", 13, BINARY, LEFT_TO_RIGHT },
41 { "||", 14, BINARY, LEFT_TO_RIGHT },
42 { "?", 15, BINARY, RIGHT_TO_LEFT },
43 { ":", 15, BINARY, RIGHT_TO_LEFT },
44 { "=", 16, BINARY, RIGHT_TO_LEFT },
45 { "+=", 16, BINARY, RIGHT_TO_LEFT },
46 { "-=", 16, BINARY, RIGHT_TO_LEFT },
47 { "*=", 16, BINARY, RIGHT_TO_LEFT },
48 { "/=", 16, BINARY, RIGHT_TO_LEFT },
49 { "%=", 16, BINARY, RIGHT_TO_LEFT },
50 { "<<=", 16, BINARY, RIGHT_TO_LEFT },
51 { ">>=", 16, BINARY, RIGHT_TO_LEFT },
52 { "&=", 16, BINARY, RIGHT_TO_LEFT },
53 { "^=", 16, BINARY, RIGHT_TO_LEFT },
54 { "|=", 16, BINARY, RIGHT_TO_LEFT },
55 { ",", 17, BINARY, LEFT_TO_RIGHT },
56 { { 0 }, 18, NO_OPERATOR, LEFT_TO_RIGHT }
61 NodeContainer<C>::NodeContainer(const NodeContainer &c):
64 for(typename C::iterator i=this->begin(); i!=this->end(); ++i)
69 Statement::Statement():
70 source(GENERATED_SOURCE),
80 Block::Block(const Block &other):
83 use_braces(other.use_braces),
87 void Block::visit(NodeVisitor &visitor)
93 void Literal::visit(NodeVisitor &visitor)
99 void ParenthesizedExpression::visit(NodeVisitor &visitor)
101 visitor.visit(*this);
105 VariableReference::VariableReference():
109 VariableReference::VariableReference(const VariableReference &other):
115 void VariableReference::visit(NodeVisitor &visitor)
117 visitor.visit(*this);
121 InterfaceBlockReference::InterfaceBlockReference():
125 InterfaceBlockReference::InterfaceBlockReference(const InterfaceBlockReference &other):
131 void InterfaceBlockReference::visit(NodeVisitor &visitor)
133 visitor.visit(*this);
137 MemberAccess::MemberAccess():
141 MemberAccess::MemberAccess(const MemberAccess &other):
144 member(other.member),
148 void MemberAccess::visit(NodeVisitor &visitor)
150 visitor.visit(*this);
154 UnaryExpression::UnaryExpression():
158 void UnaryExpression::visit(NodeVisitor &visitor)
160 visitor.visit(*this);
164 void BinaryExpression::visit(NodeVisitor &visitor)
166 visitor.visit(*this);
170 Assignment::Assignment():
171 self_referencing(false),
172 target_declaration(0)
175 Assignment::Assignment(const Assignment &other):
176 BinaryExpression(other),
177 self_referencing(other.self_referencing),
178 target_declaration(0)
181 void Assignment::visit(NodeVisitor &visitor)
183 visitor.visit(*this);
187 FunctionCall::FunctionCall():
192 FunctionCall::FunctionCall(const FunctionCall &other):
195 constructor(other.constructor),
196 arguments(other.arguments),
200 void FunctionCall::visit(NodeVisitor &visitor)
202 visitor.visit(*this);
206 void ExpressionStatement::visit(NodeVisitor &visitor)
208 visitor.visit(*this);
212 void Import::visit(NodeVisitor &visitor)
214 visitor.visit(*this);
218 void Precision::visit(NodeVisitor &visitor)
220 visitor.visit(*this);
224 void Layout::visit(NodeVisitor &visitor)
226 visitor.visit(*this);
230 void InterfaceLayout::visit(NodeVisitor &visitor)
232 visitor.visit(*this);
236 StructDeclaration::StructDeclaration()
238 members.use_braces = true;
241 void StructDeclaration::visit(NodeVisitor &visitor)
243 visitor.visit(*this);
247 VariableDeclaration::VariableDeclaration():
251 linked_declaration(0)
254 VariableDeclaration::VariableDeclaration(const VariableDeclaration &other):
256 layout(other.layout),
257 constant(other.constant),
258 sampling(other.sampling),
259 interpolation(other.interpolation),
260 interface(other.interface),
261 precision(other.precision),
265 array_size(other.array_size),
266 init_expression(other.init_expression),
268 linked_declaration(0)
271 VariableDeclaration::~VariableDeclaration()
273 if(linked_declaration && linked_declaration->linked_declaration==this)
274 linked_declaration->linked_declaration = 0;
277 void VariableDeclaration::visit(NodeVisitor &visitor)
279 visitor.visit(*this);
283 InterfaceBlock::InterfaceBlock():
287 members.use_braces = true;
290 InterfaceBlock::InterfaceBlock(const InterfaceBlock &other):
292 interface(other.interface),
294 members(other.members),
295 instance_name(other.instance_name),
300 InterfaceBlock::~InterfaceBlock()
302 if(linked_block && linked_block->linked_block==this)
303 linked_block->linked_block = 0;
306 void InterfaceBlock::visit(NodeVisitor &visitor)
308 visitor.visit(*this);
312 FunctionDeclaration::FunctionDeclaration():
316 FunctionDeclaration::FunctionDeclaration(const FunctionDeclaration &other):
318 return_type(other.return_type),
320 parameters(other.parameters),
322 definition(other.definition==&other ? this : 0)
325 void FunctionDeclaration::visit(NodeVisitor &visitor)
327 visitor.visit(*this);
331 void Conditional::visit(NodeVisitor &visitor)
333 visitor.visit(*this);
337 void Iteration::visit(NodeVisitor &visitor)
339 visitor.visit(*this);
343 void Passthrough::visit(NodeVisitor &visitor)
345 visitor.visit(*this);
349 void Return::visit(NodeVisitor &visitor)
351 visitor.visit(*this);
355 void Jump::visit(NodeVisitor &visitor)
357 visitor.visit(*this);
361 Stage::Stage(Stage::Type t):
366 const char *Stage::get_stage_name(Type type)
368 static const char *names[] = { "shared", "vertex", "geometry", "fragment" };
374 shared(Stage::SHARED)