From b4c8ce3dc40c5b21a8510a713456e2b92c66ce21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Sun, 4 Jun 2017 21:59:19 +0200 Subject: [PATCH] Extended AST visitors with optional return type. --- include/anthem/ASTVisitors.h | 44 ++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/include/anthem/ASTVisitors.h b/include/anthem/ASTVisitors.h index b7c8658..b9b08fc 100644 --- a/include/anthem/ASTVisitors.h +++ b/include/anthem/ASTVisitors.h @@ -15,11 +15,11 @@ namespace ast //////////////////////////////////////////////////////////////////////////////////////////////////// // TODO: refactor -template +template struct RecursiveFormulaVisitor { template - void visit(And &and_, Formula &formula, Arguments &&... arguments) + ReturnType visit(And &and_, Formula &formula, Arguments &&... arguments) { for (auto &argument : and_.arguments) argument.accept(*this, argument, std::forward(arguments)...); @@ -28,7 +28,7 @@ struct RecursiveFormulaVisitor } template - void visit(Biconditional &biconditional, Formula &formula, Arguments &&... arguments) + ReturnType visit(Biconditional &biconditional, Formula &formula, Arguments &&... arguments) { biconditional.left.accept(*this, biconditional.left, std::forward(arguments)...); biconditional.right.accept(*this, biconditional.right, std::forward(arguments)...); @@ -37,19 +37,19 @@ struct RecursiveFormulaVisitor } template - void visit(Boolean &boolean, Formula &formula, Arguments &&... arguments) + ReturnType visit(Boolean &boolean, Formula &formula, Arguments &&... arguments) { return T::accept(boolean, formula, std::forward(arguments)...); } template - void visit(Comparison &comparison, Formula &formula, Arguments &&... arguments) + ReturnType visit(Comparison &comparison, Formula &formula, Arguments &&... arguments) { return T::accept(comparison, formula, std::forward(arguments)...); } template - void visit(Exists &exists, Formula &formula, Arguments &&... arguments) + ReturnType visit(Exists &exists, Formula &formula, Arguments &&... arguments) { exists.argument.accept(*this, exists.argument, std::forward(arguments)...); @@ -57,7 +57,7 @@ struct RecursiveFormulaVisitor } template - void visit(ForAll &forAll, Formula &formula, Arguments &&... arguments) + ReturnType visit(ForAll &forAll, Formula &formula, Arguments &&... arguments) { forAll.argument.accept(*this, forAll.argument, std::forward(arguments)...); @@ -65,7 +65,7 @@ struct RecursiveFormulaVisitor } template - void visit(Implies &implies, Formula &formula, Arguments &&... arguments) + ReturnType visit(Implies &implies, Formula &formula, Arguments &&... arguments) { implies.antecedent.accept(*this, implies.antecedent, std::forward(arguments)...); implies.consequent.accept(*this, implies.consequent, std::forward(arguments)...); @@ -74,13 +74,13 @@ struct RecursiveFormulaVisitor } template - void visit(In &in, Formula &formula, Arguments &&... arguments) + ReturnType visit(In &in, Formula &formula, Arguments &&... arguments) { return T::accept(in, formula, std::forward(arguments)...); } template - void visit(Not ¬_, Formula &formula, Arguments &&... arguments) + ReturnType visit(Not ¬_, Formula &formula, Arguments &&... arguments) { not_.argument.accept(*this, not_.argument, std::forward(arguments)...); @@ -88,7 +88,7 @@ struct RecursiveFormulaVisitor } template - void visit(Or &or_, Formula &formula, Arguments &&... arguments) + ReturnType visit(Or &or_, Formula &formula, Arguments &&... arguments) { for (auto &argument : or_.arguments) argument.accept(*this, argument, std::forward(arguments)...); @@ -97,7 +97,7 @@ struct RecursiveFormulaVisitor } template - void visit(Predicate &predicate, Formula &formula, Arguments &&... arguments) + ReturnType visit(Predicate &predicate, Formula &formula, Arguments &&... arguments) { return T::accept(predicate, formula, std::forward(arguments)...); } @@ -105,12 +105,12 @@ struct RecursiveFormulaVisitor //////////////////////////////////////////////////////////////////////////////////////////////////// -template +template struct RecursiveTermVisitor { // TODO: return type is incorrect template - void visit(BinaryOperation &binaryOperation, Term &term, Arguments &&... arguments) + ReturnType visit(BinaryOperation &binaryOperation, Term &term, Arguments &&... arguments) { binaryOperation.left.accept(*this, binaryOperation.left, std::forward(arguments)...); binaryOperation.right.accept(*this, binaryOperation.left, std::forward(arguments)...); @@ -119,19 +119,19 @@ struct RecursiveTermVisitor } template - void visit(Boolean &boolean, Term &term, Arguments &&... arguments) + ReturnType visit(Boolean &boolean, Term &term, Arguments &&... arguments) { return T::accept(boolean, term, std::forward(arguments)...); } template - void visit(Constant &constant, Term &term, Arguments &&... arguments) + ReturnType visit(Constant &constant, Term &term, Arguments &&... arguments) { return T::accept(constant, term, std::forward(arguments)...); } template - void visit(Function &function, Term &term, Arguments &&... arguments) + ReturnType visit(Function &function, Term &term, Arguments &&... arguments) { for (auto &argument : function.arguments) argument.accept(*this, argument, std::forward(arguments)...); @@ -140,13 +140,13 @@ struct RecursiveTermVisitor } template - void visit(Integer &integer, Term &term, Arguments &&... arguments) + ReturnType visit(Integer &integer, Term &term, Arguments &&... arguments) { return T::accept(integer, term, std::forward(arguments)...); } template - void visit(Interval &interval, Term &term, Arguments &&... arguments) + ReturnType visit(Interval &interval, Term &term, Arguments &&... arguments) { interval.from.accept(*this, interval.from, std::forward(arguments)...); interval.to.accept(*this, interval.to, std::forward(arguments)...); @@ -155,19 +155,19 @@ struct RecursiveTermVisitor } template - void visit(SpecialInteger &specialInteger, Term &term, Arguments &&... arguments) + ReturnType visit(SpecialInteger &specialInteger, Term &term, Arguments &&... arguments) { return T::accept(specialInteger, term, std::forward(arguments)...); } template - void visit(String &string, Term &term, Arguments &&... arguments) + ReturnType visit(String &string, Term &term, Arguments &&... arguments) { return T::accept(string, term, std::forward(arguments)...); } template - void visit(Variable &variable, Term &term, Arguments &&... arguments) + ReturnType visit(Variable &variable, Term &term, Arguments &&... arguments) { return T::accept(variable, term, std::forward(arguments)...); }