Node* previousSkippingChildrenPostOrder(const Node* current, const Node* stayWithin) { if (current == stayWithin) return 0; if (current->previousSibling()) return current->previousSibling(); return previousAncestorSiblingPostOrder(current, stayWithin); }
Node* NodeTraversal::previousPostOrder(const Node& current, const Node* stayWithin) { if (current.lastChild()) return current.lastChild(); if (current == stayWithin) return 0; if (current.previousSibling()) return current.previousSibling(); return previousAncestorSiblingPostOrder(current, stayWithin); }
// TODO(yosin) We should consider introducing template class to share code // between DOM tree traversal and flat tree tarversal. Node* FlatTreeTraversal::previousPostOrder(const Node& current, const Node* stayWithin) { assertPrecondition(current); if (stayWithin) assertPrecondition(*stayWithin); if (Node* lastChild = traverseLastChild(current)) { assertPostcondition(lastChild); return lastChild; } if (current == stayWithin) return nullptr; if (Node* previousSibling = traversePreviousSibling(current)) { assertPostcondition(previousSibling); return previousSibling; } return previousAncestorSiblingPostOrder(current, stayWithin); }