@@ -640,6 +640,7 @@ basic_string<char32_t> operator""s( const char32_t *str, size_t len );
640
640
# include < __type_traits/is_trivially_relocatable.h>
641
641
# include < __type_traits/remove_cvref.h>
642
642
# include < __utility/default_three_way_comparator.h>
643
+ # include < __utility/declval.h>
643
644
# include < __utility/forward.h>
644
645
# include < __utility/is_pointer_in_range.h>
645
646
# include < __utility/move.h>
@@ -699,13 +700,9 @@ __concatenate_strings(const _Allocator& __alloc,
699
700
__type_identity_t <basic_string_view<_CharT, _Traits> > __str2);
700
701
701
702
template <class _Iter >
702
- inline const bool __string_is_trivial_iterator_v = false ;
703
-
704
- template <class _Tp >
705
- inline const bool __string_is_trivial_iterator_v<_Tp*> = is_arithmetic<_Tp>::value;
706
-
707
- template <class _Iter >
708
- inline const bool __string_is_trivial_iterator_v<__wrap_iter<_Iter> > = __string_is_trivial_iterator_v<_Iter>;
703
+ inline const bool __string_is_trivial_iterator_v =
704
+ __libcpp_is_contiguous_iterator<_Iter>::value &&
705
+ is_arithmetic<remove_cvref_t <decltype (*std::declval<_Iter&>())>>::value;
709
706
710
707
template <class _CharT , class _Traits , class _Tp >
711
708
inline const bool __can_be_converted_to_string_view_v =
@@ -1413,24 +1410,16 @@ public:
1413
1410
_LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append (const value_type* _LIBCPP_DIAGNOSE_NULLPTR __s);
1414
1411
_LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append (size_type __n, value_type __c);
1415
1412
1416
- template <class _InputIterator , __enable_if_t <__has_exactly_input_iterator_category<_InputIterator>::value, int > = 0 >
1417
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1418
- append (_InputIterator __first, _InputIterator __last) {
1419
- const basic_string __temp (__first, __last, __alloc_);
1420
- append (__temp.data (), __temp.size ());
1421
- return *this ;
1422
- }
1423
-
1424
- template <class _ForwardIterator , __enable_if_t <__has_forward_iterator_category<_ForwardIterator>::value, int > = 0 >
1413
+ template <class _InputIterator >
1425
1414
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1426
- append (_ForwardIterator __first, _ForwardIterator __last) {
1415
+ append (_InputIterator __first, _InputIterator __last) {
1427
1416
size_type __sz = size ();
1428
1417
size_type __cap = capacity ();
1429
1418
size_type __n = static_cast <size_type>(std::distance (__first, __last));
1430
1419
if (__n == 0 )
1431
1420
return *this ;
1432
1421
1433
- if (__string_is_trivial_iterator_v<_ForwardIterator > && !__addr_in_range (*__first)) {
1422
+ if (__string_is_trivial_iterator_v<_InputIterator > && !__addr_in_range (*__first)) {
1434
1423
if (__cap - __sz < __n)
1435
1424
__grow_by_without_replace (__cap, __sz + __n - __cap, __sz, __sz, 0 );
1436
1425
__annotate_increase (__n);
@@ -1540,17 +1529,10 @@ public:
1540
1529
_LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign (const value_type* _LIBCPP_DIAGNOSE_NULLPTR __s);
1541
1530
_LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign (size_type __n, value_type __c);
1542
1531
1543
- template <class _InputIterator , __enable_if_t <__has_exactly_input_iterator_category<_InputIterator>::value, int > = 0 >
1532
+ template <class _InputIterator >
1544
1533
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1545
1534
assign (_InputIterator __first, _InputIterator __last) {
1546
- __assign_with_sentinel (__first, __last);
1547
- return *this ;
1548
- }
1549
-
1550
- template <class _ForwardIterator , __enable_if_t <__has_forward_iterator_category<_ForwardIterator>::value, int > = 0 >
1551
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1552
- assign (_ForwardIterator __first, _ForwardIterator __last) {
1553
- if (__string_is_trivial_iterator_v<_ForwardIterator>) {
1535
+ if _LIBCPP_CONSTEXPR (__string_is_trivial_iterator_v<_InputIterator>) {
1554
1536
size_type __n = static_cast <size_type>(std::distance (__first, __last));
1555
1537
__assign_trivial (__first, __last, __n);
1556
1538
} else {
@@ -1563,8 +1545,7 @@ public:
1563
1545
# if _LIBCPP_STD_VER >= 23
1564
1546
template <_ContainerCompatibleRange<_CharT> _Range>
1565
1547
_LIBCPP_HIDE_FROM_ABI constexpr basic_string& assign_range (_Range&& __range) {
1566
- if constexpr (__string_is_trivial_iterator_v<ranges::iterator_t <_Range>> &&
1567
- (ranges::forward_range<_Range> || ranges::sized_range<_Range>)) {
1548
+ if constexpr (__string_is_trivial_iterator_v<ranges::iterator_t <_Range>>) {
1568
1549
size_type __n = static_cast <size_type>(ranges::distance (__range));
1569
1550
__assign_trivial (ranges::begin (__range), ranges::end (__range), __n);
1570
1551
0 commit comments