@@ -449,17 +449,17 @@ constexpr ptrdiff_t _Temporary_buffer_size(const _Diff _Value) noexcept {
449449}
450450
451451template <class _Ty>
452- struct _Optimistic_temporary_buffer { // temporary storage with _alloca-like attempt
452+ struct _Optimistic_temporary_buffer2 { // temporary storage with _alloca-like attempt
453453 static constexpr size_t _Optimistic_size = 4096; // default to ~1 page
454454 static constexpr size_t _Optimistic_count = (_STD max) (static_cast<size_t>(1), _Optimistic_size / sizeof(_Ty));
455455
456456 template <class _Diff>
457- explicit _Optimistic_temporary_buffer (const _Diff _Requested_size) noexcept { // get temporary storage
457+ explicit _Optimistic_temporary_buffer2 (const _Diff _Requested_size) noexcept { // get temporary storage
458458 const auto _Attempt = _Temporary_buffer_size(_Requested_size);
459459 // Since _Diff is a count of elements in a forward range, and forward iterators must denote objects in memory,
460460 // it must fit in a size_t.
461461 if (static_cast<size_t>(_Requested_size) <= _Optimistic_count) { // unconditionally engage stack space
462- _Data = reinterpret_cast<_Ty*>(& _Stack_space[0] );
462+ _Data = reinterpret_cast<_Ty*>(_Stack_space);
463463 _Capacity = static_cast<ptrdiff_t>(_Requested_size); // in bounds due to if condition
464464 return;
465465 }
@@ -473,22 +473,22 @@ struct _Optimistic_temporary_buffer { // temporary storage with _alloca-like att
473473
474474 // less heap space than stack space, give up and use stack instead
475475 _STD _Return_temporary_buffer(_Raw.first);
476- _Data = reinterpret_cast<_Ty*>(& _Stack_space[0] );
476+ _Data = reinterpret_cast<_Ty*>(_Stack_space);
477477 _Capacity = _Optimistic_count;
478478 }
479479
480- _Optimistic_temporary_buffer (const _Optimistic_temporary_buffer &) = delete;
481- _Optimistic_temporary_buffer & operator=(const _Optimistic_temporary_buffer &) = delete;
480+ _Optimistic_temporary_buffer2 (const _Optimistic_temporary_buffer2 &) = delete;
481+ _Optimistic_temporary_buffer2 & operator=(const _Optimistic_temporary_buffer2 &) = delete;
482482
483- ~_Optimistic_temporary_buffer () noexcept {
483+ ~_Optimistic_temporary_buffer2 () noexcept {
484484 if (static_cast<size_t>(_Capacity) > _Optimistic_count) {
485485 _STD _Return_temporary_buffer(_Data);
486486 }
487487 }
488488
489489 _Ty* _Data; // points to heap memory iff _Capacity > _Optimistic_count
490490 ptrdiff_t _Capacity;
491- _Aligned_storage_t<sizeof (_Ty), alignof (_Ty)> _Stack_space[ _Optimistic_count];
491+ alignas (_Ty) unsigned char _Stack_space[sizeof (_Ty) * _Optimistic_count];
492492};
493493
494494#if _HAS_CXX20
@@ -7110,7 +7110,7 @@ _BidIt _Stable_partition_unchecked(_BidIt _First, _BidIt _Last, _Pr _Pred) {
71107110 using _Diff = _Iter_diff_t<_BidIt>;
71117111 const _Diff _Temp_count = _STD distance(_First, _Last); // _Total_count - 1 since we never need to store *_Last
71127112 const _Diff _Total_count = _Temp_count + static_cast<_Diff>(1);
7113- _Optimistic_temporary_buffer <_Iter_value_t<_BidIt>> _Temp_buf{_Temp_count};
7113+ _Optimistic_temporary_buffer2 <_Iter_value_t<_BidIt>> _Temp_buf{_Temp_count};
71147114 return _STD _Stable_partition_unchecked1(_First, _Last, _Pred, _Total_count, _Temp_buf._Data, _Temp_buf._Capacity)
71157115 .first;
71167116}
@@ -7229,7 +7229,7 @@ namespace ranges {
72297229 } while (!_STD invoke(_Pred, _STD invoke(_Proj, *_Last)));
72307230
72317231 const iter_difference_t<_It> _Temp_count = _RANGES distance(_First, _Last);
7232- _Optimistic_temporary_buffer <iter_value_t<_It>> _Temp_buf{_Temp_count};
7232+ _Optimistic_temporary_buffer2 <iter_value_t<_It>> _Temp_buf{_Temp_count};
72337233
72347234 // _Temp_count + 1 since we work on closed ranges
72357235 const auto _Total_count = static_cast<iter_difference_t<_It>>(_Temp_count + 1);
@@ -8442,7 +8442,7 @@ void inplace_merge(_BidIt _First, _BidIt _Mid, _BidIt _Last, _Pr _Pred) {
84428442 }
84438443
84448444 const _Diff _Count2 = _STD distance(_UMid, _ULast);
8445- _Optimistic_temporary_buffer <_Iter_value_t<_BidIt>> _Temp_buf{(_STD min) (_Count1, _Count2)};
8445+ _Optimistic_temporary_buffer2 <_Iter_value_t<_BidIt>> _Temp_buf{(_STD min) (_Count1, _Count2)};
84468446 _STD _Buffered_inplace_merge_unchecked_impl(
84478447 _UFirst, _UMid, _ULast, _Count1, _Count2, _Temp_buf._Data, _Temp_buf._Capacity, _STD _Pass_fn(_Pred));
84488448}
@@ -8793,7 +8793,7 @@ namespace ranges {
87938793 }
87948794
87958795 const iter_difference_t<_It> _Count2 = _RANGES distance(_Mid, _Last);
8796- _Optimistic_temporary_buffer <iter_value_t<_It>> _Temp_buf{(_STD min) (_Count1, _Count2)};
8796+ _Optimistic_temporary_buffer2 <iter_value_t<_It>> _Temp_buf{(_STD min) (_Count1, _Count2)};
87978797 if (_Count1 <= _Count2 && _Count1 <= _Temp_buf._Capacity) {
87988798 _RANGES _Inplace_merge_buffer_left(_STD move(_First), _STD move(_Mid), _STD move(_Last),
87998799 _Temp_buf._Data, _Temp_buf._Capacity, _Pred, _Proj);
@@ -9403,7 +9403,7 @@ void stable_sort(const _BidIt _First, const _BidIt _Last, _Pr _Pred) {
94039403 return;
94049404 }
94059405
9406- _Optimistic_temporary_buffer <_Iter_value_t<_BidIt>> _Temp_buf{_Count - _Count / 2};
9406+ _Optimistic_temporary_buffer2 <_Iter_value_t<_BidIt>> _Temp_buf{_Count - _Count / 2};
94079407 _STD _Stable_sort_unchecked(_UFirst, _ULast, _Count, _Temp_buf._Data, _Temp_buf._Capacity, _STD _Pass_fn(_Pred));
94089408}
94099409
@@ -9470,7 +9470,7 @@ namespace ranges {
94709470 return;
94719471 }
94729472
9473- _Optimistic_temporary_buffer <iter_value_t<_It>> _Temp_buf{_Count - _Count / 2};
9473+ _Optimistic_temporary_buffer2 <iter_value_t<_It>> _Temp_buf{_Count - _Count / 2};
94749474 _Stable_sort_common_buffered(
94759475 _STD move(_First), _STD move(_Last), _Count, _Temp_buf._Data, _Temp_buf._Capacity, _Pred, _Proj);
94769476 }
0 commit comments