diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-07-07 15:06:16 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-07-07 15:06:16 -0700 |
| commit | c07a6e6b5f5e0e4839b435ff6c15b821b6dead11 (patch) | |
| tree | 8107b45190a0d8a33d07dcd6500ed0dfa939d530 /source/slang/visitor.h | |
| parent | 975e4b326cd2ef3ef0341d1fb7509315b9dee555 (diff) | |
| parent | f3fe9dddb8c528b4f9955d9105908600b4a8d0c8 (diff) | |
Merge pull request #59 from tfoleyNV/cross-compilation
More work on cross compilation
Diffstat (limited to 'source/slang/visitor.h')
| -rw-r--r-- | source/slang/visitor.h | 219 |
1 files changed, 198 insertions, 21 deletions
diff --git a/source/slang/visitor.h b/source/slang/visitor.h index 391769eca..7000927c7 100644 --- a/source/slang/visitor.h +++ b/source/slang/visitor.h @@ -24,8 +24,8 @@ struct ITypeVisitor #include "object-meta-end.h" }; -template<typename Derived, typename Result = void> -struct TypeVisitor : ITypeVisitor +template<typename Derived, typename Result = void, typename Base = ITypeVisitor> +struct TypeVisitor : Base { Result dispatch(ExpressionType* type) { @@ -37,16 +37,24 @@ struct TypeVisitor : ITypeVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void* extra) override \ - { *(Result*)extra = ((Derived*) this)->visit(obj); } + { *(Result*)extra = ((Derived*) this)->visit##NAME(obj); } #include "object-meta-begin.h" #include "type-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + Result visit##NAME(NAME* obj) \ + { return ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "type-defs.h" +#include "object-meta-end.h" }; -template<typename Derived> -struct TypeVisitor<Derived,void> : ITypeVisitor +template<typename Derived, typename Base> +struct TypeVisitor<Derived,void,Base> : Base { void dispatch(ExpressionType* type) { @@ -56,12 +64,47 @@ struct TypeVisitor<Derived,void> : ITypeVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void*) override \ - { ((Derived*) this)->visit(obj); } + { ((Derived*) this)->visit##NAME(obj); } #include "object-meta-begin.h" #include "type-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + void visit##NAME(NAME* obj) \ + { ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "type-defs.h" +#include "object-meta-end.h" +}; + +template<typename Derived, typename Arg, typename Base = ITypeVisitor> +struct TypeVisitorWithArg : Base +{ + void dispatch(ExpressionType* type, Arg const& arg) + { + type->accept(this, (void*)&arg); + } + +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ +#define SYNTAX_CLASS(NAME, BASE) \ + virtual void dispatch_##NAME(NAME* obj, void* arg) override \ + { ((Derived*) this)->visit##NAME(obj, *(Arg*)arg); } + +#include "object-meta-begin.h" +#include "type-defs.h" +#include "object-meta-end.h" + +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + void visit##NAME(NAME* obj, Arg const& arg) \ + { ((Derived*) this)->visit##BASE(obj, arg); } + +#include "object-meta-begin.h" +#include "type-defs.h" +#include "object-meta-end.h" }; // @@ -92,12 +135,20 @@ struct ExprVisitor : IExprVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void* extra) override \ - { *(Result*)extra = ((Derived*) this)->visit(obj); } + { *(Result*)extra = ((Derived*) this)->visit##NAME(obj); } #include "object-meta-begin.h" #include "expr-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + Result visit##NAME(NAME* obj) \ + { return ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "expr-defs.h" +#include "object-meta-end.h" }; template<typename Derived> @@ -111,12 +162,47 @@ struct ExprVisitor<Derived,void> : IExprVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void*) override \ - { ((Derived*) this)->visit(obj); } + { ((Derived*) this)->visit##NAME(obj); } + +#include "object-meta-begin.h" +#include "expr-defs.h" +#include "object-meta-end.h" + +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + void visit##NAME(NAME* obj) \ + { ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "expr-defs.h" +#include "object-meta-end.h" +}; + +template<typename Derived, typename Arg> +struct ExprVisitorWithArg : IExprVisitor +{ + void dispatch(ExpressionSyntaxNode* obj, Arg const& arg) + { + obj->accept(this, (void*)&arg); + } + +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ +#define SYNTAX_CLASS(NAME, BASE) \ + virtual void dispatch_##NAME(NAME* obj, void* arg) override \ + { ((Derived*) this)->visit##NAME(obj, *(Arg*)arg); } #include "object-meta-begin.h" #include "expr-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + void visit##NAME(NAME* obj, Arg const& arg) \ + { ((Derived*) this)->visit##BASE(obj, arg); } + +#include "object-meta-begin.h" +#include "expr-defs.h" +#include "object-meta-end.h" }; // @@ -147,12 +233,20 @@ struct StmtVisitor : IStmtVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void* extra) override \ - { *(Result*)extra = ((Derived*) this)->visit(obj); } + { *(Result*)extra = ((Derived*) this)->visit##NAME(obj); } #include "object-meta-begin.h" #include "stmt-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + Result visit##NAME(NAME* obj) \ + { return ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "stmt-defs.h" +#include "object-meta-end.h" }; template<typename Derived> @@ -166,12 +260,20 @@ struct StmtVisitor<Derived,void> : IStmtVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void*) override \ - { ((Derived*) this)->visit(obj); } + { ((Derived*) this)->visit##NAME(obj); } #include "object-meta-begin.h" #include "stmt-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + void visit##NAME(NAME* obj) \ + { ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "stmt-defs.h" +#include "object-meta-end.h" }; // @@ -202,12 +304,20 @@ struct DeclVisitor : IDeclVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void* extra) override \ - { *(Result*)extra = ((Derived*) this)->visit(obj); } + { *(Result*)extra = ((Derived*) this)->visit##NAME(obj); } #include "object-meta-begin.h" #include "decl-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + Result visit##NAME(NAME* obj) \ + { return ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "decl-defs.h" +#include "object-meta-end.h" }; template<typename Derived> @@ -221,14 +331,50 @@ struct DeclVisitor<Derived,void> : IDeclVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void*) override \ - { ((Derived*) this)->visit(obj); } + { ((Derived*) this)->visit##NAME(obj); } + +#include "object-meta-begin.h" +#include "decl-defs.h" +#include "object-meta-end.h" + +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + void visit##NAME(NAME* obj) \ + { ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "decl-defs.h" +#include "object-meta-end.h" +}; + +template<typename Derived, typename Arg> +struct DeclVisitorWithArg : IDeclVisitor +{ + void dispatch(DeclBase* obj, Arg const& arg) + { + obj->accept(this, (void*)&arg); + } + +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ +#define SYNTAX_CLASS(NAME, BASE) \ + virtual void dispatch_##NAME(NAME* obj, void* arg) override \ + { ((Derived*) this)->visit##NAME(obj, *(Arg*)arg); } #include "object-meta-begin.h" #include "decl-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + void visit##NAME(NAME* obj, Arg const& arg) \ + { ((Derived*) this)->visit##BASE(obj, arg); } + +#include "object-meta-begin.h" +#include "decl-defs.h" +#include "object-meta-end.h" }; + // // Modifier Visitors // @@ -257,12 +403,20 @@ struct ModifierVisitor : IModifierVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void* extra) override \ - { *(Result*)extra = ((Derived*) this)->visit(obj); } + { *(Result*)extra = ((Derived*) this)->visit##NAME(obj); } #include "object-meta-begin.h" #include "modifier-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + Result visit##NAME(NAME* obj) \ + { return ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "modifier-defs.h" +#include "object-meta-end.h" }; template<typename Derived> @@ -276,12 +430,20 @@ struct ModifierVisitor<Derived, void> : IModifierVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void*) override \ - { ((Derived*) this)->visit(obj); } + { ((Derived*) this)->visit##NAME(obj); } #include "object-meta-begin.h" #include "modifier-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + void visit##NAME(NAME* obj) \ + { ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "modifier-defs.h" +#include "object-meta-end.h" }; // @@ -299,8 +461,8 @@ struct IValVisitor : ITypeVisitor #include "object-meta-end.h" }; -template<typename Derived, typename Result = void> -struct ValVisitor : IValVisitor +template<typename Derived, typename Result = void, typename TypeResult = void> +struct ValVisitor : TypeVisitor<Derived, TypeResult, IValVisitor> { Result dispatch(Val* val) { @@ -312,17 +474,24 @@ struct ValVisitor : IValVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void* extra) override \ - { *(Result*)extra = ((Derived*) this)->visit(obj); } + { *(Result*)extra = ((Derived*) this)->visit##NAME(obj); } #include "object-meta-begin.h" #include "val-defs.h" -#include "type-defs.h" #include "object-meta-end.h" +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + Result visit##NAME(NAME* obj) \ + { return ((Derived*) this)->visit##BASE(obj); } + +#include "object-meta-begin.h" +#include "val-defs.h" +#include "object-meta-end.h" }; template<typename Derived> -struct ValVisitor<Derived, void> : IValVisitor +struct ValVisitor<Derived, void, void> : TypeVisitor<Derived, void, IValVisitor> { void dispatch(Val* val) { @@ -332,11 +501,19 @@ struct ValVisitor<Derived, void> : IValVisitor #define ABSTRACT_SYNTAX_CLASS(NAME,BASE) /* empty */ #define SYNTAX_CLASS(NAME, BASE) \ virtual void dispatch_##NAME(NAME* obj, void*) override \ - { ((Derived*) this)->visit(obj); } + { ((Derived*) this)->visit##NAME(obj); } + +#include "object-meta-begin.h" +#include "val-defs.h" +#include "object-meta-end.h" + +#define ABSTRACT_SYNTAX_CLASS(NAME,BASE) SYNTAX_CLASS(NAME, BASE) +#define SYNTAX_CLASS(NAME, BASE) \ + void visit##NAME(NAME* obj) \ + { ((Derived*) this)->visit##BASE(obj); } #include "object-meta-begin.h" #include "val-defs.h" -#include "type-defs.h" #include "object-meta-end.h" }; |
