Explorar o código

LibWeb: Add TreeNode<T>::next_in_pre_order(T* stay_within) variant

This is a scoped variant of the pre-order traversal helper that aborts
when attempting to leave the `stay_within` node.
Andreas Kling %!s(int64=3) %!d(string=hai) anos
pai
achega
9358f108c4
Modificáronse 1 ficheiros con 20 adicións e 0 borrados
  1. 20 0
      Userland/Libraries/LibWeb/TreeNode.h

+ 20 - 0
Userland/Libraries/LibWeb/TreeNode.h

@@ -140,11 +140,31 @@ public:
         return node;
     }
 
+    T* next_in_pre_order(T const* stay_within)
+    {
+        if (first_child())
+            return first_child();
+
+        T* node = static_cast<T*>(this);
+        T* next = nullptr;
+        while (!(next = node->next_sibling())) {
+            node = node->parent();
+            if (!node || node == stay_within)
+                return nullptr;
+        }
+        return next;
+    }
+
     T const* next_in_pre_order() const
     {
         return const_cast<TreeNode*>(this)->next_in_pre_order();
     }
 
+    T const* next_in_pre_order(T const* stay_within) const
+    {
+        return const_cast<TreeNode*>(this)->next_in_pre_order(stay_within);
+    }
+
     T* previous_in_pre_order()
     {
         if (auto* node = previous_sibling()) {