From e56c56128b7d693316ee65e2041b23be64f02c4f Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 6 Apr 2021 18:49:02 +0100 Subject: [PATCH] LibWeb: Add non-inclusive variants of subtree traversal --- Userland/Libraries/LibWeb/TreeNode.h | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Userland/Libraries/LibWeb/TreeNode.h b/Userland/Libraries/LibWeb/TreeNode.h index f37b18ebc0..0de95a93ce 100644 --- a/Userland/Libraries/LibWeb/TreeNode.h +++ b/Userland/Libraries/LibWeb/TreeNode.h @@ -191,6 +191,46 @@ public: return IterationDecision::Continue; } + template + IterationDecision for_each_in_subtree(Callback callback) const + { + for (auto* child = first_child(); child; child = child->next_sibling()) { + if (child->for_each_in_inclusive_subtree(callback) == IterationDecision::Break) + return IterationDecision::Break; + } + return IterationDecision::Continue; + } + + template + IterationDecision for_each_in_subtree(Callback callback) + { + for (auto* child = first_child(); child; child = child->next_sibling()) { + if (child->for_each_in_inclusive_subtree(callback) == IterationDecision::Break) + return IterationDecision::Break; + } + return IterationDecision::Continue; + } + + template + IterationDecision for_each_in_subtree_of_type(Callback callback) + { + for (auto* child = first_child(); child; child = child->next_sibling()) { + if (child->template for_each_in_inclusive_subtree_of_type(callback) == IterationDecision::Break) + return IterationDecision::Break; + } + return IterationDecision::Continue; + } + + template + IterationDecision for_each_in_subtree_of_type(Callback callback) const + { + for (auto* child = first_child(); child; child = child->next_sibling()) { + if (child->template for_each_in_inclusive_subtree_of_type(callback) == IterationDecision::Break) + return IterationDecision::Break; + } + return IterationDecision::Continue; + } + template void for_each_child(Callback callback) const {