Skip to content

Commit ea3a23f

Browse files
Switch to use ranges::for_each
1 parent ed3a7f7 commit ea3a23f

File tree

1 file changed

+18
-17
lines changed
  • libcxx/include/__ranges

1 file changed

+18
-17
lines changed

libcxx/include/__ranges/to.h

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#ifndef _LIBCPP___RANGES_TO_H
1111
#define _LIBCPP___RANGES_TO_H
1212

13+
#include <__algorithm/ranges_for_each.h>
1314
#include <__concepts/constructible.h>
1415
#include <__concepts/convertible_to.h>
1516
#include <__concepts/derived_from.h>
@@ -70,6 +71,22 @@ concept __constructible_from_iter_pair =
7071
derived_from<typename iterator_traits<iterator_t<_Range>>::iterator_category, input_iterator_tag> &&
7172
constructible_from<_Container, iterator_t<_Range>, sentinel_t<_Range>, _Args...>;
7273

74+
template <class _Container>
75+
constexpr auto __container_append(_Container& __c) {
76+
return [&__c]<class _Ref>(_Ref&& __ref) {
77+
if constexpr (requires { __c.emplace_back(std::declval<_Ref>()); })
78+
__c.emplace_back(std::forward<_Ref>(__ref));
79+
else if constexpr (requires { __c.push_back(std::declval<_Ref>()); })
80+
__c.push_back(std::forward<_Ref>(__ref));
81+
else if constexpr (requires { __c.emplace(__c.end(), std::declval<_Ref>()); })
82+
__c.emplace(__c.end(), std::forward<_Ref>(__ref));
83+
else {
84+
static_assert(requires { __c.insert(__c.end(), std::declval<_Ref>()); });
85+
__c.insert(__c.end(), std::forward<_Ref>(__ref));
86+
}
87+
};
88+
}
89+
7390
template <class>
7491
concept __always_false = false;
7592

@@ -109,24 +126,8 @@ template <class _Container, input_range _Range, class... _Args>
109126
__result.reserve(static_cast<range_size_t<_Container>>(ranges::size(__range)));
110127
}
111128

112-
auto __iter = ranges::begin(__range);
113-
auto __sent = ranges::end(__range);
114-
for (; __iter != __sent; ++__iter) {
115-
auto&& __ref = *__iter;
116-
using _Ref = decltype(__ref);
117-
if constexpr (requires { __result.emplace_back(std::declval<_Ref>()); }) {
118-
__result.emplace_back(std::forward<_Ref>(__ref));
119-
} else if constexpr (requires { __result.push_back(std::declval<_Ref>()); }) {
120-
__result.push_back(std::forward<_Ref>(__ref));
121-
} else if constexpr (requires { __result.emplace(__result.end(), std::declval<_Ref>()); }) {
122-
__result.emplace(__result.end(), std::forward<_Ref>(__ref));
123-
} else {
124-
static_assert(requires { __result.insert(__result.end(), std::declval<_Ref>()); });
125-
__result.insert(__result.end(), std::forward<_Ref>(__ref));
126-
}
127-
}
129+
ranges::for_each(__range, ranges::__container_append(__result));
128130
return __result;
129-
130131
} else {
131132
static_assert(__always_false<_Container>, "ranges::to: unable to convert to the given container type.");
132133
}

0 commit comments

Comments
 (0)