X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=2ef4aa7d9b77c5f853968da6e4e9dbc310c9abec;hp=a2dd9401256a34c7659800765f8cf25ca56a8313;hb=7434b80c452eb8f7ac8200a6f693a9eb668421f0;hpb=f9b23e69b63cbbeed8eeb605c0dc491002a4c23b diff --git a/source/programcompiler.h b/source/programcompiler.h index a2dd9401..2ef4aa7d 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -15,15 +15,20 @@ class ProgramCompiler private: struct Visitor: ProgramSyntax::TraversingVisitor { + typedef void ResultType; + ProgramSyntax::Stage *stage; Visitor(); virtual void apply(ProgramSyntax::Stage &); + void get_result() const { } }; struct Formatter: Visitor { + typedef std::string ResultType; + std::string formatted; unsigned indent; bool parameter_list; @@ -32,6 +37,7 @@ private: Formatter(); + const std::string &get_result() const { return formatted; } virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::Literal &); virtual void visit(ProgramSyntax::ParenthesizedExpression &); @@ -112,6 +118,7 @@ private: bool self_referencing; }; + typedef std::set ResultType; typedef std::map BlockAssignmentMap; std::set unused_nodes; @@ -124,6 +131,7 @@ private: UnusedVariableLocator(); virtual void apply(ProgramSyntax::Stage &); + const ResultType &get_result() const { return unused_nodes; } virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::MemberAccess &); virtual void visit(ProgramSyntax::BinaryExpression &); @@ -143,6 +151,9 @@ private: { std::set to_remove; + NodeRemover() { } + NodeRemover(const std::set &); + virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::VariableDeclaration &); }; @@ -166,8 +177,9 @@ private: bool optimize(ProgramSyntax::Stage &); static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &); template - static void apply(ProgramSyntax::Stage &); - std::string create_source(ProgramSyntax::Stage &); + static typename T::ResultType apply(ProgramSyntax::Stage &); + template + static typename T::ResultType apply(ProgramSyntax::Stage &, const A &); }; } // namespace GL