Skip to content

Commit 085c6b6

Browse files
committed
Revert "[libc++] Backport segmented iterator optimization for std::for_each to C++11 (llvm#134960)"
This reverts commit e9280a1.
1 parent dfdc50b commit 085c6b6

File tree

15 files changed

+163
-277
lines changed

15 files changed

+163
-277
lines changed

libcxx/docs/ReleaseNotes/21.rst

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,6 @@ Improvements and New Features
6767
- The ``std::stable_sort`` algorithm uses radix sort for floating-point types now, which can improve the performance
6868
up to 10x, depending on type of sorted elements and the initial state of the sorted array.
6969

70-
- The segmented iterator optimization for ``std::for_each`` has been backported to C++11. Previously it was only available
71-
in C++23 and later.
72-
7370
Deprecations and Removals
7471
-------------------------
7572

libcxx/include/__algorithm/for_each.h

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,40 +13,44 @@
1313
#include <__algorithm/for_each_segment.h>
1414
#include <__config>
1515
#include <__iterator/segmented_iterator.h>
16-
#include <__type_traits/enable_if.h>
16+
#include <__ranges/movable_box.h>
17+
#include <__utility/in_place.h>
18+
#include <__utility/move.h>
1719

1820
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1921
# pragma GCC system_header
2022
#endif
2123

24+
_LIBCPP_PUSH_MACROS
25+
#include <__undef_macros>
26+
2227
_LIBCPP_BEGIN_NAMESPACE_STD
2328

24-
template <class _InputIterator, class _Sent, class _Func>
25-
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __for_each(_InputIterator __first, _Sent __last, _Func& __f) {
29+
template <class _InputIterator, class _Function>
30+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Function
31+
for_each(_InputIterator __first, _InputIterator __last, _Function __f) {
2632
for (; __first != __last; ++__first)
2733
__f(*__first);
34+
return __f;
2835
}
2936

30-
#ifndef _LIBCPP_CXX03_LANG
31-
template <class _SegmentedIterator,
32-
class _Function,
33-
__enable_if_t<__is_segmented_iterator<_SegmentedIterator>::value, int> = 0>
34-
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void
35-
__for_each(_SegmentedIterator __first, _SegmentedIterator __last, _Function& __func) {
36-
using __local_iterator_t = typename __segmented_iterator_traits<_SegmentedIterator>::__local_iterator;
37-
std::__for_each_segment(__first, __last, [&](__local_iterator_t __lfirst, __local_iterator_t __llast) {
38-
std::__for_each(__lfirst, __llast, __func);
37+
// __movable_box is available in C++20, but is actually a copyable-box, so optimization is only correct in C++23
38+
#if _LIBCPP_STD_VER >= 23
39+
template <class _SegmentedIterator, class _Function>
40+
requires __is_segmented_iterator<_SegmentedIterator>::value
41+
_LIBCPP_HIDE_FROM_ABI constexpr _Function
42+
for_each(_SegmentedIterator __first, _SegmentedIterator __last, _Function __func) {
43+
ranges::__movable_box<_Function> __wrapped_func(in_place, std::move(__func));
44+
std::__for_each_segment(__first, __last, [&](auto __lfirst, auto __llast) {
45+
__wrapped_func =
46+
ranges::__movable_box<_Function>(in_place, std::for_each(__lfirst, __llast, std::move(*__wrapped_func)));
3947
});
48+
return std::move(*__wrapped_func);
4049
}
41-
#endif // !_LIBCPP_CXX03_LANG
42-
43-
template <class _InputIterator, class _Function>
44-
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Function
45-
for_each(_InputIterator __first, _InputIterator __last, _Function __f) {
46-
std::__for_each(__first, __last, __f);
47-
return __f;
48-
}
50+
#endif // _LIBCPP_STD_VER >= 23
4951

5052
_LIBCPP_END_NAMESPACE_STD
5153

54+
_LIBCPP_POP_MACROS
55+
5256
#endif // _LIBCPP___ALGORITHM_FOR_EACH_H

libcxx/include/algorithm

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2061,7 +2061,6 @@ template <class BidirectionalIterator, class Compare>
20612061
# include <cstring>
20622062
# include <iterator>
20632063
# include <memory>
2064-
# include <optional>
20652064
# include <stdexcept>
20662065
# include <type_traits>
20672066
# include <utility>

libcxx/include/array

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,6 @@ _LIBCPP_POP_MACROS
566566
# include <cstdlib>
567567
# include <iterator>
568568
# include <new>
569-
# include <optional>
570569
# include <type_traits>
571570
# include <utility>
572571
# endif

libcxx/include/bitset

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -973,7 +973,6 @@ _LIBCPP_POP_MACROS
973973
# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
974974
# include <concepts>
975975
# include <cstdlib>
976-
# include <optional>
977976
# include <type_traits>
978977
# endif
979978
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)

libcxx/include/codecvt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,6 @@ _LIBCPP_END_NAMESPACE_STD
596596
# include <limits>
597597
# include <mutex>
598598
# include <new>
599-
# include <optional>
600599
# include <stdexcept>
601600
# include <type_traits>
602601
# include <typeinfo>

libcxx/include/condition_variable

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,6 @@ _LIBCPP_POP_MACROS
357357
# include <initializer_list>
358358
# include <iosfwd>
359359
# include <new>
360-
# include <optional>
361360
# include <stdexcept>
362361
# include <system_error>
363362
# include <type_traits>

libcxx/include/ios

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -887,7 +887,6 @@ _LIBCPP_POP_MACROS
887887
# include <limits>
888888
# include <mutex>
889889
# include <new>
890-
# include <optional>
891890
# include <stdexcept>
892891
# include <system_error>
893892
# include <type_traits>

libcxx/include/locale

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3692,7 +3692,6 @@ _LIBCPP_POP_MACROS
36923692
# include <cstdarg>
36933693
# include <iterator>
36943694
# include <mutex>
3695-
# include <optional>
36963695
# include <stdexcept>
36973696
# include <type_traits>
36983697
# include <typeinfo>

libcxx/include/streambuf

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,6 @@ _LIBCPP_POP_MACROS
386386

387387
# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
388388
# include <cstdint>
389-
# include <optional>
390389
# endif
391390
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
392391

0 commit comments

Comments
 (0)