vhdlpp: Improved SequentialStmt visitor.

This commit is contained in:
Maciej Suminski 2015-01-20 11:06:02 +01:00
parent b05a19dffc
commit ff5b696569
2 changed files with 24 additions and 15 deletions

View File

@ -21,7 +21,7 @@
# include "expression.h"
template<typename T>
inline static void visit_stmt_list(std::list<T*>& stmts, void((*func))(SequentialStmt*))
inline static void visit_stmt_list(std::list<T*>& stmts, SeqStmtVisitor& func)
{
for(typename std::list<T*>::iterator it = stmts.begin(); it != stmts.end(); ++it) {
(*it)->visit(func);
@ -83,12 +83,12 @@ void IfSequential::extract_false(std::list<SequentialStmt*>&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<SequentialStmt*>*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<SequentialStmt*>* 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<SequentialStmt*>* stmts)

View File

@ -23,10 +23,17 @@
# include "LineInfo.h"
# include "parse_types.h"
# include <list>
# include <functional>
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_;