@@ -4103,13 +4103,29 @@ _CONSTEXPR20 void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right) { // swap *_Left and
41034103    swap(*_Left, *_Right); // intentional ADL
41044104}
41054105
4106+ template <class _VbIt, class _OutIt, class _Mapped_fn>
4107+ _CONSTEXPR20 _OutIt _Transform_vbool_aligned(_VbIt _First, _VbIt _Last, _OutIt _Dest, _Mapped_fn _Mapped_func);
4108+ 
4109+ template <class _VbIt1, class _VbIt2, class _OutIt, class _Mapped_fn>
4110+ _CONSTEXPR20 _OutIt _Transform_vbool_aligned(
4111+     _VbIt1 _First1, _VbIt1 _Last1, _VbIt2 _First2, _OutIt _Dest, _Mapped_fn _Mapped_func);
4112+ 
41064113_EXPORT_STD template <class _InIt, class _OutIt, class _Fn>
41074114_CONSTEXPR20 _OutIt transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func) {
41084115    // transform [_First, _Last) with _Func
41094116    _STD _Adl_verify_range(_First, _Last);
41104117    auto _UFirst      = _STD _Get_unwrapped(_First);
41114118    const auto _ULast = _STD _Get_unwrapped(_Last);
41124119    auto _UDest       = _STD _Get_unwrapped_n(_Dest, _STD _Idl_distance<_InIt>(_UFirst, _ULast));
4120+ 
4121+     if constexpr (_Is_vb_iterator<_InIt> && _Is_vb_iterator<_OutIt, true> && !is_same_v<_Map_vb_functor_t<_Fn>, void>) {
4122+         if (_UFirst._Myoff == 0 && _UDest._Myoff == 0) {
4123+             _UDest = _Transform_vbool_aligned(_UFirst, _ULast, _UDest, _Map_vb_functor_t<_Fn>{});
4124+             _STD _Seek_wrapped(_Dest, _UDest);
4125+             return _Dest;
4126+         }
4127+     }
4128+ 
41134129    for (; _UFirst != _ULast; ++_UFirst, (void) ++_UDest) {
41144130        *_UDest = _Func(*_UFirst);
41154131    }
@@ -4133,6 +4149,16 @@ _CONSTEXPR20 _OutIt transform(
41334149    const auto _Count  = _STD _Idl_distance<_InIt1>(_UFirst1, _ULast1);
41344150    auto _UFirst2      = _STD _Get_unwrapped_n(_First2, _Count);
41354151    auto _UDest        = _STD _Get_unwrapped_n(_Dest, _Count);
4152+ 
4153+     if constexpr (_Is_vb_iterator<_InIt1> && _Is_vb_iterator<_InIt2> && _Is_vb_iterator<_OutIt, true>
4154+                   && !is_same_v<_Map_vb_functor_t<_Fn>, void>) {
4155+         if (_UFirst1._Myoff == 0 && _UFirst2._Myoff == 0 && _UDest._Myoff == 0) {
4156+             _UDest = _Transform_vbool_aligned(_UFirst1, _ULast1, _UFirst2, _UDest, _Map_vb_functor_t<_Fn>{});
4157+             _STD _Seek_wrapped(_Dest, _UDest);
4158+             return _Dest;
4159+         }
4160+     }
4161+ 
41364162    for (; _UFirst1 != _ULast1; ++_UFirst1, (void) ++_UFirst2, ++_UDest) {
41374163        *_UDest = _Func(*_UFirst1, *_UFirst2);
41384164    }
0 commit comments