Skip to content

Commit

Permalink
Remove std::shared_ptr::allocate_shared
Browse files Browse the repository at this point in the history
std::shared_ptr::allocate_shared isn't in the standard. This commit removes it from libc++. It updates std::allocate_shared to use __create_with_cntrl_block.

Differential Revision: https://reviews.llvm.org/D66178
  • Loading branch information
zoecarver committed Feb 26, 2020
1 parent b7aa1cc commit 28d38a2
Showing 1 changed file with 13 additions and 26 deletions.
39 changes: 13 additions & 26 deletions libcxx/include/memory
Original file line number Diff line number Diff line change
Expand Up @@ -3863,11 +3863,6 @@ public:
return __r;
}

template<class _Alloc, class ..._Args>
static
shared_ptr<_Tp>
allocate_shared(const _Alloc& __a, _Args&& ...__args);

private:
template <class _Yp, bool = is_function<_Yp>::value>
struct __shared_ptr_default_allocator
Expand Down Expand Up @@ -4180,26 +4175,6 @@ shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r,
__r.release();
}

template<class _Tp>
template<class _Alloc, class ..._Args>
shared_ptr<_Tp>
shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args)
{
static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in allocate_shared" );
typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
typedef __allocator_destructor<_A2> _D2;
_A2 __a2(__a);
unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
_CntrlBlk(__a, _VSTD::forward<_Args>(__args)...);
shared_ptr<_Tp> __r;
__r.__ptr_ = __hold2.get()->get();
__r.__cntrl_ = _VSTD::addressof(*__hold2.release());
__r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
return __r;
}

template<class _Tp>
shared_ptr<_Tp>::~shared_ptr()
{
Expand Down Expand Up @@ -4412,7 +4387,19 @@ typename enable_if
>::type
allocate_shared(const _Alloc& __a, _Args&& ...__args)
{
return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...);
static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in allocate_shared");

typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk;
typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
typedef __allocator_destructor<_A2> _D2;

_A2 __a2(__a);
unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
::new(static_cast<void*>(_VSTD::addressof(*__hold2.get())))
_CntrlBlk(__a, _VSTD::forward<_Args>(__args)...);

typename shared_ptr<_Tp>::element_type *__p = __hold2.get()->get();
return shared_ptr<_Tp>::__create_with_control_block(__p, _VSTD::addressof(*__hold2.release()));
}

template<class _Tp, class _Up>
Expand Down

0 comments on commit 28d38a2

Please sign in to comment.