#include <map>
#include <string>
#include <vector>
+#include <msp/core/refptr.h>
+#include "extension.h"
namespace Msp {
namespace GL {
};
template<typename T>
-class NodePtr
+class NodePtr: public RefPtr<T>
{
-private:
- T *node;
-
public:
- NodePtr(T *n = 0): node(n) { }
- NodePtr(const NodePtr &p): node(clone(p.node)) { }
- NodePtr &operator=(const NodePtr &p) { delete node; node = clone(p.node); return *this; }
-#if __cplusplus>=201103L
- NodePtr(NodePtr &&p): node(p.node) { p.node = 0; }
- NodePtr &operator=(NodePtr &&p) { delete node; node = p.node; p.node = 0; return *this; }
-#endif
- ~NodePtr() { delete node; }
+ NodePtr() { }
+ NodePtr(T *p): RefPtr<T>(p) { }
+ NodePtr(const NodePtr &p): RefPtr<T>(p ? p->clone() : 0) { }
-private:
- static T *clone(T *n) { return n ? n->clone() : 0; }
+ template<typename U>
+ NodePtr(const RefPtr<U> &p): RefPtr<T>(p) { }
+ template<typename U>
+ NodePtr(const NodePtr<U> &p): RefPtr<T>(p ? p->clone() : 0) { }
+};
+
+template<typename C>
+class NodeContainer: public C
+{
public:
- T *operator->() { return node; }
- const T *operator->() const { return node; }
- T &operator*() { return *node; }
- const T &operator*() const { return *node; }
- operator void *() const { return node; }
+ NodeContainer() { }
+ NodeContainer(const NodeContainer &);
};
+template<typename T>
+class NodeList: public NodeContainer<std::list<RefPtr<T> > >
+{ };
+
+template<typename T>
+class NodeArray: public NodeContainer<std::vector<RefPtr<T> > >
+{ };
+
struct StructDeclaration;
struct VariableDeclaration;
struct FunctionDeclaration;
struct Block: Node
{
- std::list<NodePtr<Node> > body;
+ NodeList<Node> body;
bool use_braces;
std::map<std::string, StructDeclaration *> types;
std::map<std::string, VariableDeclaration *> variables;
std::string name;
FunctionDeclaration *declaration;
bool constructor;
- std::vector<NodePtr<Expression> > arguments;
+ NodeArray<Expression> arguments;
FunctionCall();
virtual void visit(NodeVisitor &);
};
+struct Precision: Node
+{
+ std::string precision;
+ std::string type;
+
+ virtual Precision *clone() const { return new Precision(*this); }
+ virtual void visit(NodeVisitor &);
+};
+
struct Layout: Node
{
struct Qualifier
};
std::vector<Qualifier> qualifiers;
- std::string interface;
virtual Layout *clone() const { return new Layout(*this); }
virtual void visit(NodeVisitor &);
};
+struct InterfaceLayout: Node
+{
+ std::string interface;
+ Layout layout;
+
+ virtual InterfaceLayout *clone() const { return new InterfaceLayout(*this); }
+ virtual void visit(NodeVisitor &);
+};
+
struct StructDeclaration: Node
{
std::string name;
bool constant;
std::string sampling;
std::string interface;
+ std::string precision;
std::string type;
StructDeclaration *type_declaration;
std::string name;
NodePtr<Expression> array_size;
NodePtr<Expression> init_expression;
VariableDeclaration *linked_declaration;
+ NodePtr<Layout> layout;
VariableDeclaration();
{
std::string return_type;
std::string name;
- std::vector<NodePtr<VariableDeclaration> > parameters;
+ NodeArray<VariableDeclaration> parameters;
FunctionDeclaration *definition;
Block body;
virtual void visit(NodeVisitor &);
};
+struct Jump: Node
+{
+ std::string keyword;
+
+ virtual Jump *clone() const { return new Jump(*this); }
+ virtual void visit(NodeVisitor &);
+};
+
struct NodeVisitor
{
virtual ~NodeVisitor() { }
virtual void visit(FunctionCall &) { }
virtual void visit(ExpressionStatement &) { }
virtual void visit(Import &) { }
+ virtual void visit(Precision &) { }
virtual void visit(Layout &) { }
+ virtual void visit(InterfaceLayout &) { }
virtual void visit(StructDeclaration &) { }
virtual void visit(VariableDeclaration &) { }
virtual void visit(InterfaceBlock &) { }
virtual void visit(Iteration &) { }
virtual void visit(Passthrough &) { }
virtual void visit(Return &) { }
+ virtual void visit(Jump &) { }
};
struct TraversingVisitor: NodeVisitor
{
+ using NodeVisitor::visit;
virtual void visit(Block &);
virtual void visit(ParenthesizedExpression &);
virtual void visit(MemberAccess &);
virtual void visit(BinaryExpression &);
virtual void visit(FunctionCall &);
virtual void visit(ExpressionStatement &);
+ virtual void visit(InterfaceLayout &);
virtual void visit(StructDeclaration &);
virtual void visit(VariableDeclaration &);
virtual void visit(InterfaceBlock &);
ProgramSyntax::Block content;
std::map<std::string, VariableDeclaration *> in_variables;
std::map<std::string, VariableDeclaration *> out_variables;
+ std::map<std::string, unsigned> locations;
+ Version required_version;
Stage(StageType);
};