Explorar o código

LibHTML: Add TreeNode::next_in_pre_order()

This function allows you to traverse in pre-order without recursing.
Andreas Kling %!s(int64=5) %!d(string=hai) anos
pai
achega
1466a7364c
Modificáronse 1 ficheiros con 20 adicións e 0 borrados
  1. 20 0
      Libraries/LibHTML/TreeNode.h

+ 20 - 0
Libraries/LibHTML/TreeNode.h

@@ -53,6 +53,26 @@ public:
 
 
     bool is_child_allowed(const T&) const { return true; }
     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<TreeNode*>(this)->next_in_pre_order();
+    }
+
     template<typename Callback>
     template<typename Callback>
     IterationDecision for_each_in_subtree(Callback callback) const
     IterationDecision for_each_in_subtree(Callback callback) const
     {
     {