[libcxx-commits] [libcxx] [libc++] Refactor __tree::__find_equal to not have an out parameter (PR #147345)

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Tue Sep 2 10:55:30 PDT 2025


================
@@ -1685,92 +1681,85 @@ typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer& __tree<_Tp, _Co
   return __find_leaf_low(__parent, __v);
 }
 
-// Find place to insert if __v doesn't exist
-// Set __parent to parent of null leaf
-// Return reference to null leaf
-// If __v exists, set parent to node of __v and return reference to node of __v
+// Find __v
+// If __v exists, return the parent of the node of __v a reference to the pointer to the node of __v.
+// If __v doesn't exist, return the parent of the null leaf and a reference to the pointer to the null leaf.
 template <class _Tp, class _Compare, class _Allocator>
 template <class _Key>
-typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
-__tree<_Tp, _Compare, _Allocator>::__find_equal(__end_node_pointer& __parent, const _Key& __v) {
-  __node_pointer __nd           = __root();
-  __node_base_pointer* __nd_ptr = __root_ptr();
-  if (__nd != nullptr) {
-    while (true) {
-      if (value_comp()(__v, __nd->__get_value())) {
-        if (__nd->__left_ != nullptr) {
-          __nd_ptr = std::addressof(__nd->__left_);
-          __nd     = static_cast<__node_pointer>(__nd->__left_);
-        } else {
-          __parent = static_cast<__end_node_pointer>(__nd);
-          return __parent->__left_;
-        }
-      } else if (value_comp()(__nd->__get_value(), __v)) {
-        if (__nd->__right_ != nullptr) {
-          __nd_ptr = std::addressof(__nd->__right_);
-          __nd     = static_cast<__node_pointer>(__nd->__right_);
-        } else {
-          __parent = static_cast<__end_node_pointer>(__nd);
-          return __nd->__right_;
-        }
-      } else {
-        __parent = static_cast<__end_node_pointer>(__nd);
-        return *__nd_ptr;
-      }
+_LIBCPP_HIDE_FROM_ABI pair<typename __tree<_Tp, _Compare, _Allocator>::__end_node_pointer,
+                           typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&>
+__tree<_Tp, _Compare, _Allocator>::__find_equal(const _Key& __v) {
+  using _Pair = pair<__end_node_pointer, __node_base_pointer&>;
+
+  __node_pointer __nd = __root();
+
+  if (__nd == nullptr) {
+    auto __end = __end_node();
+    return _Pair(__end, __end->__left_);
+  }
+
+  __node_base_pointer* __node_ptr = __root_ptr();
+  while (true) {
+    if (value_comp()(__v, __nd->__get_value())) {
+      if (__nd->__left_ == nullptr)
+        return _Pair(static_cast<__end_node_pointer>(__nd), __nd->__left_);
+
+      __node_ptr = std::addressof(__nd->__left_);
+      __nd       = static_cast<__node_pointer>(__nd->__left_);
+    } else if (value_comp()(__nd->__get_value(), __v)) {
+      if (__nd->__right_ == nullptr)
+        return _Pair(static_cast<__end_node_pointer>(__nd), __nd->__right_);
+
+      __node_ptr = std::addressof(__nd->__right_);
+      __nd       = static_cast<__node_pointer>(__nd->__right_);
+    } else {
+      return _Pair(static_cast<__end_node_pointer>(__nd), *__node_ptr);
     }
   }
-  __parent = __end_node();
-  return __parent->__left_;
 }
 
-// Find place to insert if __v doesn't exist
+// Find __v
 // First check prior to __hint.
 // Next check after __hint.
 // Next do O(log N) search.
-// Set __parent to parent of null leaf
-// Return reference to null leaf
-// If __v exists, set parent to node of __v and return reference to node of __v
+// If __v exists, return the parent of the node of __v a reference to the pointer to the node of __v.
----------------
ldionne wrote:

```suggestion
// If __v exists, return the parent of the node of __v and a reference to the pointer to the node of __v.
```

https://github.com/llvm/llvm-project/pull/147345


More information about the libcxx-commits mailing list