void FlattenKind(const Kind k, const ASTVec &children, ASTVec & flat_children) { ASTVec::const_iterator ch_end = children.end(); for (ASTVec::const_iterator it = children.begin(); it != ch_end; it++) { Kind ck = it->GetKind(); if (k == ck) { FlattenKind(k,it->GetChildren(), flat_children); } else { flat_children.push_back(*it); } } }
/* Maintains a set of nodes that have already been seen. So that deeply shared * AND,OR operations are not * flattened multiple times. */ void FlattenKindNoDuplicates(const Kind k, const ASTVec& children, ASTVec& flat_children, ASTNodeSet& alreadyFlattened) { const ASTVec::const_iterator ch_end = children.end(); for (ASTVec::const_iterator it = children.begin(); it != ch_end; it++) { const Kind ck = it->GetKind(); if (k == ck) { if (alreadyFlattened.find(*it) == alreadyFlattened.end()) { alreadyFlattened.insert(*it); FlattenKindNoDuplicates(k, it->GetChildren(), flat_children, alreadyFlattened); } } else { flat_children.push_back(*it); } } }
// Flatten (k ... (k ci cj) ...) to (k ... ci cj ...) // This is local to this file. ASTVec FlattenKind(Kind k, const ASTVec &children) { ASTVec flat_children; ASTVec::const_iterator ch_end = children.end(); for (ASTVec::const_iterator it = children.begin(); it != ch_end; it++) { Kind ck = it->GetKind(); const ASTVec &gchildren = it->GetChildren(); if (k == ck) { // append grandchildren to children flat_children.insert(flat_children.end(), gchildren.begin(), gchildren.end()); } else { flat_children.push_back(*it); } } return flat_children; }