Skip to content

Commit f0148e8

Browse files
committed
[libc++] Simplify the implementation of string::{append,assign,assign_range}
1 parent 4154c18 commit f0148e8

File tree

1 file changed

+10
-29
lines changed

1 file changed

+10
-29
lines changed

libcxx/include/string

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

701702
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;
709706

710707
template <class _CharT, class _Traits, class _Tp>
711708
inline 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

Comments
 (0)