@@ -4424,33 +4424,18 @@ _FwdIt2 exclusive_scan(_ExPo&&, const _FwdIt1 _First, const _FwdIt1 _Last, _FwdI
4424
4424
return _Dest;
4425
4425
}
4426
4426
4427
- template <class _FwdIt1, class _FwdIt2, class _BinOp, class _Ty>
4428
- _FwdIt2 _Inclusive_scan_per_chunk(
4429
- _FwdIt1 _First, const _FwdIt1 _Last, _FwdIt2 _Dest, _BinOp _Reduce_op, _Ty& _Val, _No_init_tag) {
4430
- // Local-sum for parallel inclusive_scan; writes local inclusive prefix sums into _Dest and stores overall sum in
4431
- // _Val.
4432
- // pre: _Val is *uninitialized* && _First != _Last
4433
- _Construct_in_place(_Val, *_First);
4434
- for (;;) {
4435
- *_Dest = _Val;
4436
- ++_Dest;
4437
- ++_First;
4438
- if (_First == _Last) {
4439
- return _Dest;
4440
- }
4441
-
4442
- _Val = _Reduce_op(_STD move(_Val), *_First);
4443
- }
4444
- }
4445
-
4446
- template <class _FwdIt1, class _FwdIt2, class _BinOp, class _Ty, class _Ty_fwd,
4447
- enable_if_t<!is_same_v<_No_init_tag, remove_const_t<remove_reference_t<_Ty_fwd>>>, int> = 0>
4427
+ template <class _FwdIt1, class _FwdIt2, class _BinOp, class _Ty, class _Ty_fwd>
4448
4428
_FwdIt2 _Inclusive_scan_per_chunk(
4449
4429
_FwdIt1 _First, const _FwdIt1 _Last, _FwdIt2 _Dest, _BinOp _Reduce_op, _Ty& _Val, _Ty_fwd&& _Predecessor) {
4450
4430
// local-sum for parallel inclusive_scan; writes local inclusive prefix sums into _Dest and stores overall sum in
4451
4431
// _Val.
4452
4432
// pre: _Val is *uninitialized* && _First != _Last
4453
- _Construct_in_place(_Val, _Reduce_op(_STD forward<_Ty_fwd>(_Predecessor), *_First));
4433
+ if constexpr (is_same_v<_No_init_tag, remove_const_t<remove_reference_t<_Ty_fwd>>>) {
4434
+ _Construct_in_place(_Val, *_First);
4435
+ } else {
4436
+ _Construct_in_place(_Val, _Reduce_op(_STD forward<_Ty_fwd>(_Predecessor), *_First));
4437
+ }
4438
+
4454
4439
for (;;) {
4455
4440
*_Dest = _Val;
4456
4441
++_Dest;
@@ -4756,33 +4741,18 @@ _FwdIt2 transform_exclusive_scan(_ExPo&&, const _FwdIt1 _First, const _FwdIt1 _L
4756
4741
return _Dest;
4757
4742
}
4758
4743
4759
- template <class _FwdIt1, class _FwdIt2, class _BinOp, class _UnaryOp, class _Ty>
4760
- _FwdIt2 _Transform_inclusive_scan_per_chunk(_FwdIt1 _First, const _FwdIt1 _Last, _FwdIt2 _Dest, _BinOp _Reduce_op,
4761
- _UnaryOp _Transform_op, _Ty& _Val, _No_init_tag) {
4762
- // Local-sum for parallel transform_inclusive_scan; writes local inclusive prefix sums into _Dest and stores overall
4763
- // sum in _Val.
4764
- // pre: _Val is *uninitialized* && _First != _Last
4765
- _Construct_in_place(_Val, _Transform_op(*_First));
4766
- for (;;) {
4767
- *_Dest = _Val;
4768
- ++_Dest;
4769
- ++_First;
4770
- if (_First == _Last) {
4771
- return _Dest;
4772
- }
4773
-
4774
- _Val = _Reduce_op(_STD move(_Val), _Transform_op(*_First));
4775
- }
4776
- }
4777
-
4778
- template <class _FwdIt1, class _FwdIt2, class _BinOp, class _UnaryOp, class _Ty, class _Ty_fwd,
4779
- enable_if_t<!is_same_v<_No_init_tag, remove_const_t<remove_reference_t<_Ty_fwd>>>, int> = 0>
4744
+ template <class _FwdIt1, class _FwdIt2, class _BinOp, class _UnaryOp, class _Ty, class _Ty_fwd>
4780
4745
_FwdIt2 _Transform_inclusive_scan_per_chunk(_FwdIt1 _First, const _FwdIt1 _Last, _FwdIt2 _Dest, _BinOp _Reduce_op,
4781
4746
_UnaryOp _Transform_op, _Ty& _Val, _Ty_fwd&& _Predecessor) {
4782
4747
// local-sum for parallel transform_inclusive_scan; writes local inclusive prefix sums into _Dest and stores overall
4783
4748
// sum in _Val
4784
4749
// pre: _Val is *uninitialized* && _First != _Last
4785
- _Construct_in_place(_Val, _Reduce_op(_STD forward<_Ty_fwd>(_Predecessor), _Transform_op(*_First)));
4750
+ if constexpr (is_same_v<_No_init_tag, remove_const_t<remove_reference_t<_Ty_fwd>>>) {
4751
+ _Construct_in_place(_Val, _Transform_op(*_First));
4752
+ } else {
4753
+ _Construct_in_place(_Val, _Reduce_op(_STD forward<_Ty_fwd>(_Predecessor), _Transform_op(*_First)));
4754
+ }
4755
+
4786
4756
for (;;) {
4787
4757
*_Dest = _Val;
4788
4758
++_Dest;
0 commit comments