@@ -639,6 +639,7 @@ basic_string<char32_t> operator""s( const char32_t *str, size_t len );
639639#  include  < __type_traits/is_trivially_copyable.h> 
640640#  include  < __type_traits/is_trivially_relocatable.h> 
641641#  include  < __type_traits/remove_cvref.h> 
642+ #  include  < __utility/declval.h> 
642643#  include  < __utility/default_three_way_comparator.h> 
643644#  include  < __utility/forward.h> 
644645#  include  < __utility/is_pointer_in_range.h> 
@@ -699,13 +700,9 @@ __concatenate_strings(const _Allocator& __alloc,
699700                      __type_identity_t <basic_string_view<_CharT, _Traits> > __str2);
700701
701702template  <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;
709706
710707template  <class  _CharT , class  _Traits , class  _Tp >
711708inline  const  bool  __can_be_converted_to_string_view_v =
@@ -1413,24 +1410,16 @@ public:
14131410  _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append (const  value_type* _LIBCPP_DIAGNOSE_NULLPTR __s);
14141411  _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append (size_type __n, value_type __c);
14151412
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 >
14251414  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1426-   append (_ForwardIterator  __first, _ForwardIterator  __last) {
1415+   append (_InputIterator  __first, _InputIterator  __last) {
14271416    size_type __sz  = size ();
14281417    size_type __cap = capacity ();
14291418    size_type __n   = static_cast <size_type>(std::distance (__first, __last));
14301419    if  (__n == 0 )
14311420      return  *this ;
14321421
1433-     if  (__string_is_trivial_iterator_v<_ForwardIterator > && !__addr_in_range (*__first)) {
1422+     if  (__string_is_trivial_iterator_v<_InputIterator > && !__addr_in_range (*__first)) {
14341423      if  (__cap - __sz < __n)
14351424        __grow_by_without_replace (__cap, __sz + __n - __cap, __sz, __sz, 0 );
14361425      __annotate_increase (__n);
@@ -1540,17 +1529,10 @@ public:
15401529  _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign (const  value_type* _LIBCPP_DIAGNOSE_NULLPTR __s);
15411530  _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign (size_type __n, value_type __c);
15421531
1543-   template  <class  _InputIterator ,  __enable_if_t <__has_exactly_input_iterator_category<_InputIterator>::value,  int > =  0 >
1532+   template  <class  _InputIterator >
15441533  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
15451534  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>) {
15541536      size_type __n = static_cast <size_type>(std::distance (__first, __last));
15551537      __assign_trivial (__first, __last, __n);
15561538    } else  {
@@ -1563,8 +1545,7 @@ public:
15631545#  if  _LIBCPP_STD_VER >= 23
15641546  template  <_ContainerCompatibleRange<_CharT> _Range>
15651547  _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>>) {
15681549      size_type __n = static_cast <size_type>(ranges::distance (__range));
15691550      __assign_trivial (ranges::begin (__range), ranges::end (__range), __n);
15701551
0 commit comments