[libcxx-commits] [libcxx] [libc++] Optimize std::is_heap_until (PR #209141)

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Tue Jul 14 07:51:48 PDT 2026


================
@@ -12,37 +12,41 @@
 #include <__algorithm/comp.h>
 #include <__algorithm/comp_ref_type.h>
 #include <__config>
-#include <__iterator/iterator_traits.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
 #endif
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
-template <class _Compare, class _RandomAccessIterator>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _RandomAccessIterator
-__is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare&& __comp) {
-  typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
-  difference_type __len      = __last - __first;
-  difference_type __p        = 0;
-  difference_type __c        = 1;
-  _RandomAccessIterator __pp = __first;
-  while (__c < __len) {
-    _RandomAccessIterator __cp = __first + __c;
-    if (__comp(*__pp, *__cp))
-      return __cp;
-    ++__c;
-    ++__cp;
-    if (__c == __len)
-      return __last;
-    if (__comp(*__pp, *__cp))
-      return __cp;
-    ++__p;
-    ++__pp;
-    __c = 2 * __p + 1;
+template <class _Compare, class _Iter>
+_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter
+__is_heap_until(_Iter __first, _Iter __last, _Compare&& __comp) {
+  auto __count = __last - __first;
+
+  if (__count < 2)
+    return __last;
+
+  auto __parent_last = __first + (__count - 1) / 2;
----------------
ldionne wrote:

This needs a comment to explain exactly what it's pointing to. IIUC, something like:

```
// This points to one past the last parent that has two children.
// Integer division handles the case where the last parent has a single child.
```

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


More information about the libcxx-commits mailing list