diff --git a/AK/IntrusiveRedBlackTree.h b/AK/IntrusiveRedBlackTree.h index 1a40804536..6b1442f1fc 100644 --- a/AK/IntrusiveRedBlackTree.h +++ b/AK/IntrusiveRedBlackTree.h @@ -55,6 +55,14 @@ public: return node_to_value(*node); } + Container find_smallest_not_below(K key) + { + auto* node = static_cast(BaseTree::find_smallest_not_below(this->m_root, key)); + if (!node) + return nullptr; + return node_to_value(*node); + } + void insert(K key, V& value) { auto& node = value.*member; @@ -208,6 +216,7 @@ class IntrusiveRedBlackTree, member> : public IntrusiveRe public: [[nodiscard]] NonnullRefPtr find(K key) const { return IntrusiveRedBlackTree, member>::find(key).release_nonnull(); } [[nodiscard]] NonnullRefPtr find_largest_not_above(K key) const { return IntrusiveRedBlackTree, member>::find_largest_not_above(key).release_nonnull(); } + [[nodiscard]] NonnullRefPtr find_smallest_not_below(K key) const { return IntrusiveRedBlackTree, member>::find_smallest_not_below(key).release_nonnull(); } }; } diff --git a/AK/RedBlackTree.h b/AK/RedBlackTree.h index 11994bd4b4..8106b70d99 100644 --- a/AK/RedBlackTree.h +++ b/AK/RedBlackTree.h @@ -467,6 +467,14 @@ public: return &node->value; } + [[nodiscard]] V* find_smallest_not_below(K key) + { + auto* node = static_cast(BaseTree::find_smallest_not_below(this->m_root, key)); + if (!node) + return nullptr; + return &node->value; + } + ErrorOr try_insert(K key, V const& value) { return try_insert(key, V(value));