summaryrefslogtreecommitdiff
path: root/Libraries/LibHTML/Layout/LayoutNode.h
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LibHTML/Layout/LayoutNode.h')
-rw-r--r--Libraries/LibHTML/Layout/LayoutNode.h52
1 files changed, 52 insertions, 0 deletions
diff --git a/Libraries/LibHTML/Layout/LayoutNode.h b/Libraries/LibHTML/Layout/LayoutNode.h
index 507c14c2fe..e515de53d2 100644
--- a/Libraries/LibHTML/Layout/LayoutNode.h
+++ b/Libraries/LibHTML/Layout/LayoutNode.h
@@ -85,6 +85,18 @@ public:
bool children_are_inline() const { return m_children_are_inline; }
void set_children_are_inline(bool value) { m_children_are_inline = value; }
+ template<typename U>
+ const U* next_sibling_of_type() const;
+
+ template<typename U>
+ U* next_sibling_of_type();
+
+ template<typename T>
+ const T* first_child_of_type() const;
+
+ template<typename T>
+ T* first_child_of_type();
+
protected:
explicit LayoutNode(const Node*);
@@ -196,3 +208,43 @@ inline T& to(LayoutNode& node)
ASSERT(is<T>(node));
return static_cast<T&>(node);
}
+
+template<typename T>
+inline const T* LayoutNode::next_sibling_of_type() const
+{
+ for (auto* sibling = next_sibling(); sibling; sibling = sibling->next_sibling()) {
+ if (is<T>(*sibling))
+ return &to<T>(*sibling);
+ }
+ return nullptr;
+}
+
+template<typename T>
+inline T* LayoutNode::next_sibling_of_type()
+{
+ for (auto* sibling = next_sibling(); sibling; sibling = sibling->next_sibling()) {
+ if (is<T>(*sibling))
+ return &to<T>(*sibling);
+ }
+ return nullptr;
+}
+
+template<typename T>
+inline const T* LayoutNode::first_child_of_type() const
+{
+ for (auto* child = first_child(); child; child = child->next_sibling()) {
+ if (is<T>(*child))
+ return &to<T>(*child);
+ }
+ return nullptr;
+}
+
+template<typename T>
+inline T* LayoutNode::first_child_of_type()
+{
+ for (auto* child = first_child(); child; child = child->next_sibling()) {
+ if (is<T>(*child))
+ return &to<T>(*child);
+ }
+ return nullptr;
+}