@@ -1720,6 +1720,7 @@ namespace ranges {
17201720
17211721 template <class _InIt, class _OutIt>
17221722 in_out_result<_InIt, _OutIt> _Copy_memcpy_count(_InIt _IFirst, _OutIt _OFirst, const size_t _Count) noexcept {
1723+ // (pre-verified contiguous iterator)
17231724 const auto _IFirstPtr = _STD _To_address(_IFirst);
17241725 const auto _OFirstPtr = _STD _To_address(_OFirst);
17251726 const auto _IFirst_ch = const_cast<char*>(reinterpret_cast<const volatile char*>(_IFirstPtr));
@@ -1743,6 +1744,7 @@ namespace ranges {
17431744 template <class _InIt, class _OutIt, class _DistIt>
17441745 in_out_result<_InIt, _OutIt> _Copy_memcpy_distance(
17451746 _InIt _IFirst, _OutIt _OFirst, const _DistIt _DFirst, const _DistIt _DLast) noexcept {
1747+ // (pre-verified contiguous iterator)
17461748 // equivalent to _Copy_memcpy_count(_IFirst, _OFirst, _DLast - _DFirst) but computes distance more efficiently
17471749 const auto _IFirstPtr = _STD _To_address(_IFirst);
17481750 const auto _OFirstPtr = _STD _To_address(_OFirst);
@@ -1757,13 +1759,13 @@ namespace ranges {
17571759 if constexpr (is_pointer_v<_InIt>) {
17581760 _IFirst = reinterpret_cast<_InIt>(_IFirst_ch + _Count_bytes);
17591761 } else {
1760- _IFirst += _Count_bytes / sizeof(iter_value_t<_InIt>);
1762+ _IFirst += static_cast<iter_difference_t<_InIt>>( _Count_bytes / sizeof(iter_value_t<_InIt>) );
17611763 }
17621764
17631765 if constexpr (is_pointer_v<_OutIt>) {
17641766 _OFirst = reinterpret_cast<_OutIt>(_OFirst_ch + _Count_bytes);
17651767 } else {
1766- _OFirst += _Count_bytes / sizeof(iter_value_t<_OutIt>);
1768+ _OFirst += static_cast<iter_difference_t<_OutIt>>( _Count_bytes / sizeof(iter_value_t<_OutIt>) );
17671769 }
17681770 return {_STD move(_IFirst), _STD move(_OFirst)};
17691771 }
@@ -1813,12 +1815,14 @@ namespace ranges {
18131815 return _RANGES _Copy_memcpy_common(_IFirst, _RANGES next(_IFirst, _STD move(_ILast)), _OFirst,
18141816 _RANGES next(_OFirst, _STD move(_OLast)));
18151817 } else if constexpr (_Is_sized1) {
1816- return _RANGES _Copy_memcpy_distance(
1817- _IFirst, _OFirst, _IFirst, _RANGES next(_IFirst, _STD move(_ILast)));
1818+ const auto _Dist = _ILast - _IFirst;
1819+ _STD _Contiguous_iter_verify(_OFirst, static_cast<iter_difference_t<_Out>>(_Dist));
1820+ return _RANGES _Copy_memcpy_distance(_IFirst, _OFirst, _IFirst, _IFirst + _Dist);
18181821 } else {
18191822 _STL_INTERNAL_STATIC_ASSERT(_Is_sized2);
1820- return _RANGES _Copy_memcpy_distance(
1821- _IFirst, _OFirst, _OFirst, _RANGES next(_OFirst, _STD move(_OLast)));
1823+ const auto _Dist = _OLast - _OFirst;
1824+ _STD _Contiguous_iter_verify(_IFirst, static_cast<iter_difference_t<_It>>(_Dist));
1825+ return _RANGES _Copy_memcpy_distance(_IFirst, _OFirst, _OFirst, _OFirst + _Dist);
18221826 }
18231827 } else {
18241828 if constexpr (_Can_memcpy) {
@@ -1906,7 +1910,7 @@ _CONSTEXPR20 _Alloc_ptr_t<_Alloc> _Uninitialized_copy(
19061910 _STD _Copy_memmove(_STD _To_address(_UFirst), _STD _To_address(_ULast), _STD _Unfancy(_Dest));
19071911 _Dest += _ULast - _UFirst;
19081912 } else {
1909- const auto _Count = static_cast<size_t>(_ULast - _UFirst);
1913+ const auto _Count = static_cast<size_t>(_STD _Contiguous_iter_distance( _UFirst, _ULast) );
19101914 _STD _Copy_memmove_n(_STD _To_address(_UFirst), _Count, _STD _Unfancy(_Dest));
19111915 _Dest += _Count;
19121916 }
0 commit comments