]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/reflect.h
Make function dependency collection its own visitor class
[libs/gl.git] / source / glsl / reflect.h
1 #ifndef MSP_GL_SL_REFLECT_H_
2 #define MSP_GL_SL_REFLECT_H_
3
4 #include "visitor.h"
5
6 namespace Msp {
7 namespace GL {
8 namespace SL {
9
10 /** Determines the number of interface locations required by a variable. */
11 class LocationCounter: private NodeVisitor
12 {
13 private:
14         unsigned r_count;
15
16 public:
17         LocationCounter();
18
19         unsigned apply(VariableDeclaration &v) { v.visit(*this); return r_count; }
20
21 private:
22         virtual void visit(BasicTypeDeclaration &);
23         virtual void visit(ImageTypeDeclaration &);
24         virtual void visit(StructDeclaration &);
25         virtual void visit(VariableDeclaration &);
26 };
27
28 /** Collects dependencies of a function.  This includes global variables,
29 interface blocks, other functions and types. */
30 class DependencyCollector: private TraversingVisitor
31 {
32 private:
33         std::set<Node *> dependencies;
34         std::set<Node *> locals;
35
36 public:
37         std::set<Node *> apply(FunctionDeclaration &);
38
39 private:
40         virtual void visit(VariableReference &);
41         virtual void visit(InterfaceBlockReference &);
42         virtual void visit(FunctionCall &);
43         virtual void visit(VariableDeclaration &);
44 };
45
46 } // namespace SL
47 } // namespace GL
48 } // namespace Msp
49
50 #endif