マクロ展開その後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や空中に散っていた。