Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 20 additions & 30 deletions stl/inc/xstring
Original file line number Diff line number Diff line change
Expand Up @@ -2582,41 +2582,31 @@ public:
_Container_proxy_ptr<_Alty> _Proxy(_Alproxy, _Mypair._Myval2);
_Tidy_init();
_Adl_verify_range(_First, _Last);
_Construct(_Get_unwrapped(_First), _Get_unwrapped(_Last), _Iter_cat_t<_Iter>{});
_Proxy._Release();
}
auto _UFirst = _Get_unwrapped(_First);
const auto _ULast = _Get_unwrapped(_Last);

template <class _Iter>
_CONSTEXPR20 void _Construct(_Iter _First, const _Iter _Last, input_iterator_tag) {
// initialize from [_First, _Last), input iterators
_Tidy_deallocate_guard<basic_string> _Guard{this};
for (; _First != _Last; ++_First) {
push_back(*_First);
}

_Guard._Target = nullptr;
}
if constexpr (is_same_v<remove_const_t<remove_pointer_t<decltype(_UFirst)>>, _Elem>) {
if (_UFirst != _ULast) {
assign(_UFirst, _Convert_size<size_type>(static_cast<size_t>(_ULast - _UFirst)));
}
} else {
if constexpr (_Is_fwd_iter_v<_Iter>) {
const auto _Count = _Convert_size<size_type>(static_cast<size_t>(_STD distance(_UFirst, _ULast)));
reserve(_Count);
} else {
static_assert(_Is_input_iter_v<_Iter>, "Should be at least input iterator");
}

template <class _Iter>
_CONSTEXPR20 void _Construct(const _Iter _First, const _Iter _Last, forward_iterator_tag) {
// initialize from [_First, _Last), forward iterators
const size_type _Count = _Convert_size<size_type>(static_cast<size_t>(_STD distance(_First, _Last)));
reserve(_Count);
_Construct(_First, _Last, input_iterator_tag{});
}
// initialize from [_First, _Last), input iterators
_Tidy_deallocate_guard<basic_string> _Guard{this};
for (; _UFirst != _ULast; ++_UFirst) {
push_back(*_UFirst);
}

_CONSTEXPR20 void _Construct(_Elem* const _First, _Elem* const _Last, random_access_iterator_tag) {
// initialize from [_First, _Last), pointers
if (_First != _Last) {
assign(_First, _Convert_size<size_type>(static_cast<size_t>(_Last - _First)));
_Guard._Target = nullptr;
}
}

_CONSTEXPR20 void _Construct(const _Elem* const _First, const _Elem* const _Last, random_access_iterator_tag) {
// initialize from [_First, _Last), const pointers
if (_First != _Last) {
assign(_First, _Convert_size<size_type>(static_cast<size_t>(_Last - _First)));
}
_Proxy._Release();
}

_CONSTEXPR20 basic_string(basic_string&& _Right) noexcept
Expand Down