Skip to content

Commit a54925e

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

File tree

1 file changed

+6
-22
lines changed

1 file changed

+6
-22
lines changed

libcxx/include/string

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1413,24 +1413,16 @@ public:
14131413
_LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append(const value_type* _LIBCPP_DIAGNOSE_NULLPTR __s);
14141414
_LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append(size_type __n, value_type __c);
14151415

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>
1416+
template <class _InputIterator>
14251417
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1426-
append(_ForwardIterator __first, _ForwardIterator __last) {
1418+
append(_InputIterator __first, _InputIterator __last) {
14271419
size_type __sz = size();
14281420
size_type __cap = capacity();
14291421
size_type __n = static_cast<size_type>(std::distance(__first, __last));
14301422
if (__n == 0)
14311423
return *this;
14321424

1433-
if (__string_is_trivial_iterator_v<_ForwardIterator> && !__addr_in_range(*__first)) {
1425+
if (__string_is_trivial_iterator_v<_InputIterator> && !__addr_in_range(*__first)) {
14341426
if (__cap - __sz < __n)
14351427
__grow_by_without_replace(__cap, __sz + __n - __cap, __sz, __sz, 0);
14361428
__annotate_increase(__n);
@@ -1540,17 +1532,10 @@ public:
15401532
_LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign(const value_type* _LIBCPP_DIAGNOSE_NULLPTR __s);
15411533
_LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign(size_type __n, value_type __c);
15421534

1543-
template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0>
1535+
template <class _InputIterator>
15441536
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
15451537
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>) {
1538+
if _LIBCPP_CONSTEXPR (__string_is_trivial_iterator_v<_InputIterator>) {
15541539
size_type __n = static_cast<size_type>(std::distance(__first, __last));
15551540
__assign_trivial(__first, __last, __n);
15561541
} else {
@@ -1563,8 +1548,7 @@ public:
15631548
# if _LIBCPP_STD_VER >= 23
15641549
template <_ContainerCompatibleRange<_CharT> _Range>
15651550
_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>)) {
1551+
if constexpr (__string_is_trivial_iterator_v<ranges::iterator_t<_Range>>) {
15681552
size_type __n = static_cast<size_type>(ranges::distance(__range));
15691553
__assign_trivial(ranges::begin(__range), ranges::end(__range), __n);
15701554

0 commit comments

Comments
 (0)