From ff5b696569bab1ef5c03cc8ed8c10da4fffb26e1 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Tue, 20 Jan 2015 11:06:02 +0100 Subject: [PATCH] vhdlpp: Improved SequentialStmt visitor. --- vhdlpp/sequential.cc | 18 +++++++++--------- vhdlpp/sequential.h | 21 +++++++++++++++------ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/vhdlpp/sequential.cc b/vhdlpp/sequential.cc index f5d4509eb..85b874a83 100644 --- a/vhdlpp/sequential.cc +++ b/vhdlpp/sequential.cc @@ -21,7 +21,7 @@ # include "expression.h" template -inline static void visit_stmt_list(std::list& stmts, void((*func))(SequentialStmt*)) +inline static void visit_stmt_list(std::list& stmts, SeqStmtVisitor& func) { for(typename std::list::iterator it = stmts.begin(); it != stmts.end(); ++it) { (*it)->visit(func); @@ -83,12 +83,12 @@ void IfSequential::extract_false(std::list&that) } } -void IfSequential::visit(void((*func))(SequentialStmt*)) +void IfSequential::visit(SeqStmtVisitor& func) { visit_stmt_list(if_, func); visit_stmt_list(elsif_, func); visit_stmt_list(else_, func); - ((*func))(this); + func(this); } IfSequential::Elsif::Elsif(Expression*cond, std::list*tr) @@ -107,7 +107,7 @@ IfSequential::Elsif::~Elsif() } } -void IfSequential::Elsif::visit(void((*func))(SequentialStmt*)) +void IfSequential::Elsif::visit(SeqStmtVisitor& func) { visit_stmt_list(if_, func); } @@ -139,10 +139,10 @@ CaseSeqStmt::~CaseSeqStmt() } } -void CaseSeqStmt::visit(void((*func))(SequentialStmt*)) +void CaseSeqStmt::visit(SeqStmtVisitor& func) { visit_stmt_list(alt_, func); - ((*func))(this); + func(this); } CaseSeqStmt::CaseStmtAlternative::CaseStmtAlternative(Expression* exp, list* stmts) @@ -161,7 +161,7 @@ CaseSeqStmt::CaseStmtAlternative::~CaseStmtAlternative() } } -void CaseSeqStmt::CaseStmtAlternative::visit(void((*func))(SequentialStmt*)) +void CaseSeqStmt::CaseStmtAlternative::visit(SeqStmtVisitor& func) { visit_stmt_list(stmts_, func); } @@ -210,10 +210,10 @@ LoopStatement::~LoopStatement() } } -void LoopStatement::visit(void((*func))(SequentialStmt*)) +void LoopStatement::visit(SeqStmtVisitor& func) { visit_stmt_list(stmts_, func); - (*func)(this); + func(this); } ForLoopStatement::ForLoopStatement(perm_string scope_name, perm_string it, prange_t* range, list* stmts) diff --git a/vhdlpp/sequential.h b/vhdlpp/sequential.h index 881c9b002..387041b70 100644 --- a/vhdlpp/sequential.h +++ b/vhdlpp/sequential.h @@ -23,10 +23,17 @@ # include "LineInfo.h" # include "parse_types.h" # include +# include class Architecture; class Entity; class Expression; +class SequentialStmt; + +struct SeqStmtVisitor { + virtual ~SeqStmtVisitor() {}; + virtual void operator() (SequentialStmt*s) = 0; +}; class SequentialStmt : public LineInfo { @@ -38,7 +45,9 @@ class SequentialStmt : public LineInfo { virtual int elaborate(Entity*ent, Architecture*arc); virtual int emit(ostream&out, Entity*entity, Architecture*arc); virtual void dump(ostream&out, int indent) const; - virtual void visit(void(*func)(SequentialStmt*)) { (*func)(this); } + + // Recursively visits a tree of sequential statements. + virtual void visit(SeqStmtVisitor& func) { func(this); } }; /* @@ -53,7 +62,7 @@ class LoopStatement : public SequentialStmt { inline perm_string loop_name() const { return name_; } void dump(ostream&out, int indent) const; - void visit(void(*func)(SequentialStmt*)); + void visit(SeqStmtVisitor& func); protected: int elaborate_substatements(Entity*ent, Architecture*arc); @@ -77,7 +86,7 @@ class IfSequential : public SequentialStmt { int statement_emit(ostream&out, Entity*entity, Architecture*arc); void dump(ostream&out, int indent) const; - void visit(void(*func)(SequentialStmt*)); + void visit(SeqStmtVisitor& func); private: Expression*cond_; @@ -97,7 +106,7 @@ class IfSequential : public SequentialStmt { int elaborate(Entity*ent, Architecture*arc); int emit(ostream&out, Entity*entity, Architecture*arc); void dump(ostream&out, int indent) const; - void visit(void(*func)(SequentialStmt*)); + void visit(SeqStmtVisitor& func); const Expression*peek_condition() const { return cond_; } @@ -155,7 +164,7 @@ class CaseSeqStmt : public SequentialStmt { int elaborate_expr(Entity*ent, Architecture*arc, const VType*ltype); int elaborate(Entity*ent, Architecture*arc); int emit(ostream&out, Entity*entity, Architecture*arc); - void visit(void(*func)(SequentialStmt*)); + void visit(SeqStmtVisitor& func); private: Expression* exp_; @@ -173,7 +182,7 @@ class CaseSeqStmt : public SequentialStmt { void dump(ostream&out, int indent) const; int elaborate(Entity*ent, Architecture*arc); int emit(ostream&out, Entity*entity, Architecture*arc); - void visit(void(*func)(SequentialStmt*)); + void visit(SeqStmtVisitor& func); private: Expression* cond_;