| 
19 | 19 | 
 
  | 
20 | 20 | _LIBCPP_BEGIN_NAMESPACE_STD  | 
21 | 21 | 
 
  | 
 | 22 | +template <class _Pointer, class _SizeT = size_t>  | 
 | 23 | +struct __allocation_result {  | 
 | 24 | +  _Pointer ptr;  | 
 | 25 | +  _SizeT count;  | 
 | 26 | + | 
 | 27 | +  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __allocation_result(_Pointer __ptr, _SizeT __count)  | 
 | 28 | +      : ptr(__ptr), count(__count) {}  | 
 | 29 | +};  | 
 | 30 | +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(__allocation_result);  | 
 | 31 | + | 
22 | 32 | #if _LIBCPP_STD_VER >= 23  | 
23 | 33 | 
 
  | 
24 | 34 | template <class _Alloc>  | 
25 | 35 | [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto __allocate_at_least(_Alloc& __alloc, size_t __n) {  | 
26 |  | -  return std::allocator_traits<_Alloc>::allocate_at_least(__alloc, __n);  | 
 | 36 | +  auto __res = std::allocator_traits<_Alloc>::allocate_at_least(__alloc, __n);  | 
 | 37 | +  return __allocation_result{__res.ptr, __res.count};  | 
27 | 38 | }  | 
28 | 39 | 
 
  | 
29 | 40 | #else  | 
30 | 41 | 
 
  | 
31 |  | -template <class _Pointer>  | 
32 |  | -struct __allocation_result {  | 
33 |  | -  _Pointer ptr;  | 
34 |  | -  size_t count;  | 
35 |  | -};  | 
36 |  | - | 
37 |  | -template <class _Alloc>  | 
 | 42 | +template <class _Alloc, class _Traits = allocator_traits<_Alloc> >  | 
38 | 43 | [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI  | 
39 |  | -_LIBCPP_CONSTEXPR __allocation_result<typename allocator_traits<_Alloc>::pointer>  | 
 | 44 | +_LIBCPP_CONSTEXPR __allocation_result<typename _Traits::pointer, typename _Traits::size_type>  | 
40 | 45 | __allocate_at_least(_Alloc& __alloc, size_t __n) {  | 
41 |  | -  return {__alloc.allocate(__n), __n};  | 
 | 46 | +  return __allocation_result<typename _Traits::pointer, typename _Traits::size_type>(__alloc.allocate(__n), __n);  | 
42 | 47 | }  | 
43 | 48 | 
 
  | 
44 | 49 | #endif // _LIBCPP_STD_VER >= 23  | 
 | 
0 commit comments