Skip to content

Commit 883ca4f

Browse files
Workaround for lacking implementation of P0588R1
1 parent ea3a23f commit 883ca4f

File tree

1 file changed

+13
-15
lines changed
  • libcxx/include/__ranges

1 file changed

+13
-15
lines changed

libcxx/include/__ranges/to.h

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -71,20 +71,18 @@ concept __constructible_from_iter_pair =
7171
derived_from<typename iterator_traits<iterator_t<_Range>>::iterator_category, input_iterator_tag> &&
7272
constructible_from<_Container, iterator_t<_Range>, sentinel_t<_Range>, _Args...>;
7373

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-
};
74+
template <class _Ref, class _Container>
75+
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto __container_append(_Container& __c) {
76+
if constexpr (requires { __c.emplace_back(std::declval<_Ref>()); })
77+
return [&__c](_Ref&& __ref) { __c.emplace_back(std::forward<_Ref>(__ref)); };
78+
else if constexpr (requires { __c.push_back(std::declval<_Ref>()); })
79+
return [&__c](_Ref&& __ref) { __c.push_back(std::forward<_Ref>(__ref)); };
80+
else if constexpr (requires { __c.emplace(__c.end(), std::declval<_Ref>()); })
81+
return [&__c](_Ref&& __ref) { __c.emplace(__c.end(), std::forward<_Ref>(__ref)); };
82+
else {
83+
static_assert(requires { __c.insert(__c.end(), std::declval<_Ref>()); });
84+
return [&__c](_Ref&& __ref) { __c.insert(__c.end(), std::forward<_Ref>(__ref)); };
85+
}
8886
}
8987

9088
template <class>
@@ -126,7 +124,7 @@ template <class _Container, input_range _Range, class... _Args>
126124
__result.reserve(static_cast<range_size_t<_Container>>(ranges::size(__range)));
127125
}
128126

129-
ranges::for_each(__range, ranges::__container_append(__result));
127+
ranges::for_each(__range, ranges::__container_append<ranges::range_reference_t<_Range>>(__result));
130128
return __result;
131129
} else {
132130
static_assert(__always_false<_Container>, "ranges::to: unable to convert to the given container type.");

0 commit comments

Comments
 (0)