@@ -4937,14 +4937,20 @@ _CONSTEXPR20 void _Verify_ranges_do_not_overlap(const _Iter1& _First1, const _Se
49374937#endif // _ITERATOR_DEBUG_LEVEL != 2 ^^^
49384938}
49394939
4940- template <class _OutCtgIt>
4941- _OutCtgIt _Copy_memmove_tail (
4940+ template <bool _Use_memcpy, class _OutCtgIt>
4941+ _OutCtgIt _Impl_copy_memmeow_tail (
49424942 const char* const _First_ch, const _OutCtgIt _Dest, const size_t _Byte_count, const size_t _Object_count) {
49434943 _STL_INTERNAL_CHECK(_Byte_count == _Object_count * sizeof(*_Dest));
49444944 // (pre-verified contiguous iterator)
49454945 const auto _Dest_ptr = _STD _To_address(_Dest);
49464946 const auto _Dest_ch = const_cast<char*>(reinterpret_cast<const volatile char*>(_Dest_ptr));
4947- _CSTD memmove(_Dest_ch, _First_ch, _Byte_count);
4947+
4948+ if constexpr (_Use_memcpy) {
4949+ _CSTD memcpy(_Dest_ch, _First_ch, _Byte_count);
4950+ } else {
4951+ _CSTD memmove(_Dest_ch, _First_ch, _Byte_count);
4952+ }
4953+
49484954 if constexpr (is_pointer_v<_OutCtgIt>) {
49494955 (void) _Object_count;
49504956 // CodeQL [SM02986] This cast is correct: we're bypassing pointer arithmetic for performance.
@@ -4954,8 +4960,8 @@ _OutCtgIt _Copy_memmove_tail(
49544960 }
49554961}
49564962
4957- template <class _CtgIt, class _OutCtgIt>
4958- _OutCtgIt _Copy_memmove (_CtgIt _First, _CtgIt _Last, _OutCtgIt _Dest) {
4963+ template <bool _Use_memcpy, class _CtgIt, class _OutCtgIt>
4964+ _OutCtgIt _Impl_copy_memmeow (_CtgIt _First, _CtgIt _Last, _OutCtgIt _Dest) {
49594965 _STL_INTERNAL_CHECK(_First <= _Last);
49604966 const auto _First_ptr = _STD _To_address(_First);
49614967 const auto _Last_ptr = _STD _To_address(_Last);
@@ -4965,17 +4971,37 @@ _OutCtgIt _Copy_memmove(_CtgIt _First, _CtgIt _Last, _OutCtgIt _Dest) {
49654971 const auto _Last_ch = const_cast<const char*>(reinterpret_cast<const volatile char*>(_Last_ptr));
49664972 const auto _Byte_count = static_cast<size_t>(_Last_ch - _First_ch);
49674973 _STD _Contiguous_iter_verify(_Dest, static_cast<_Iter_diff_t<_OutCtgIt>>(_Ptr_diff));
4968- return _STD _Copy_memmove_tail (_First_ch, _STD move(_Dest), _Byte_count, _Object_count);
4974+ return _STD _Impl_copy_memmeow_tail<_Use_memcpy> (_First_ch, _STD move(_Dest), _Byte_count, _Object_count);
49694975}
49704976
4971- template <class _CtgIt, class _OutCtgIt>
4972- _OutCtgIt _Copy_memmove_n (_CtgIt _First, const size_t _Object_count, _OutCtgIt _Dest) {
4977+ template <bool _Use_memcpy, class _CtgIt, class _OutCtgIt>
4978+ _OutCtgIt _Impl_copy_memmeow_n (_CtgIt _First, const size_t _Object_count, _OutCtgIt _Dest) {
49734979 _STD _Contiguous_iter_verify(_First, static_cast<_Iter_diff_t<_CtgIt>>(_Object_count));
49744980 _STD _Contiguous_iter_verify(_Dest, static_cast<_Iter_diff_t<_OutCtgIt>>(_Object_count));
49754981 const auto _First_ptr = _STD _To_address(_First);
49764982 const auto _First_ch = const_cast<const char*>(reinterpret_cast<const volatile char*>(_First_ptr));
49774983 const auto _Byte_count = _Object_count * sizeof(*_First_ptr);
4978- return _STD _Copy_memmove_tail(_First_ch, _STD move(_Dest), _Byte_count, _Object_count);
4984+ return _STD _Impl_copy_memmeow_tail<_Use_memcpy>(_First_ch, _STD move(_Dest), _Byte_count, _Object_count);
4985+ }
4986+
4987+ template <class _CtgIt, class _OutCtgIt>
4988+ _OutCtgIt _Copy_memcpy(_CtgIt _First, _CtgIt _Last, _OutCtgIt _Dest) {
4989+ return _STD _Impl_copy_memmeow<true>(_First, _Last, _Dest);
4990+ }
4991+
4992+ template <class _CtgIt, class _OutCtgIt>
4993+ _OutCtgIt _Copy_memcpy_n(_CtgIt _First, const size_t _Object_count, _OutCtgIt _Dest) {
4994+ return _STD _Impl_copy_memmeow_n<true>(_First, _Object_count, _Dest);
4995+ }
4996+
4997+ template <class _CtgIt, class _OutCtgIt>
4998+ _OutCtgIt _Copy_memmove(_CtgIt _First, _CtgIt _Last, _OutCtgIt _Dest) {
4999+ return _STD _Impl_copy_memmeow<false>(_First, _Last, _Dest);
5000+ }
5001+
5002+ template <class _CtgIt, class _OutCtgIt>
5003+ _OutCtgIt _Copy_memmove_n(_CtgIt _First, const size_t _Object_count, _OutCtgIt _Dest) {
5004+ return _STD _Impl_copy_memmeow_n<false>(_First, _Object_count, _Dest);
49795005}
49805006
49815007template <class _Fn>
0 commit comments