From 1466a7364c1b0b3ff3c7fdd2af3a45a068d72c6e Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 5 Nov 2019 18:36:06 +0100 Subject: [PATCH] LibHTML: Add TreeNode::next_in_pre_order() This function allows you to traverse in pre-order without recursing. --- Libraries/LibHTML/TreeNode.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Libraries/LibHTML/TreeNode.h b/Libraries/LibHTML/TreeNode.h index d368b6c347..8461fd3160 100644 --- a/Libraries/LibHTML/TreeNode.h +++ b/Libraries/LibHTML/TreeNode.h @@ -53,6 +53,26 @@ public: bool is_child_allowed(const T&) const { return true; } + T* next_in_pre_order() + { + if (first_child()) + return first_child(); + T* node; + if (!(node = next_sibling())) { + node = parent(); + while (node && !node->next_sibling()) + node = node->parent(); + if (node) + node = node->next_sibling(); + } + return node; + } + + const T* next_in_pre_order() const + { + return const_cast(this)->next_in_pre_order(); + } + template IterationDecision for_each_in_subtree(Callback callback) const {