c++新特性11 (10)shared_ptr四”_Ptr_base 类“

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++新特性11 (10)shared_ptr四”_Ptr_base 类“相关的知识,希望对你有一定的参考价值。

template <class _Ty>
class _Ptr_base  // base class for shared_ptr and weak_ptr
public:
    using element_type = remove_extent_t<_Ty>;

    _NODISCARD long use_count() const noexcept 
        return _Rep ? _Rep->_Use_count() : 0;
    

    template <class _Ty2>
    _NODISCARD bool owner_before(const _Ptr_base<_Ty2>& _Right) const noexcept  // compare addresses of manager objects
        return _Rep < _Right._Rep;
    

    _Ptr_base(const _Ptr_base&) = delete;
    _Ptr_base& operator=(const _Ptr_base&) = delete;

protected:
    _NODISCARD element_type* get() const noexcept 
        return _Ptr;
    
 
    template <class _Ty2>
    void _Move_construct_from(_Ptr_base<_Ty2>&& _Right) noexcept 
        // implement shared_ptr's (converting) move ctor and weak_ptr's move ctor
        _Ptr = _Right._Ptr;
        _Rep = _Right._Rep;

        _Right._Ptr = nullptr;
        _Right._Rep = nullptr;
    

    template <class _Ty2>
    void _Copy_construct_from(const shared_ptr<_Ty2>& _Other) noexcept 
        // implement shared_ptr's (converting) copy ctor
        _Other._Incref();

        _Ptr = _Other._Ptr;
        _Rep = _Other._Rep;
    

    template <class _Ty2>
    void _Alias_construct_from(const shared_ptr<_Ty2>& _Other, element_type* _Px) noexcept 
        // implement shared_ptr's aliasing ctor
        _Other._Incref();

        _Ptr = _Px;
        _Rep = _Other._Rep;
    

    template <class _Ty2>
    void _Alias_move_construct_from(shared_ptr<_Ty2>&& _Other, element_type* _Px) noexcept 
        // implement shared_ptr's aliasing move ctor
        _Ptr = _Px;
        _Rep = _Other._Rep;

        _Other._Ptr = nullptr;
        _Other._Rep = nullptr;
    

    template <class _Ty0>
    friend class weak_ptr; // specifically, weak_ptr::lock()

    template <class _Ty2>
    bool _Construct_from_weak(const weak_ptr<_Ty2>& _Other) noexcept 
        // implement shared_ptr's ctor from weak_ptr, and weak_ptr::lock()
        if (_Other._Rep && _Other._Rep->_Incref_nz()) 
            _Ptr = _Other._Ptr;
            _Rep = _Other._Rep;
            return true;
        

        return false;
    

    void _Incref() const noexcept 
        if (_Rep) 
            _Rep->_Incref();
        
    

    void _Decref() noexcept  // decrement reference count
        if (_Rep) 
            _Rep->_Decref();
        
    

    void _Swap(_Ptr_base& _Right) noexcept  // swap pointers
        _STD swap(_Ptr, _Right._Ptr);
        _STD swap(_Rep, _Right._Rep);
    

    template <class _Ty2>
    void _Weakly_construct_from(const _Ptr_base<_Ty2>& _Other) noexcept  // implement weak_ptr's ctors
        if (_Other._Rep) 
            _Ptr = _Other._Ptr;
            _Rep = _Other._Rep;
            _Rep->_Incwref();
         else 
            _STL_INTERNAL_CHECK(!_Ptr && !_Rep);
        
    

    template <class _Ty2>
    void _Weakly_convert_lvalue_avoiding_expired_conversions(const _Ptr_base<_Ty2>& _Other) noexcept 
        // implement weak_ptr's copy converting ctor
        if (_Other._Rep) 
            _Rep = _Other._Rep; // always share ownership
            _Rep->_Incwref();

            if (_Rep->_Incref_nz()) 
                _Ptr = _Other._Ptr; // keep resource alive during conversion, handling virtual inheritance
                _Rep->_Decref();
             else 
                _STL_INTERNAL_CHECK(!_Ptr);
            
         else 
            _STL_INTERNAL_CHECK(!_Ptr && !_Rep);
        
    

    template <class _Ty2>
    void _Weakly_convert_rvalue_avoiding_expired_conversions(_Ptr_base<_Ty2>&& _Other) noexcept 
        // implement weak_ptr's move converting ctor
        _Rep        = _Other._Rep; // always transfer ownership
        _Other._Rep = nullptr;

        if (_Rep && _Rep->_Incref_nz()) 
            _Ptr = _Other._Ptr; // keep resource alive during conversion, handling virtual inheritance
            _Rep->_Decref();
         else 
            _STL_INTERNAL_CHECK(!_Ptr);
        

        _Other._Ptr = nullptr;
    

    void _Incwref() const noexcept 
        if (_Rep) 
            _Rep->_Incwref();
        
    

    void _Decwref() noexcept  // decrement weak reference count
        if (_Rep) 
            _Rep->_Decwref();
        
    

private:
    element_type* _Ptrnullptr;
    _Ref_count_base* _Repnullptr;    
;

以上是关于c++新特性11 (10)shared_ptr四”_Ptr_base 类“的主要内容,如果未能解决你的问题,请参考以下文章

c++新特性11 (10)shared_ptr八”shared_ptr类“

c++新特性11 (10)shared_ptr三”创建计数器“

c++新特性11 (10)shared_ptr七reset

c++新特性11 (10)shared_ptr五”构造函数“

c++新特性11 (10)shared_ptr二”_Ref_count_base类“

c++新特性11 (10)shared_ptr六”构造函数unique_ptr参数“