[libcxx-commits] [libcxx] [libc++] Simplify most of the segmented iterator optimizations (PR #164797)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Oct 23 08:15:28 PDT 2025
================
@@ -32,18 +29,23 @@ _LIBCPP_PUSH_MACROS
_LIBCPP_BEGIN_NAMESPACE_STD
-template <class _InputIterator,
- class _Size,
- class _Func,
- class _Proj,
- __enable_if_t<!__has_random_access_iterator_category<_InputIterator>::value &&
- _Or<integral_constant<bool, !__is_segmented_iterator_v<_InputIterator> >,
- _Not<__has_random_access_local_iterator<_InputIterator> > >::value,
- int> = 0>
+template <class _InputIterator, class _Size, class _Func, class _Proj>
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator
__for_each_n(_InputIterator __first, _Size __orig_n, _Func& __f, _Proj& __proj) {
typedef decltype(std::__convert_to_integral(__orig_n)) _IntegralSize;
_IntegralSize __n = __orig_n;
+
+#ifndef _LIBCPP_CXX03_LANG
+ if constexpr (__is_segmented_iterator_v<_InputIterator>) {
+ using __local_iterator = typename __segmented_iterator_traits<_InputIterator>::__local_iterator;
+ if constexpr (__has_random_access_iterator_category<__local_iterator>::value) {
+ return std::__for_each_n_segment(__first, __orig_n, [&](__local_iterator __lfirst, __local_iterator __llast) {
+ std::__for_each(__lfirst, __llast, __f, __proj);
+ });
+ }
----------------
ldionne wrote:
```suggestion
} else {
use for_each_segment
}
```
That preserves previous behaviour like my comment above.
https://github.com/llvm/llvm-project/pull/164797
More information about the libcxx-commits
mailing list