diff --git a/stl/inc/execution b/stl/inc/execution index 450b4cb55..97c168253 100644 --- a/stl/inc/execution +++ b/stl/inc/execution @@ -4424,33 +4424,18 @@ _FwdIt2 exclusive_scan(_ExPo&&, const _FwdIt1 _First, const _FwdIt1 _Last, _FwdI return _Dest; } -template -_FwdIt2 _Inclusive_scan_per_chunk( - _FwdIt1 _First, const _FwdIt1 _Last, _FwdIt2 _Dest, _BinOp _Reduce_op, _Ty& _Val, _No_init_tag) { - // Local-sum for parallel inclusive_scan; writes local inclusive prefix sums into _Dest and stores overall sum in - // _Val. - // pre: _Val is *uninitialized* && _First != _Last - _Construct_in_place(_Val, *_First); - for (;;) { - *_Dest = _Val; - ++_Dest; - ++_First; - if (_First == _Last) { - return _Dest; - } - - _Val = _Reduce_op(_STD move(_Val), *_First); - } -} - -template >>, int> = 0> +template _FwdIt2 _Inclusive_scan_per_chunk( _FwdIt1 _First, const _FwdIt1 _Last, _FwdIt2 _Dest, _BinOp _Reduce_op, _Ty& _Val, _Ty_fwd&& _Predecessor) { // local-sum for parallel inclusive_scan; writes local inclusive prefix sums into _Dest and stores overall sum in // _Val. // pre: _Val is *uninitialized* && _First != _Last - _Construct_in_place(_Val, _Reduce_op(_STD forward<_Ty_fwd>(_Predecessor), *_First)); + if constexpr (is_same_v<_No_init_tag, remove_const_t>>) { + _Construct_in_place(_Val, *_First); + } else { + _Construct_in_place(_Val, _Reduce_op(_STD forward<_Ty_fwd>(_Predecessor), *_First)); + } + for (;;) { *_Dest = _Val; ++_Dest; @@ -4756,33 +4741,18 @@ _FwdIt2 transform_exclusive_scan(_ExPo&&, const _FwdIt1 _First, const _FwdIt1 _L return _Dest; } -template -_FwdIt2 _Transform_inclusive_scan_per_chunk(_FwdIt1 _First, const _FwdIt1 _Last, _FwdIt2 _Dest, _BinOp _Reduce_op, - _UnaryOp _Transform_op, _Ty& _Val, _No_init_tag) { - // Local-sum for parallel transform_inclusive_scan; writes local inclusive prefix sums into _Dest and stores overall - // sum in _Val. - // pre: _Val is *uninitialized* && _First != _Last - _Construct_in_place(_Val, _Transform_op(*_First)); - for (;;) { - *_Dest = _Val; - ++_Dest; - ++_First; - if (_First == _Last) { - return _Dest; - } - - _Val = _Reduce_op(_STD move(_Val), _Transform_op(*_First)); - } -} - -template >>, int> = 0> +template _FwdIt2 _Transform_inclusive_scan_per_chunk(_FwdIt1 _First, const _FwdIt1 _Last, _FwdIt2 _Dest, _BinOp _Reduce_op, _UnaryOp _Transform_op, _Ty& _Val, _Ty_fwd&& _Predecessor) { // local-sum for parallel transform_inclusive_scan; writes local inclusive prefix sums into _Dest and stores overall // sum in _Val // pre: _Val is *uninitialized* && _First != _Last - _Construct_in_place(_Val, _Reduce_op(_STD forward<_Ty_fwd>(_Predecessor), _Transform_op(*_First))); + if constexpr (is_same_v<_No_init_tag, remove_const_t>>) { + _Construct_in_place(_Val, _Transform_op(*_First)); + } else { + _Construct_in_place(_Val, _Reduce_op(_STD forward<_Ty_fwd>(_Predecessor), _Transform_op(*_First))); + } + for (;;) { *_Dest = _Val; ++_Dest;