1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
/* $Id$
* vim:tabstop=8:shiftwidth=8:filetype=cpp:textwidth=72:
* Visitor: base class for all visitors.
*
* Copyright (C) 2007-2009 FAUmachine Team <info@faumachine.org>.
* This program is free software. You can redistribute it and/or modify it
* under the terms of the GNU General Public License, either version 2 of
* the License, or (at your option) any later version. See COPYING.
*/
#include <iostream>
#include <sstream>
#include <cassert>
namespace ast {
template <typename T>
void
Visitor::listTraverse(const T &l)
{
for (typename T::const_iterator i = l.begin(); i != l.end(); i++) {
assert(*i);
(*i)->accept(*this);
}
}
template <typename T>
void
Visitor::listTraverse(T &l, bool &deleteFlag)
{
typename T::iterator i=l.begin();
while (i != l.end()) {
assert(*i);
(*i)->accept(*this);
if (deleteFlag) {
i = l.erase(i);
deleteFlag = false;
continue;
}
i++;
}
}
template <typename T>
void
Visitor::listTraverse(T &l, bool &replaceFlag, T &replace)
{
typename T::iterator i=l.begin();
while (i != l.end()) {
assert(*i);
(*i)->accept(*this);
if (replaceFlag) {
i = l.erase(i);
l.insert(i, replace.begin(), replace.end());
replace.clear();
replaceFlag = false;
continue;
}
i++;
}
}
template <typename T>
void
Visitor::listTraverse(T &l, T &insert)
{
for (typename T::iterator i = l.begin(); i != l.end(); i++) {
assert(*i);
(*i)->accept(*this);
if (! insert.empty()) {
l.insert(i, insert.begin(), insert.end());
insert.clear();
}
}
}
}; /* namespace ast */
|