Skip to content

Commit 383595a

Browse files
committed
Make for_each segmented iterator optimization valid for C++03
1 parent 9761e7b commit 383595a

File tree

2 files changed

+4
-2
lines changed

2 files changed

+4
-2
lines changed

libcxx/include/__algorithm/for_each_n.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <__algorithm/for_each_n_segment.h>
1515
#include <__config>
1616
#include <__iterator/iterator_traits.h>
17+
#include <__iterator/next.h>
1718
#include <__iterator/segmented_iterator.h>
1819
#include <__type_traits/disjunction.h>
1920
#include <__type_traits/enable_if.h>

libcxx/include/__algorithm/ranges_for_each_n.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <__iterator/concepts.h>
1919
#include <__iterator/incrementable_traits.h>
2020
#include <__iterator/iterator_traits.h>
21+
#include <__iterator/next.h>
2122
#include <__iterator/projected.h>
2223
#include <__ranges/concepts.h>
2324
#include <__utility/move.h>
@@ -42,8 +43,8 @@ struct __for_each_n {
4243
template <input_iterator _Iter, class _Proj = identity, indirectly_unary_invocable<projected<_Iter, _Proj>> _Func>
4344
_LIBCPP_HIDE_FROM_ABI constexpr for_each_n_result<_Iter, _Func>
4445
operator()(_Iter __first, iter_difference_t<_Iter> __count, _Func __func, _Proj __proj = {}) const {
45-
if constexpr (random_access_iterator<_Iter>) {
46-
auto __last = __first + __count;
46+
if constexpr (forward_iterator<_Iter>) {
47+
auto __last = std::ranges::next(__first, __count);
4748
auto __f = [&](auto&& __val) { std::invoke(__func, std::invoke(__proj, __val)); };
4849
std::__for_each<_RangeAlgPolicy>(__first, __last, __f);
4950
return {std::move(__last), std::move(__func)};

0 commit comments

Comments
 (0)