]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/generate.h
Remove the using declarations from visitors
[libs/gl.git] / source / glsl / generate.h
1 #ifndef MSP_GL_SL_GENERATE_H_
2 #define MSP_GL_SL_GENERATE_H_
3
4 #include <map>
5 #include <set>
6 #include <string>
7 #include <vector>
8 #include "visitor.h"
9
10 namespace Msp {
11 namespace GL {
12 namespace SL {
13
14 class DeclarationCombiner: private TraversingVisitor
15 {
16 private:
17         std::map<std::string, std::vector<FunctionDeclaration *> > functions;
18         std::map<std::string, VariableDeclaration *> variables;
19         std::set<Node *> nodes_to_remove;
20
21 public:
22         void apply(Stage &);
23
24 private:
25         virtual void visit(Block &);
26         virtual void visit(FunctionDeclaration &);
27         virtual void visit(VariableDeclaration &);
28 };
29
30 class BlockResolver: private TraversingVisitor
31 {
32 public:
33         void apply(Stage &s) { s.content.visit(*this); }
34
35 private:
36         virtual void visit(Block &);
37         virtual void visit(InterfaceBlock &);
38 };
39
40 class VariableResolver: private TraversingVisitor
41 {
42 private:
43         Block *builtins;
44         StructDeclaration *type;
45         std::string block_interface;
46         bool record_target;
47         VariableDeclaration *assignment_target;
48         bool self_referencing;
49
50 public:
51         VariableResolver();
52
53         void apply(Stage &);
54
55 private:
56         Block *next_block(Block &);
57
58         virtual void visit(Block &);
59         virtual void visit(VariableReference &);
60         virtual void visit(MemberAccess &);
61         virtual void visit(BinaryExpression &);
62         virtual void visit(Assignment &);
63         virtual void visit(StructDeclaration &);
64         virtual void visit(VariableDeclaration &);
65         virtual void visit(InterfaceBlock &);
66         virtual void visit(FunctionDeclaration &);
67         virtual void visit(Iteration &);
68 };
69
70 class FunctionResolver: private TraversingVisitor
71 {
72 private:
73         std::map<std::string, std::vector<FunctionDeclaration *> > functions;
74
75 public:
76         void apply(Stage &s) { s.content.visit(*this); }
77
78 private:
79         virtual void visit(FunctionCall &);
80         virtual void visit(FunctionDeclaration &);
81 };
82
83 class InterfaceGenerator: private TraversingVisitor
84 {
85 private:
86         Stage *stage;
87         std::string in_prefix;
88         std::string out_prefix;
89         NodeList<Statement>::iterator iface_insert_point;
90         NodeList<Statement>::iterator assignment_insert_point;
91         std::set<Node *> nodes_to_remove;
92
93 public:
94         InterfaceGenerator();
95
96         void apply(Stage &);
97
98 private:
99         static std::string get_out_prefix(Stage::Type);
100         std::string change_prefix(const std::string &, const std::string &) const;
101         virtual void visit(Block &);
102         bool generate_interface(VariableDeclaration &, const std::string &, const std::string &);
103         ExpressionStatement &insert_assignment(const std::string &, Expression *);
104         virtual void visit(VariableReference &);
105         virtual void visit(VariableDeclaration &);
106         virtual void visit(Passthrough &);
107 };
108
109 class DeclarationReorderer: private TraversingVisitor
110 {
111 private:
112         enum DeclarationKind
113         {
114                 NO_DECLARATION,
115                 LAYOUT,
116                 STRUCT,
117                 VARIABLE,
118                 FUNCTION
119         };
120
121         DeclarationKind kind;
122         std::set<Node *> ordered_funcs;
123         std::set<Node *> needed_funcs;
124
125 public:
126         DeclarationReorderer();
127
128         void apply(Stage &s) { s.content.visit(*this); }
129
130 private:
131         virtual void visit(Block &);
132         virtual void visit(FunctionCall &);
133         virtual void visit(InterfaceLayout &) { kind = LAYOUT; }
134         virtual void visit(StructDeclaration &) { kind = STRUCT; }
135         virtual void visit(VariableDeclaration &);
136         virtual void visit(InterfaceBlock &) { kind = VARIABLE; }
137         virtual void visit(FunctionDeclaration &);
138 };
139
140 } // namespace SL
141 } // namespace GL
142 } // namespace Msp
143
144 #endif