マクロ展開その後2

以下の様な関数を書いた。

int MacroFilter::foreachNode(Node* root, bool (Node::*match)() const, int (MacroFilter::*func)(Node* root, Node* node))
{
    int ret = 0;
    if (root->isNodes())
    {
        // don't use iterator
        for (Nodes::size_type i = 0; i < root->nodes.size(); i++)
        {
            Node* node = root->nodes[i];
            if ((node->*match)())
            {
                ret += (this->*func)(root, node);
            }

            ret += foreachNode(node, match, func);
        }
    }
    return ret;
}

int MacroFilter::foreachSymbols(Node* root, int (MacroFilter::*f)(Node* root, Node* node))
{
    return foreachNode(root, &Node::isSymbol, f);
}

int MacroFilter::foreachNodes(Node* root, int (MacroFilter::*f)(Node*root, Node* node))
{
    return foreachNode(root, &Node::isNodes, f);
}

テストを通り、構造がきれいになった。
(MacroFilter::*func) が副作用バリバリなのだけどしようがない。明日はリファクタリング
このコードらのために、たくさんのコードを書いては捨て書いては捨てした。
彼らは、エディタのundo履歴や、kill-ringや、svn-diffや空中に散っていた。