@@ -4063,6 +4063,14 @@ _CONSTEXPR20 void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right) { // swap *_Left and
40634063 swap(*_Left, *_Right); // intentional ADL
40644064}
40654065
4066+ template <class _VbIt, class _OutIt, class _Mapped_fn>
4067+ _CONSTEXPR20 _OutIt _Transform_vbool_aligned(
4068+ const _VbIt _First, const _VbIt _Last, _OutIt _Dest, const _Mapped_fn _Mapped_func);
4069+
4070+ template <class _VbIt, class _OutIt, class _Mapped_fn>
4071+ _CONSTEXPR20 _OutIt _Transform_vbool_aligned(
4072+ const _VbIt _First1, const _VbIt _Last1, const _VbIt _First2, _OutIt _Dest, const _Mapped_fn _Mapped_func);
4073+
40664074_EXPORT_STD template <class _InIt, class _OutIt, class _Fn>
40674075_CONSTEXPR20 _OutIt transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func) {
40684076 // transform [_First, _Last) with _Func
@@ -4073,24 +4081,7 @@ _CONSTEXPR20 _OutIt transform(const _InIt _First, const _InIt _Last, _OutIt _Des
40734081
40744082 if constexpr (_Is_vb_iterator<_InIt> && _Is_vb_iterator<_OutIt, true> && !is_same_v<_Map_vb_functor_t<_Fn>, void>) {
40754083 if (_UFirst._Myoff == 0 && _UDest._Myoff == 0) {
4076- using _Vbase_ = decay_t<decltype(*_UDest._Myptr)>;
4077-
4078- const _Map_vb_functor_t<_Fn> _Mapped_fn{};
4079- auto _First_ptr = _UFirst._Myptr;
4080- const auto _Last_ptr = _ULast._Myptr;
4081- auto _Dest_ptr = const_cast<_Vbase_*>(_UDest._Myptr);
4082-
4083- for (; _First_ptr != _Last_ptr; ++_First_ptr, ++_Dest_ptr) {
4084- *_Dest_ptr = _Mapped_fn(*_First_ptr);
4085- }
4086-
4087- if (_ULast._Myoff != 0) {
4088- const _Vbase_ _Mask = (_Vbase_{1} << _ULast._Myoff) - 1;
4089- *_Dest_ptr = (*_Dest_ptr & ~_Mask) | (_Mapped_fn(*_First_ptr) & _Mask);
4090- _UDest._Myoff = _ULast._Myoff;
4091- }
4092-
4093- _UDest._Myptr = _Dest_ptr;
4084+ _UDest = _Transform_vbool_aligned(_UFirst, _ULast, _UDest, _Map_vb_functor_t<_Fn>{});
40944085 _STD _Seek_wrapped(_Dest, _UDest);
40954086 return _Dest;
40964087 }
@@ -4123,25 +4114,7 @@ _CONSTEXPR20 _OutIt transform(
41234114 if constexpr (_Is_vb_iterator<_InIt1> && _Is_vb_iterator<_InIt2> && _Is_vb_iterator<_OutIt, true>
41244115 && !is_same_v<_Map_vb_functor_t<_Fn>, void>) {
41254116 if (_UFirst1._Myoff == 0 && _UFirst2._Myoff == 0 && _UDest._Myoff == 0) {
4126- using _Vbase_ = decay_t<decltype(*_UDest._Myptr)>;
4127-
4128- const _Map_vb_functor_t<_Fn> _Mapped_fn{};
4129- auto _First1_ptr = _UFirst1._Myptr;
4130- auto _First2_ptr = _UFirst2._Myptr;
4131- const auto _Last1_ptr = _ULast1._Myptr;
4132- auto _Dest_ptr = const_cast<_Vbase_*>(_UDest._Myptr);
4133-
4134- for (; _First1_ptr != _Last1_ptr; ++_First1_ptr, ++_First2_ptr, ++_Dest_ptr) {
4135- *_Dest_ptr = _Mapped_fn(*_First1_ptr, *_First2_ptr);
4136- }
4137-
4138- if (_ULast1._Myoff != 0) {
4139- const _Vbase_ _Mask = (_Vbase_{1} << _ULast1._Myoff) - 1;
4140- *_Dest_ptr = (*_Dest_ptr & ~_Mask) | (_Mapped_fn(*_First1_ptr, *_First2_ptr) & _Mask);
4141- _UDest._Myoff = _ULast1._Myoff;
4142- }
4143-
4144- _UDest._Myptr = _Dest_ptr;
4117+ _UDest = _Transform_vbool_aligned(_UFirst1, _ULast1, _UFirst2, _UDest, _Map_vb_functor_t<_Fn>{});
41454118 _STD _Seek_wrapped(_Dest, _UDest);
41464119 return _Dest;
41474120 }
0 commit comments