From 68a0e16d1ec6c3ec7759681fd0be912ec193e892 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Sat, 17 Jan 2015 14:10:56 -0800 Subject: [PATCH] Add void specialization of RuleFn template --- src/compiler/rules/visitor.h | 53 ++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/compiler/rules/visitor.h b/src/compiler/rules/visitor.h index 66dfd4b2..7507e55d 100644 --- a/src/compiler/rules/visitor.h +++ b/src/compiler/rules/visitor.h @@ -90,6 +90,59 @@ class RuleFn : private Visitor { T value_; }; +template <> +class RuleFn : private Visitor { + public: + void apply(const rule_ptr &rule) { + rule->accept(this); + } + + protected: + virtual void default_apply(const Rule *rule) {} + + virtual void apply_to(const Blank *rule) { + return default_apply((const Rule *)rule); + } + virtual void apply_to(const CharacterSet *rule) { + return default_apply((const Rule *)rule); + } + virtual void apply_to(const Choice *rule) { + return default_apply((const Rule *)rule); + } + virtual void apply_to(const Metadata *rule) { + return default_apply((const Rule *)rule); + } + virtual void apply_to(const Pattern *rule) { + return default_apply((const Rule *)rule); + } + virtual void apply_to(const Repeat *rule) { + return default_apply((const Rule *)rule); + } + virtual void apply_to(const Seq *rule) { + return default_apply((const Rule *)rule); + } + virtual void apply_to(const String *rule) { + return default_apply((const Rule *)rule); + } + virtual void apply_to(const NamedSymbol *rule) { + return default_apply((const Rule *)rule); + } + virtual void apply_to(const Symbol *rule) { + return default_apply((const Rule *)rule); + } + + void visit(const Blank *rule) { apply_to(rule); } + void visit(const CharacterSet *rule) { apply_to(rule); } + void visit(const Choice *rule) { apply_to(rule); } + void visit(const Metadata *rule) { apply_to(rule); } + void visit(const Pattern *rule) { apply_to(rule); } + void visit(const Repeat *rule) { apply_to(rule); } + void visit(const Seq *rule) { apply_to(rule); } + void visit(const String *rule) { apply_to(rule); } + void visit(const NamedSymbol *rule) { apply_to(rule); } + void visit(const Symbol *rule) { apply_to(rule); } +}; + class IdentityRuleFn : public RuleFn { protected: virtual rule_ptr default_apply(const Rule *rule);