Home | History | Annotate | Download | only in bits
      1 // shared_ptr and weak_ptr implementation details -*- C++ -*-
      2 
      3 // Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012
      4 // Free Software Foundation, Inc.
      5 //
      6 // This file is part of the GNU ISO C++ Library.  This library is free
      7 // software; you can redistribute it and/or modify it under the
      8 // terms of the GNU General Public License as published by the
      9 // Free Software Foundation; either version 3, or (at your option)
     10 // any later version.
     11 
     12 // This library is distributed in the hope that it will be useful,
     13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 // GNU General Public License for more details.
     16 
     17 // Under Section 7 of GPL version 3, you are granted additional
     18 // permissions described in the GCC Runtime Library Exception, version
     19 // 3.1, as published by the Free Software Foundation.
     20 
     21 // You should have received a copy of the GNU General Public License and
     22 // a copy of the GCC Runtime Library Exception along with this program;
     23 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     24 // <http://www.gnu.org/licenses/>.
     25 
     26 // GCC Note: Based on files from version 1.32.0 of the Boost library.
     27 
     28 //  shared_count.hpp
     29 //  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
     30 
     31 //  shared_ptr.hpp
     32 //  Copyright (C) 1998, 1999 Greg Colvin and Beman Dawes.
     33 //  Copyright (C) 2001, 2002, 2003 Peter Dimov
     34 
     35 //  weak_ptr.hpp
     36 //  Copyright (C) 2001, 2002, 2003 Peter Dimov
     37 
     38 //  enable_shared_from_this.hpp
     39 //  Copyright (C) 2002 Peter Dimov
     40 
     41 // Distributed under the Boost Software License, Version 1.0. (See
     42 // accompanying file LICENSE_1_0.txt or copy at
     43 // http://www.boost.org/LICENSE_1_0.txt)
     44 
     45 /** @file bits/shared_ptr_base.h
     46  *  This is an internal header file, included by other library headers.
     47  *  Do not attempt to use it directly. @headername{memory}
     48  */
     49 
     50 #ifndef _SHARED_PTR_BASE_H
     51 #define _SHARED_PTR_BASE_H 1
     52 
     53 namespace std _GLIBCXX_VISIBILITY(default)
     54 {
     55 _GLIBCXX_BEGIN_NAMESPACE_VERSION
     56 
     57  /**
     58    *  @brief  Exception possibly thrown by @c shared_ptr.
     59    *  @ingroup exceptions
     60    */
     61   class bad_weak_ptr : public std::exception
     62   {
     63   public:
     64     virtual char const*
     65     what() const noexcept;
     66 
     67     virtual ~bad_weak_ptr() noexcept;
     68   };
     69 
     70   // Substitute for bad_weak_ptr object in the case of -fno-exceptions.
     71   inline void
     72   __throw_bad_weak_ptr()
     73   {
     74 #if __EXCEPTIONS
     75     throw bad_weak_ptr();
     76 #else
     77     __builtin_abort();
     78 #endif
     79   }
     80 
     81   using __gnu_cxx::_Lock_policy;
     82   using __gnu_cxx::__default_lock_policy;
     83   using __gnu_cxx::_S_single;
     84   using __gnu_cxx::_S_mutex;
     85   using __gnu_cxx::_S_atomic;
     86 
     87   // Empty helper class except when the template argument is _S_mutex.
     88   template<_Lock_policy _Lp>
     89     class _Mutex_base
     90     {
     91     protected:
     92       // The atomic policy uses fully-fenced builtins, single doesn't care.
     93       enum { _S_need_barriers = 0 };
     94     };
     95 
     96   template<>
     97     class _Mutex_base<_S_mutex>
     98     : public __gnu_cxx::__mutex
     99     {
    100     protected:
    101       // This policy is used when atomic builtins are not available.
    102       // The replacement atomic operations might not have the necessary
    103       // memory barriers.
    104       enum { _S_need_barriers = 1 };
    105     };
    106 
    107   template<_Lock_policy _Lp = __default_lock_policy>
    108     class _Sp_counted_base
    109     : public _Mutex_base<_Lp>
    110     {
    111     public:
    112       _Sp_counted_base() noexcept
    113       : _M_use_count(1), _M_weak_count(1) { }
    114 
    115       virtual
    116       ~_Sp_counted_base() noexcept
    117       { }
    118 
    119       // Called when _M_use_count drops to zero, to release the resources
    120       // managed by *this.
    121       virtual void
    122       _M_dispose() noexcept = 0;
    123 
    124       // Called when _M_weak_count drops to zero.
    125       virtual void
    126       _M_destroy() noexcept
    127       { delete this; }
    128 
    129       virtual void*
    130       _M_get_deleter(const std::type_info&) = 0;
    131 
    132       void
    133       _M_add_ref_copy()
    134       { __gnu_cxx::__atomic_add_dispatch(&_M_use_count, 1); }
    135 
    136       void
    137       _M_add_ref_lock();
    138 
    139       void
    140       _M_release() noexcept
    141       {
    142         // Be race-detector-friendly.  For more info see bits/c++config.
    143         _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_use_count);
    144 	if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, -1) == 1)
    145 	  {
    146             _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_use_count);
    147 	    _M_dispose();
    148 	    // There must be a memory barrier between dispose() and destroy()
    149 	    // to ensure that the effects of dispose() are observed in the
    150 	    // thread that runs destroy().
    151 	    // See http://gcc.gnu.org/ml/libstdc++/2005-11/msg00136.html
    152 	    if (_Mutex_base<_Lp>::_S_need_barriers)
    153 	      {
    154 	        _GLIBCXX_READ_MEM_BARRIER;
    155 	        _GLIBCXX_WRITE_MEM_BARRIER;
    156 	      }
    157 
    158             // Be race-detector-friendly.  For more info see bits/c++config.
    159             _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_weak_count);
    160 	    if (__gnu_cxx::__exchange_and_add_dispatch(&_M_weak_count,
    161 						       -1) == 1)
    162               {
    163                 _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_weak_count);
    164 	        _M_destroy();
    165               }
    166 	  }
    167       }
    168 
    169       void
    170       _M_weak_add_ref() noexcept
    171       { __gnu_cxx::__atomic_add_dispatch(&_M_weak_count, 1); }
    172 
    173       void
    174       _M_weak_release() noexcept
    175       {
    176         // Be race-detector-friendly. For more info see bits/c++config.
    177         _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_weak_count);
    178 	if (__gnu_cxx::__exchange_and_add_dispatch(&_M_weak_count, -1) == 1)
    179 	  {
    180             _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_weak_count);
    181 	    if (_Mutex_base<_Lp>::_S_need_barriers)
    182 	      {
    183 	        // See _M_release(),
    184 	        // destroy() must observe results of dispose()
    185 	        _GLIBCXX_READ_MEM_BARRIER;
    186 	        _GLIBCXX_WRITE_MEM_BARRIER;
    187 	      }
    188 	    _M_destroy();
    189 	  }
    190       }
    191 
    192       long
    193       _M_get_use_count() const noexcept
    194       {
    195         // No memory barrier is used here so there is no synchronization
    196         // with other threads.
    197         return __atomic_load_n(&_M_use_count, __ATOMIC_RELAXED);
    198       }
    199 
    200     private:
    201       _Sp_counted_base(_Sp_counted_base const&) = delete;
    202       _Sp_counted_base& operator=(_Sp_counted_base const&) = delete;
    203 
    204       _Atomic_word  _M_use_count;     // #shared
    205       _Atomic_word  _M_weak_count;    // #weak + (#shared != 0)
    206     };
    207 
    208   template<>
    209     inline void
    210     _Sp_counted_base<_S_single>::
    211     _M_add_ref_lock()
    212     {
    213       if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, 1) == 0)
    214 	{
    215 	  _M_use_count = 0;
    216 	  __throw_bad_weak_ptr();
    217 	}
    218     }
    219 
    220   template<>
    221     inline void
    222     _Sp_counted_base<_S_mutex>::
    223     _M_add_ref_lock()
    224     {
    225       __gnu_cxx::__scoped_lock sentry(*this);
    226       if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, 1) == 0)
    227 	{
    228 	  _M_use_count = 0;
    229 	  __throw_bad_weak_ptr();
    230 	}
    231     }
    232 
    233   template<>
    234     inline void
    235     _Sp_counted_base<_S_atomic>::
    236     _M_add_ref_lock()
    237     {
    238       // Perform lock-free add-if-not-zero operation.
    239       _Atomic_word __count = _M_use_count;
    240       do
    241 	{
    242 	  if (__count == 0)
    243 	    __throw_bad_weak_ptr();
    244 	  // Replace the current counter value with the old value + 1, as
    245 	  // long as it's not changed meanwhile.
    246 	}
    247       while (!__atomic_compare_exchange_n(&_M_use_count, &__count, __count + 1,
    248 					  true, __ATOMIC_ACQ_REL,
    249 					  __ATOMIC_RELAXED));
    250     }
    251 
    252 
    253   // Forward declarations.
    254   template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
    255     class __shared_ptr;
    256 
    257   template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
    258     class __weak_ptr;
    259 
    260   template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
    261     class __enable_shared_from_this;
    262 
    263   template<typename _Tp>
    264     class shared_ptr;
    265 
    266   template<typename _Tp>
    267     class weak_ptr;
    268 
    269   template<typename _Tp>
    270     struct owner_less;
    271 
    272   template<typename _Tp>
    273     class enable_shared_from_this;
    274 
    275   template<_Lock_policy _Lp = __default_lock_policy>
    276     class __weak_count;
    277 
    278   template<_Lock_policy _Lp = __default_lock_policy>
    279     class __shared_count;
    280 
    281 
    282   // Counted ptr with no deleter or allocator support
    283   template<typename _Ptr, _Lock_policy _Lp>
    284     class _Sp_counted_ptr final : public _Sp_counted_base<_Lp>
    285     {
    286     public:
    287       explicit
    288       _Sp_counted_ptr(_Ptr __p)
    289       : _M_ptr(__p) { }
    290 
    291       virtual void
    292       _M_dispose() noexcept
    293       { delete _M_ptr; }
    294 
    295       virtual void
    296       _M_destroy() noexcept
    297       { delete this; }
    298 
    299       virtual void*
    300       _M_get_deleter(const std::type_info&)
    301       { return 0; }
    302 
    303       _Sp_counted_ptr(const _Sp_counted_ptr&) = delete;
    304       _Sp_counted_ptr& operator=(const _Sp_counted_ptr&) = delete;
    305 
    306     protected:
    307       _Ptr             _M_ptr;  // copy constructor must not throw
    308     };
    309 
    310   template<>
    311     inline void
    312     _Sp_counted_ptr<nullptr_t, _S_single>::_M_dispose() noexcept { }
    313 
    314   template<>
    315     inline void
    316     _Sp_counted_ptr<nullptr_t, _S_mutex>::_M_dispose() noexcept { }
    317 
    318   template<>
    319     inline void
    320     _Sp_counted_ptr<nullptr_t, _S_atomic>::_M_dispose() noexcept { }
    321 
    322   // Support for custom deleter and/or allocator
    323   template<typename _Ptr, typename _Deleter, typename _Alloc, _Lock_policy _Lp>
    324     class _Sp_counted_deleter final : public _Sp_counted_base<_Lp>
    325     {
    326       // Helper class that stores the Deleter and also acts as an allocator.
    327       // Used to dispose of the owned pointer and the internal refcount
    328       // Requires that copies of _Alloc can free each other's memory.
    329       struct _My_Deleter
    330       : public _Alloc           // copy constructor must not throw
    331       {
    332 	_Deleter _M_del;        // copy constructor must not throw
    333 	_My_Deleter(_Deleter __d, const _Alloc& __a)
    334 	: _Alloc(__a), _M_del(__d) { }
    335       };
    336 
    337     public:
    338       // __d(__p) must not throw.
    339       _Sp_counted_deleter(_Ptr __p, _Deleter __d)
    340       : _M_ptr(__p), _M_del(__d, _Alloc()) { }
    341 
    342       // __d(__p) must not throw.
    343       _Sp_counted_deleter(_Ptr __p, _Deleter __d, const _Alloc& __a)
    344       : _M_ptr(__p), _M_del(__d, __a) { }
    345 
    346       ~_Sp_counted_deleter() noexcept { }
    347 
    348       virtual void
    349       _M_dispose() noexcept
    350       { _M_del._M_del(_M_ptr); }
    351 
    352       virtual void
    353       _M_destroy() noexcept
    354       {
    355 	typedef typename allocator_traits<_Alloc>::template
    356 	  rebind_traits<_Sp_counted_deleter> _Alloc_traits;
    357 	typename _Alloc_traits::allocator_type __a(_M_del);
    358 	_Alloc_traits::destroy(__a, this);
    359 	_Alloc_traits::deallocate(__a, this, 1);
    360       }
    361 
    362       virtual void*
    363       _M_get_deleter(const std::type_info& __ti)
    364       {
    365 #ifdef __GXX_RTTI
    366         return __ti == typeid(_Deleter) ? &_M_del._M_del : 0;
    367 #else
    368         return 0;
    369 #endif
    370       }
    371 
    372     protected:
    373       _Ptr             _M_ptr;  // copy constructor must not throw
    374       _My_Deleter      _M_del;  // copy constructor must not throw
    375     };
    376 
    377   // helpers for make_shared / allocate_shared
    378 
    379   struct _Sp_make_shared_tag { };
    380 
    381   template<typename _Tp, typename _Alloc, _Lock_policy _Lp>
    382     class _Sp_counted_ptr_inplace final : public _Sp_counted_base<_Lp>
    383     {
    384       // Helper class that stores the pointer and also acts as an allocator.
    385       // Used to dispose of the owned pointer and the internal refcount
    386       // Requires that copies of _Alloc can free each other's memory.
    387       struct _Impl
    388       : public _Alloc           // copy constructor must not throw
    389       {
    390 	_Impl(_Alloc __a) : _Alloc(__a), _M_ptr() { }
    391 	_Tp* _M_ptr;
    392       };
    393 
    394     public:
    395       template<typename... _Args>
    396 	_Sp_counted_ptr_inplace(_Alloc __a, _Args&&... __args)
    397 	: _M_impl(__a), _M_storage()
    398 	{
    399 	  _M_impl._M_ptr = static_cast<_Tp*>(static_cast<void*>(&_M_storage));
    400 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
    401 	  // 2070.  allocate_shared should use allocator_traits<A>::construct
    402 	  allocator_traits<_Alloc>::construct(__a, _M_impl._M_ptr,
    403 	      std::forward<_Args>(__args)...); // might throw
    404 	}
    405 
    406       ~_Sp_counted_ptr_inplace() noexcept { }
    407 
    408       virtual void
    409       _M_dispose() noexcept
    410       { allocator_traits<_Alloc>::destroy(_M_impl, _M_impl._M_ptr); }
    411 
    412       // Override because the allocator needs to know the dynamic type
    413       virtual void
    414       _M_destroy() noexcept
    415       {
    416 	typedef typename allocator_traits<_Alloc>::template
    417 	  rebind_traits<_Sp_counted_ptr_inplace> _Alloc_traits;
    418 	typename _Alloc_traits::allocator_type __a(_M_impl);
    419 	_Alloc_traits::destroy(__a, this);
    420 	_Alloc_traits::deallocate(__a, this, 1);
    421       }
    422 
    423       // Sneaky trick so __shared_ptr can get the managed pointer
    424       virtual void*
    425       _M_get_deleter(const std::type_info& __ti) noexcept
    426       {
    427 #ifdef __GXX_RTTI
    428 	return __ti == typeid(_Sp_make_shared_tag)
    429 	       ? static_cast<void*>(&_M_storage)
    430 	       : 0;
    431 #else
    432         return 0;
    433 #endif
    434       }
    435 
    436     private:
    437       _Impl _M_impl;
    438       typename aligned_storage<sizeof(_Tp), alignment_of<_Tp>::value>::type
    439 	_M_storage;
    440     };
    441 
    442   template<_Lock_policy _Lp>
    443     class __shared_count
    444     {
    445     public:
    446       constexpr __shared_count() noexcept : _M_pi(0)
    447       { }
    448 
    449       template<typename _Ptr>
    450         explicit
    451 	__shared_count(_Ptr __p) : _M_pi(0)
    452 	{
    453 	  __try
    454 	    {
    455 	      _M_pi = new _Sp_counted_ptr<_Ptr, _Lp>(__p);
    456 	    }
    457 	  __catch(...)
    458 	    {
    459 	      delete __p;
    460 	      __throw_exception_again;
    461 	    }
    462 	}
    463 
    464       template<typename _Ptr, typename _Deleter>
    465 	__shared_count(_Ptr __p, _Deleter __d) : _M_pi(0)
    466 	{
    467 	  // The allocator's value_type doesn't matter, will rebind it anyway.
    468 	  typedef std::allocator<int> _Alloc;
    469 	  typedef _Sp_counted_deleter<_Ptr, _Deleter, _Alloc, _Lp> _Sp_cd_type;
    470 	  typedef typename allocator_traits<_Alloc>::template
    471 	    rebind_traits<_Sp_cd_type> _Alloc_traits;
    472 	  typename _Alloc_traits::allocator_type __a;
    473 	  _Sp_cd_type* __mem = 0;
    474 	  __try
    475 	    {
    476 	      __mem = _Alloc_traits::allocate(__a, 1);
    477 	      _Alloc_traits::construct(__a, __mem, __p, std::move(__d));
    478 	      _M_pi = __mem;
    479 	    }
    480 	  __catch(...)
    481 	    {
    482 	      __d(__p); // Call _Deleter on __p.
    483 	      if (__mem)
    484 	        _Alloc_traits::deallocate(__a, __mem, 1);
    485 	      __throw_exception_again;
    486 	    }
    487 	}
    488 
    489       template<typename _Ptr, typename _Deleter, typename _Alloc>
    490 	__shared_count(_Ptr __p, _Deleter __d, _Alloc __a) : _M_pi(0)
    491 	{
    492 	  typedef _Sp_counted_deleter<_Ptr, _Deleter, _Alloc, _Lp> _Sp_cd_type;
    493 	  typedef typename allocator_traits<_Alloc>::template
    494 	    rebind_traits<_Sp_cd_type> _Alloc_traits;
    495 	  typename _Alloc_traits::allocator_type __a2(__a);
    496 	  _Sp_cd_type* __mem = 0;
    497 	  __try
    498 	    {
    499 	      __mem = _Alloc_traits::allocate(__a2, 1);
    500 	      _Alloc_traits::construct(__a2, __mem,
    501 		  __p, std::move(__d), std::move(__a));
    502 	      _M_pi = __mem;
    503 	    }
    504 	  __catch(...)
    505 	    {
    506 	      __d(__p); // Call _Deleter on __p.
    507 	      if (__mem)
    508 	        _Alloc_traits::deallocate(__a2, __mem, 1);
    509 	      __throw_exception_again;
    510 	    }
    511 	}
    512 
    513       template<typename _Tp, typename _Alloc, typename... _Args>
    514 	__shared_count(_Sp_make_shared_tag, _Tp*, const _Alloc& __a,
    515 		       _Args&&... __args)
    516 	: _M_pi(0)
    517 	{
    518 	  typedef _Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp> _Sp_cp_type;
    519 	  typedef typename allocator_traits<_Alloc>::template
    520 	    rebind_traits<_Sp_cp_type> _Alloc_traits;
    521 	  typename _Alloc_traits::allocator_type __a2(__a);
    522 	  _Sp_cp_type* __mem = _Alloc_traits::allocate(__a2, 1);
    523 	  __try
    524 	    {
    525 	      _Alloc_traits::construct(__a2, __mem, std::move(__a),
    526 		    std::forward<_Args>(__args)...);
    527 	      _M_pi = __mem;
    528 	    }
    529 	  __catch(...)
    530 	    {
    531 	      _Alloc_traits::deallocate(__a2, __mem, 1);
    532 	      __throw_exception_again;
    533 	    }
    534 	}
    535 
    536 #if _GLIBCXX_USE_DEPRECATED
    537       // Special case for auto_ptr<_Tp> to provide the strong guarantee.
    538       template<typename _Tp>
    539         explicit
    540 	__shared_count(std::auto_ptr<_Tp>&& __r)
    541 	: _M_pi(new _Sp_counted_ptr<_Tp*, _Lp>(__r.get()))
    542 	{ __r.release(); }
    543 #endif
    544 
    545       // Special case for unique_ptr<_Tp,_Del> to provide the strong guarantee.
    546       template<typename _Tp, typename _Del>
    547         explicit
    548 	__shared_count(std::unique_ptr<_Tp, _Del>&& __r)
    549 	: _M_pi(_S_create_from_up(std::move(__r)))
    550 	{ __r.release(); }
    551 
    552       // Throw bad_weak_ptr when __r._M_get_use_count() == 0.
    553       explicit __shared_count(const __weak_count<_Lp>& __r);
    554 
    555       ~__shared_count() noexcept
    556       {
    557 	if (_M_pi != 0)
    558 	  _M_pi->_M_release();
    559       }
    560 
    561       __shared_count(const __shared_count& __r) noexcept
    562       : _M_pi(__r._M_pi)
    563       {
    564 	if (_M_pi != 0)
    565 	  _M_pi->_M_add_ref_copy();
    566       }
    567 
    568       __shared_count&
    569       operator=(const __shared_count& __r) noexcept
    570       {
    571 	_Sp_counted_base<_Lp>* __tmp = __r._M_pi;
    572 	if (__tmp != _M_pi)
    573 	  {
    574 	    if (__tmp != 0)
    575 	      __tmp->_M_add_ref_copy();
    576 	    if (_M_pi != 0)
    577 	      _M_pi->_M_release();
    578 	    _M_pi = __tmp;
    579 	  }
    580 	return *this;
    581       }
    582 
    583       void
    584       _M_swap(__shared_count& __r) noexcept
    585       {
    586 	_Sp_counted_base<_Lp>* __tmp = __r._M_pi;
    587 	__r._M_pi = _M_pi;
    588 	_M_pi = __tmp;
    589       }
    590 
    591       long
    592       _M_get_use_count() const noexcept
    593       { return _M_pi != 0 ? _M_pi->_M_get_use_count() : 0; }
    594 
    595       bool
    596       _M_unique() const noexcept
    597       { return this->_M_get_use_count() == 1; }
    598 
    599       void*
    600       _M_get_deleter(const std::type_info& __ti) const noexcept
    601       { return _M_pi ? _M_pi->_M_get_deleter(__ti) : 0; }
    602 
    603       bool
    604       _M_less(const __shared_count& __rhs) const noexcept
    605       { return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
    606 
    607       bool
    608       _M_less(const __weak_count<_Lp>& __rhs) const noexcept
    609       { return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
    610 
    611       // Friend function injected into enclosing namespace and found by ADL
    612       friend inline bool
    613       operator==(const __shared_count& __a, const __shared_count& __b) noexcept
    614       { return __a._M_pi == __b._M_pi; }
    615 
    616     private:
    617       friend class __weak_count<_Lp>;
    618 
    619       template<typename _Tp, typename _Del>
    620 	static _Sp_counted_base<_Lp>*
    621 	_S_create_from_up(std::unique_ptr<_Tp, _Del>&& __r,
    622 	  typename std::enable_if<!std::is_reference<_Del>::value>::type* = 0)
    623 	{
    624 	  return new _Sp_counted_deleter<_Tp*, _Del, std::allocator<_Tp>,
    625 	    _Lp>(__r.get(), __r.get_deleter());
    626 	}
    627 
    628       template<typename _Tp, typename _Del>
    629 	static _Sp_counted_base<_Lp>*
    630 	_S_create_from_up(std::unique_ptr<_Tp, _Del>&& __r,
    631 	  typename std::enable_if<std::is_reference<_Del>::value>::type* = 0)
    632 	{
    633 	  typedef typename std::remove_reference<_Del>::type _Del1;
    634 	  typedef std::reference_wrapper<_Del1> _Del2;
    635 	  return new _Sp_counted_deleter<_Tp*, _Del2, std::allocator<_Tp>,
    636 	    _Lp>(__r.get(), std::ref(__r.get_deleter()));
    637 	}
    638 
    639       _Sp_counted_base<_Lp>*  _M_pi;
    640     };
    641 
    642 
    643   template<_Lock_policy _Lp>
    644     class __weak_count
    645     {
    646     public:
    647       constexpr __weak_count() noexcept : _M_pi(0)
    648       { }
    649 
    650       __weak_count(const __shared_count<_Lp>& __r) noexcept
    651       : _M_pi(__r._M_pi)
    652       {
    653 	if (_M_pi != 0)
    654 	  _M_pi->_M_weak_add_ref();
    655       }
    656 
    657       __weak_count(const __weak_count<_Lp>& __r) noexcept
    658       : _M_pi(__r._M_pi)
    659       {
    660 	if (_M_pi != 0)
    661 	  _M_pi->_M_weak_add_ref();
    662       }
    663 
    664       ~__weak_count() noexcept
    665       {
    666 	if (_M_pi != 0)
    667 	  _M_pi->_M_weak_release();
    668       }
    669 
    670       __weak_count<_Lp>&
    671       operator=(const __shared_count<_Lp>& __r) noexcept
    672       {
    673 	_Sp_counted_base<_Lp>* __tmp = __r._M_pi;
    674 	if (__tmp != 0)
    675 	  __tmp->_M_weak_add_ref();
    676 	if (_M_pi != 0)
    677 	  _M_pi->_M_weak_release();
    678 	_M_pi = __tmp;
    679 	return *this;
    680       }
    681 
    682       __weak_count<_Lp>&
    683       operator=(const __weak_count<_Lp>& __r) noexcept
    684       {
    685 	_Sp_counted_base<_Lp>* __tmp = __r._M_pi;
    686 	if (__tmp != 0)
    687 	  __tmp->_M_weak_add_ref();
    688 	if (_M_pi != 0)
    689 	  _M_pi->_M_weak_release();
    690 	_M_pi = __tmp;
    691 	return *this;
    692       }
    693 
    694       void
    695       _M_swap(__weak_count<_Lp>& __r) noexcept
    696       {
    697 	_Sp_counted_base<_Lp>* __tmp = __r._M_pi;
    698 	__r._M_pi = _M_pi;
    699 	_M_pi = __tmp;
    700       }
    701 
    702       long
    703       _M_get_use_count() const noexcept
    704       { return _M_pi != 0 ? _M_pi->_M_get_use_count() : 0; }
    705 
    706       bool
    707       _M_less(const __weak_count& __rhs) const noexcept
    708       { return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
    709 
    710       bool
    711       _M_less(const __shared_count<_Lp>& __rhs) const noexcept
    712       { return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
    713 
    714       // Friend function injected into enclosing namespace and found by ADL
    715       friend inline bool
    716       operator==(const __weak_count& __a, const __weak_count& __b) noexcept
    717       { return __a._M_pi == __b._M_pi; }
    718 
    719     private:
    720       friend class __shared_count<_Lp>;
    721 
    722       _Sp_counted_base<_Lp>*  _M_pi;
    723     };
    724 
    725   // Now that __weak_count is defined we can define this constructor:
    726   template<_Lock_policy _Lp>
    727     inline __shared_count<_Lp>:: __shared_count(const __weak_count<_Lp>& __r)
    728     : _M_pi(__r._M_pi)
    729     {
    730       if (_M_pi != 0)
    731 	_M_pi->_M_add_ref_lock();
    732       else
    733 	__throw_bad_weak_ptr();
    734     }
    735 
    736 
    737   // Support for enable_shared_from_this.
    738 
    739   // Friend of __enable_shared_from_this.
    740   template<_Lock_policy _Lp, typename _Tp1, typename _Tp2>
    741     void
    742     __enable_shared_from_this_helper(const __shared_count<_Lp>&,
    743 				     const __enable_shared_from_this<_Tp1,
    744 				     _Lp>*, const _Tp2*) noexcept;
    745 
    746   // Friend of enable_shared_from_this.
    747   template<typename _Tp1, typename _Tp2>
    748     void
    749     __enable_shared_from_this_helper(const __shared_count<>&,
    750 				     const enable_shared_from_this<_Tp1>*,
    751 				     const _Tp2*) noexcept;
    752 
    753   template<_Lock_policy _Lp>
    754     inline void
    755     __enable_shared_from_this_helper(const __shared_count<_Lp>&, ...) noexcept
    756     { }
    757 
    758 
    759   template<typename _Tp, _Lock_policy _Lp>
    760     class __shared_ptr
    761     {
    762     public:
    763       typedef _Tp   element_type;
    764 
    765       constexpr __shared_ptr() noexcept
    766       : _M_ptr(0), _M_refcount()
    767       { }
    768 
    769       template<typename _Tp1>
    770 	explicit __shared_ptr(_Tp1* __p)
    771         : _M_ptr(__p), _M_refcount(__p)
    772 	{
    773 	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
    774 	  static_assert( sizeof(_Tp1) > 0, "incomplete type" );
    775 	  __enable_shared_from_this_helper(_M_refcount, __p, __p);
    776 	}
    777 
    778       template<typename _Tp1, typename _Deleter>
    779 	__shared_ptr(_Tp1* __p, _Deleter __d)
    780 	: _M_ptr(__p), _M_refcount(__p, __d)
    781 	{
    782 	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
    783 	  // TODO requires _Deleter CopyConstructible and __d(__p) well-formed
    784 	  __enable_shared_from_this_helper(_M_refcount, __p, __p);
    785 	}
    786 
    787       template<typename _Tp1, typename _Deleter, typename _Alloc>
    788 	__shared_ptr(_Tp1* __p, _Deleter __d, _Alloc __a)
    789 	: _M_ptr(__p), _M_refcount(__p, __d, std::move(__a))
    790 	{
    791 	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
    792 	  // TODO requires _Deleter CopyConstructible and __d(__p) well-formed
    793 	  __enable_shared_from_this_helper(_M_refcount, __p, __p);
    794 	}
    795 
    796       template<typename _Deleter>
    797 	__shared_ptr(nullptr_t __p, _Deleter __d)
    798 	: _M_ptr(0), _M_refcount(__p, __d)
    799 	{ }
    800 
    801       template<typename _Deleter, typename _Alloc>
    802         __shared_ptr(nullptr_t __p, _Deleter __d, _Alloc __a)
    803 	: _M_ptr(0), _M_refcount(__p, __d, std::move(__a))
    804 	{ }
    805 
    806       template<typename _Tp1>
    807 	__shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, _Tp* __p) noexcept
    808 	: _M_ptr(__p), _M_refcount(__r._M_refcount) // never throws
    809 	{ }
    810 
    811       __shared_ptr(const __shared_ptr&) noexcept = default;
    812       __shared_ptr& operator=(const __shared_ptr&) noexcept = default;
    813       ~__shared_ptr() = default;
    814 
    815       template<typename _Tp1, typename = typename
    816 	       std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
    817 	__shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
    818 	: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount)
    819 	{ }
    820 
    821       __shared_ptr(__shared_ptr&& __r) noexcept
    822       : _M_ptr(__r._M_ptr), _M_refcount()
    823       {
    824 	_M_refcount._M_swap(__r._M_refcount);
    825 	__r._M_ptr = 0;
    826       }
    827 
    828       template<typename _Tp1, typename = typename
    829 	       std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
    830 	__shared_ptr(__shared_ptr<_Tp1, _Lp>&& __r) noexcept
    831 	: _M_ptr(__r._M_ptr), _M_refcount()
    832 	{
    833 	  _M_refcount._M_swap(__r._M_refcount);
    834 	  __r._M_ptr = 0;
    835 	}
    836 
    837       template<typename _Tp1>
    838 	explicit __shared_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
    839 	: _M_refcount(__r._M_refcount) // may throw
    840 	{
    841 	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
    842 
    843 	  // It is now safe to copy __r._M_ptr, as
    844 	  // _M_refcount(__r._M_refcount) did not throw.
    845 	  _M_ptr = __r._M_ptr;
    846 	}
    847 
    848       // If an exception is thrown this constructor has no effect.
    849       template<typename _Tp1, typename _Del>
    850 	__shared_ptr(std::unique_ptr<_Tp1, _Del>&& __r)
    851 	: _M_ptr(__r.get()), _M_refcount()
    852 	{
    853 	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
    854 	  _Tp1* __tmp = __r.get();
    855 	  _M_refcount = __shared_count<_Lp>(std::move(__r));
    856 	  __enable_shared_from_this_helper(_M_refcount, __tmp, __tmp);
    857 	}
    858 
    859 #if _GLIBCXX_USE_DEPRECATED
    860       // Postcondition: use_count() == 1 and __r.get() == 0
    861       template<typename _Tp1>
    862 	__shared_ptr(std::auto_ptr<_Tp1>&& __r)
    863 	: _M_ptr(__r.get()), _M_refcount()
    864 	{
    865 	  __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
    866 	  static_assert( sizeof(_Tp1) > 0, "incomplete type" );
    867 	  _Tp1* __tmp = __r.get();
    868 	  _M_refcount = __shared_count<_Lp>(std::move(__r));
    869 	  __enable_shared_from_this_helper(_M_refcount, __tmp, __tmp);
    870 	}
    871 #endif
    872 
    873       /* TODO: use delegating constructor */
    874       constexpr __shared_ptr(nullptr_t) noexcept
    875       : _M_ptr(0), _M_refcount()
    876       { }
    877 
    878       template<typename _Tp1>
    879 	__shared_ptr&
    880 	operator=(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
    881 	{
    882 	  _M_ptr = __r._M_ptr;
    883 	  _M_refcount = __r._M_refcount; // __shared_count::op= doesn't throw
    884 	  return *this;
    885 	}
    886 
    887 #if _GLIBCXX_USE_DEPRECATED
    888       template<typename _Tp1>
    889 	__shared_ptr&
    890 	operator=(std::auto_ptr<_Tp1>&& __r)
    891 	{
    892 	  __shared_ptr(std::move(__r)).swap(*this);
    893 	  return *this;
    894 	}
    895 #endif
    896 
    897       __shared_ptr&
    898       operator=(__shared_ptr&& __r) noexcept
    899       {
    900 	__shared_ptr(std::move(__r)).swap(*this);
    901 	return *this;
    902       }
    903 
    904       template<class _Tp1>
    905 	__shared_ptr&
    906 	operator=(__shared_ptr<_Tp1, _Lp>&& __r) noexcept
    907 	{
    908 	  __shared_ptr(std::move(__r)).swap(*this);
    909 	  return *this;
    910 	}
    911 
    912       template<typename _Tp1, typename _Del>
    913 	__shared_ptr&
    914 	operator=(std::unique_ptr<_Tp1, _Del>&& __r)
    915 	{
    916 	  __shared_ptr(std::move(__r)).swap(*this);
    917 	  return *this;
    918 	}
    919 
    920       void
    921       reset() noexcept
    922       { __shared_ptr().swap(*this); }
    923 
    924       template<typename _Tp1>
    925 	void
    926 	reset(_Tp1* __p) // _Tp1 must be complete.
    927 	{
    928 	  // Catch self-reset errors.
    929 	  _GLIBCXX_DEBUG_ASSERT(__p == 0 || __p != _M_ptr);
    930 	  __shared_ptr(__p).swap(*this);
    931 	}
    932 
    933       template<typename _Tp1, typename _Deleter>
    934 	void
    935 	reset(_Tp1* __p, _Deleter __d)
    936 	{ __shared_ptr(__p, __d).swap(*this); }
    937 
    938       template<typename _Tp1, typename _Deleter, typename _Alloc>
    939 	void
    940         reset(_Tp1* __p, _Deleter __d, _Alloc __a)
    941         { __shared_ptr(__p, __d, std::move(__a)).swap(*this); }
    942 
    943       // Allow class instantiation when _Tp is [cv-qual] void.
    944       typename std::add_lvalue_reference<_Tp>::type
    945       operator*() const noexcept
    946       {
    947 	_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
    948 	return *_M_ptr;
    949       }
    950 
    951       _Tp*
    952       operator->() const noexcept
    953       {
    954 	_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
    955 	return _M_ptr;
    956       }
    957 
    958       _Tp*
    959       get() const noexcept
    960       { return _M_ptr; }
    961 
    962       explicit operator bool() const // never throws
    963       { return _M_ptr == 0 ? false : true; }
    964 
    965       bool
    966       unique() const noexcept
    967       { return _M_refcount._M_unique(); }
    968 
    969       long
    970       use_count() const noexcept
    971       { return _M_refcount._M_get_use_count(); }
    972 
    973       void
    974       swap(__shared_ptr<_Tp, _Lp>& __other) noexcept
    975       {
    976 	std::swap(_M_ptr, __other._M_ptr);
    977 	_M_refcount._M_swap(__other._M_refcount);
    978       }
    979 
    980       template<typename _Tp1>
    981 	bool
    982 	owner_before(__shared_ptr<_Tp1, _Lp> const& __rhs) const
    983 	{ return _M_refcount._M_less(__rhs._M_refcount); }
    984 
    985       template<typename _Tp1>
    986 	bool
    987 	owner_before(__weak_ptr<_Tp1, _Lp> const& __rhs) const
    988 	{ return _M_refcount._M_less(__rhs._M_refcount); }
    989 
    990 #ifdef __GXX_RTTI
    991     protected:
    992       // This constructor is non-standard, it is used by allocate_shared.
    993       template<typename _Alloc, typename... _Args>
    994 	__shared_ptr(_Sp_make_shared_tag __tag, const _Alloc& __a,
    995 		     _Args&&... __args)
    996 	: _M_ptr(), _M_refcount(__tag, (_Tp*)0, __a,
    997 				std::forward<_Args>(__args)...)
    998 	{
    999 	  // _M_ptr needs to point to the newly constructed object.
   1000 	  // This relies on _Sp_counted_ptr_inplace::_M_get_deleter.
   1001 	  void* __p = _M_refcount._M_get_deleter(typeid(__tag));
   1002 	  _M_ptr = static_cast<_Tp*>(__p);
   1003 	  __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
   1004 	}
   1005 #else
   1006       template<typename _Alloc>
   1007         struct _Deleter
   1008         {
   1009           void operator()(_Tp* __ptr)
   1010           {
   1011 	    typedef allocator_traits<_Alloc> _Alloc_traits;
   1012 	    _Alloc_traits::destroy(_M_alloc, __ptr);
   1013 	    _Alloc_traits::deallocate(_M_alloc, __ptr, 1);
   1014           }
   1015           _Alloc _M_alloc;
   1016         };
   1017 
   1018       template<typename _Alloc, typename... _Args>
   1019 	__shared_ptr(_Sp_make_shared_tag __tag, const _Alloc& __a,
   1020 		     _Args&&... __args)
   1021 	: _M_ptr(), _M_refcount()
   1022         {
   1023 	  typedef typename _Alloc::template rebind<_Tp>::other _Alloc2;
   1024           _Deleter<_Alloc2> __del = { _Alloc2(__a) };
   1025 	  typedef allocator_traits<_Alloc2> __traits;
   1026           _M_ptr = __traits::allocate(__del._M_alloc, 1);
   1027 	  __try
   1028 	    {
   1029 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1030 	      // 2070. allocate_shared should use allocator_traits<A>::construct
   1031 	      __traits::construct(__del._M_alloc, _M_ptr,
   1032 		                  std::forward<_Args>(__args)...);
   1033 	    }
   1034 	  __catch(...)
   1035 	    {
   1036 	      __traits::deallocate(__del._M_alloc, _M_ptr, 1);
   1037 	      __throw_exception_again;
   1038 	    }
   1039           __shared_count<_Lp> __count(_M_ptr, __del, __del._M_alloc);
   1040           _M_refcount._M_swap(__count);
   1041 	  __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
   1042         }
   1043 #endif
   1044 
   1045       template<typename _Tp1, _Lock_policy _Lp1, typename _Alloc,
   1046 	       typename... _Args>
   1047 	friend __shared_ptr<_Tp1, _Lp1>
   1048 	__allocate_shared(const _Alloc& __a, _Args&&... __args);
   1049 
   1050     private:
   1051       void*
   1052       _M_get_deleter(const std::type_info& __ti) const noexcept
   1053       { return _M_refcount._M_get_deleter(__ti); }
   1054 
   1055       template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
   1056       template<typename _Tp1, _Lock_policy _Lp1> friend class __weak_ptr;
   1057 
   1058       template<typename _Del, typename _Tp1, _Lock_policy _Lp1>
   1059 	friend _Del* get_deleter(const __shared_ptr<_Tp1, _Lp1>&) noexcept;
   1060 
   1061       _Tp*	   	   _M_ptr;         // Contained pointer.
   1062       __shared_count<_Lp>  _M_refcount;    // Reference counter.
   1063     };
   1064 
   1065 
   1066   // 20.8.13.2.7 shared_ptr comparisons
   1067   template<typename _Tp1, typename _Tp2, _Lock_policy _Lp>
   1068     inline bool
   1069     operator==(const __shared_ptr<_Tp1, _Lp>& __a,
   1070 	       const __shared_ptr<_Tp2, _Lp>& __b) noexcept
   1071     { return __a.get() == __b.get(); }
   1072 
   1073   template<typename _Tp, _Lock_policy _Lp>
   1074     inline bool
   1075     operator==(const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
   1076     { return !__a; }
   1077 
   1078   template<typename _Tp, _Lock_policy _Lp>
   1079     inline bool
   1080     operator==(nullptr_t, const __shared_ptr<_Tp, _Lp>& __a) noexcept
   1081     { return !__a; }
   1082 
   1083   template<typename _Tp1, typename _Tp2, _Lock_policy _Lp>
   1084     inline bool
   1085     operator!=(const __shared_ptr<_Tp1, _Lp>& __a,
   1086 	       const __shared_ptr<_Tp2, _Lp>& __b) noexcept
   1087     { return __a.get() != __b.get(); }
   1088 
   1089   template<typename _Tp, _Lock_policy _Lp>
   1090     inline bool
   1091     operator!=(const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
   1092     { return (bool)__a; }
   1093 
   1094   template<typename _Tp, _Lock_policy _Lp>
   1095     inline bool
   1096     operator!=(nullptr_t, const __shared_ptr<_Tp, _Lp>& __a) noexcept
   1097     { return (bool)__a; }
   1098 
   1099   template<typename _Tp1, typename _Tp2, _Lock_policy _Lp>
   1100     inline bool
   1101     operator<(const __shared_ptr<_Tp1, _Lp>& __a,
   1102 	      const __shared_ptr<_Tp2, _Lp>& __b) noexcept
   1103     {
   1104       typedef typename std::common_type<_Tp1*, _Tp2*>::type _CT;
   1105       return std::less<_CT>()(__a.get(), __b.get());
   1106     }
   1107 
   1108   template<typename _Tp, _Lock_policy _Lp>
   1109     inline bool
   1110     operator<(const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
   1111     { return std::less<_Tp*>()(__a.get(), nullptr); }
   1112 
   1113   template<typename _Tp, _Lock_policy _Lp>
   1114     inline bool
   1115     operator<(nullptr_t, const __shared_ptr<_Tp, _Lp>& __a) noexcept
   1116     { return std::less<_Tp*>()(nullptr, __a.get()); }
   1117 
   1118   template<typename _Tp1, typename _Tp2, _Lock_policy _Lp>
   1119     inline bool
   1120     operator<=(const __shared_ptr<_Tp1, _Lp>& __a,
   1121 	       const __shared_ptr<_Tp2, _Lp>& __b) noexcept
   1122     { return !(__b < __a); }
   1123 
   1124   template<typename _Tp, _Lock_policy _Lp>
   1125     inline bool
   1126     operator<=(const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
   1127     { return !(nullptr < __a); }
   1128 
   1129   template<typename _Tp, _Lock_policy _Lp>
   1130     inline bool
   1131     operator<=(nullptr_t, const __shared_ptr<_Tp, _Lp>& __a) noexcept
   1132     { return !(__a < nullptr); }
   1133 
   1134   template<typename _Tp1, typename _Tp2, _Lock_policy _Lp>
   1135     inline bool
   1136     operator>(const __shared_ptr<_Tp1, _Lp>& __a,
   1137 	      const __shared_ptr<_Tp2, _Lp>& __b) noexcept
   1138     { return (__b < __a); }
   1139 
   1140   template<typename _Tp, _Lock_policy _Lp>
   1141     inline bool
   1142     operator>(const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
   1143     { return std::less<_Tp*>()(nullptr, __a.get()); }
   1144 
   1145   template<typename _Tp, _Lock_policy _Lp>
   1146     inline bool
   1147     operator>(nullptr_t, const __shared_ptr<_Tp, _Lp>& __a) noexcept
   1148     { return std::less<_Tp*>()(__a.get(), nullptr); }
   1149 
   1150   template<typename _Tp1, typename _Tp2, _Lock_policy _Lp>
   1151     inline bool
   1152     operator>=(const __shared_ptr<_Tp1, _Lp>& __a,
   1153 	       const __shared_ptr<_Tp2, _Lp>& __b) noexcept
   1154     { return !(__a < __b); }
   1155 
   1156   template<typename _Tp, _Lock_policy _Lp>
   1157     inline bool
   1158     operator>=(const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
   1159     { return !(__a < nullptr); }
   1160 
   1161   template<typename _Tp, _Lock_policy _Lp>
   1162     inline bool
   1163     operator>=(nullptr_t, const __shared_ptr<_Tp, _Lp>& __a) noexcept
   1164     { return !(nullptr < __a); }
   1165 
   1166   template<typename _Sp>
   1167     struct _Sp_less : public binary_function<_Sp, _Sp, bool>
   1168     {
   1169       bool
   1170       operator()(const _Sp& __lhs, const _Sp& __rhs) const noexcept
   1171       {
   1172 	typedef typename _Sp::element_type element_type;
   1173 	return std::less<element_type*>()(__lhs.get(), __rhs.get());
   1174       }
   1175     };
   1176 
   1177   template<typename _Tp, _Lock_policy _Lp>
   1178     struct less<__shared_ptr<_Tp, _Lp>>
   1179     : public _Sp_less<__shared_ptr<_Tp, _Lp>>
   1180     { };
   1181 
   1182   // 2.2.3.8 shared_ptr specialized algorithms.
   1183   template<typename _Tp, _Lock_policy _Lp>
   1184     inline void
   1185     swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>& __b) noexcept
   1186     { __a.swap(__b); }
   1187 
   1188   // 2.2.3.9 shared_ptr casts
   1189 
   1190   // The seemingly equivalent code:
   1191   // shared_ptr<_Tp, _Lp>(static_cast<_Tp*>(__r.get()))
   1192   // will eventually result in undefined behaviour, attempting to
   1193   // delete the same object twice.
   1194   /// static_pointer_cast
   1195   template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
   1196     inline __shared_ptr<_Tp, _Lp>
   1197     static_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
   1198     { return __shared_ptr<_Tp, _Lp>(__r, static_cast<_Tp*>(__r.get())); }
   1199 
   1200   // The seemingly equivalent code:
   1201   // shared_ptr<_Tp, _Lp>(const_cast<_Tp*>(__r.get()))
   1202   // will eventually result in undefined behaviour, attempting to
   1203   // delete the same object twice.
   1204   /// const_pointer_cast
   1205   template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
   1206     inline __shared_ptr<_Tp, _Lp>
   1207     const_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
   1208     { return __shared_ptr<_Tp, _Lp>(__r, const_cast<_Tp*>(__r.get())); }
   1209 
   1210   // The seemingly equivalent code:
   1211   // shared_ptr<_Tp, _Lp>(dynamic_cast<_Tp*>(__r.get()))
   1212   // will eventually result in undefined behaviour, attempting to
   1213   // delete the same object twice.
   1214   /// dynamic_pointer_cast
   1215   template<typename _Tp, typename _Tp1, _Lock_policy _Lp>
   1216     inline __shared_ptr<_Tp, _Lp>
   1217     dynamic_pointer_cast(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
   1218     {
   1219       if (_Tp* __p = dynamic_cast<_Tp*>(__r.get()))
   1220 	return __shared_ptr<_Tp, _Lp>(__r, __p);
   1221       return __shared_ptr<_Tp, _Lp>();
   1222     }
   1223 
   1224 
   1225   template<typename _Tp, _Lock_policy _Lp>
   1226     class __weak_ptr
   1227     {
   1228     public:
   1229       typedef _Tp element_type;
   1230 
   1231       constexpr __weak_ptr() noexcept
   1232       : _M_ptr(0), _M_refcount()
   1233       { }
   1234 
   1235       __weak_ptr(const __weak_ptr&) noexcept = default;
   1236       __weak_ptr& operator=(const __weak_ptr&) noexcept = default;
   1237       ~__weak_ptr() = default;
   1238 
   1239       // The "obvious" converting constructor implementation:
   1240       //
   1241       //  template<typename _Tp1>
   1242       //    __weak_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
   1243       //    : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
   1244       //    { }
   1245       //
   1246       // has a serious problem.
   1247       //
   1248       //  __r._M_ptr may already have been invalidated. The _M_ptr(__r._M_ptr)
   1249       //  conversion may require access to *__r._M_ptr (virtual inheritance).
   1250       //
   1251       // It is not possible to avoid spurious access violations since
   1252       // in multithreaded programs __r._M_ptr may be invalidated at any point.
   1253       template<typename _Tp1, typename = typename
   1254 	       std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
   1255 	__weak_ptr(const __weak_ptr<_Tp1, _Lp>& __r) noexcept
   1256 	: _M_refcount(__r._M_refcount)
   1257         { _M_ptr = __r.lock().get(); }
   1258 
   1259       template<typename _Tp1, typename = typename
   1260 	       std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
   1261 	__weak_ptr(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
   1262 	: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount)
   1263 	{ }
   1264 
   1265       template<typename _Tp1>
   1266 	__weak_ptr&
   1267 	operator=(const __weak_ptr<_Tp1, _Lp>& __r) noexcept
   1268 	{
   1269 	  _M_ptr = __r.lock().get();
   1270 	  _M_refcount = __r._M_refcount;
   1271 	  return *this;
   1272 	}
   1273 
   1274       template<typename _Tp1>
   1275 	__weak_ptr&
   1276 	operator=(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
   1277 	{
   1278 	  _M_ptr = __r._M_ptr;
   1279 	  _M_refcount = __r._M_refcount;
   1280 	  return *this;
   1281 	}
   1282 
   1283       __shared_ptr<_Tp, _Lp>
   1284       lock() const noexcept
   1285       {
   1286 #ifdef __GTHREADS
   1287 	// Optimization: avoid throw overhead.
   1288 	if (expired())
   1289 	  return __shared_ptr<element_type, _Lp>();
   1290 
   1291 	__try
   1292 	  {
   1293 	    return __shared_ptr<element_type, _Lp>(*this);
   1294 	  }
   1295 	__catch(const bad_weak_ptr&)
   1296 	  {
   1297 	    // Q: How can we get here?
   1298 	    // A: Another thread may have invalidated r after the
   1299 	    //    use_count test above.
   1300 	    return __shared_ptr<element_type, _Lp>();
   1301 	  }
   1302 
   1303 #else
   1304 	// Optimization: avoid try/catch overhead when single threaded.
   1305 	return expired() ? __shared_ptr<element_type, _Lp>()
   1306 			 : __shared_ptr<element_type, _Lp>(*this);
   1307 
   1308 #endif
   1309       } // XXX MT
   1310 
   1311       long
   1312       use_count() const noexcept
   1313       { return _M_refcount._M_get_use_count(); }
   1314 
   1315       bool
   1316       expired() const noexcept
   1317       { return _M_refcount._M_get_use_count() == 0; }
   1318 
   1319       template<typename _Tp1>
   1320 	bool
   1321 	owner_before(const __shared_ptr<_Tp1, _Lp>& __rhs) const
   1322 	{ return _M_refcount._M_less(__rhs._M_refcount); }
   1323 
   1324       template<typename _Tp1>
   1325 	bool
   1326 	owner_before(const __weak_ptr<_Tp1, _Lp>& __rhs) const
   1327 	{ return _M_refcount._M_less(__rhs._M_refcount); }
   1328 
   1329       void
   1330       reset() noexcept
   1331       { __weak_ptr().swap(*this); }
   1332 
   1333       void
   1334       swap(__weak_ptr& __s) noexcept
   1335       {
   1336 	std::swap(_M_ptr, __s._M_ptr);
   1337 	_M_refcount._M_swap(__s._M_refcount);
   1338       }
   1339 
   1340     private:
   1341       // Used by __enable_shared_from_this.
   1342       void
   1343       _M_assign(_Tp* __ptr, const __shared_count<_Lp>& __refcount) noexcept
   1344       {
   1345 	_M_ptr = __ptr;
   1346 	_M_refcount = __refcount;
   1347       }
   1348 
   1349       template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
   1350       template<typename _Tp1, _Lock_policy _Lp1> friend class __weak_ptr;
   1351       friend class __enable_shared_from_this<_Tp, _Lp>;
   1352       friend class enable_shared_from_this<_Tp>;
   1353 
   1354       _Tp*	 	 _M_ptr;         // Contained pointer.
   1355       __weak_count<_Lp>  _M_refcount;    // Reference counter.
   1356     };
   1357 
   1358   // 20.8.13.3.7 weak_ptr specialized algorithms.
   1359   template<typename _Tp, _Lock_policy _Lp>
   1360     inline void
   1361     swap(__weak_ptr<_Tp, _Lp>& __a, __weak_ptr<_Tp, _Lp>& __b) noexcept
   1362     { __a.swap(__b); }
   1363 
   1364   template<typename _Tp, typename _Tp1>
   1365     struct _Sp_owner_less : public binary_function<_Tp, _Tp, bool>
   1366     {
   1367       bool
   1368       operator()(const _Tp& __lhs, const _Tp& __rhs) const
   1369       { return __lhs.owner_before(__rhs); }
   1370 
   1371       bool
   1372       operator()(const _Tp& __lhs, const _Tp1& __rhs) const
   1373       { return __lhs.owner_before(__rhs); }
   1374 
   1375       bool
   1376       operator()(const _Tp1& __lhs, const _Tp& __rhs) const
   1377       { return __lhs.owner_before(__rhs); }
   1378     };
   1379 
   1380   template<typename _Tp, _Lock_policy _Lp>
   1381     struct owner_less<__shared_ptr<_Tp, _Lp>>
   1382     : public _Sp_owner_less<__shared_ptr<_Tp, _Lp>, __weak_ptr<_Tp, _Lp>>
   1383     { };
   1384 
   1385   template<typename _Tp, _Lock_policy _Lp>
   1386     struct owner_less<__weak_ptr<_Tp, _Lp>>
   1387     : public _Sp_owner_less<__weak_ptr<_Tp, _Lp>, __shared_ptr<_Tp, _Lp>>
   1388     { };
   1389 
   1390 
   1391   template<typename _Tp, _Lock_policy _Lp>
   1392     class __enable_shared_from_this
   1393     {
   1394     protected:
   1395       constexpr __enable_shared_from_this() noexcept { }
   1396 
   1397       __enable_shared_from_this(const __enable_shared_from_this&) noexcept { }
   1398 
   1399       __enable_shared_from_this&
   1400       operator=(const __enable_shared_from_this&) noexcept
   1401       { return *this; }
   1402 
   1403       ~__enable_shared_from_this() { }
   1404 
   1405     public:
   1406       __shared_ptr<_Tp, _Lp>
   1407       shared_from_this()
   1408       { return __shared_ptr<_Tp, _Lp>(this->_M_weak_this); }
   1409 
   1410       __shared_ptr<const _Tp, _Lp>
   1411       shared_from_this() const
   1412       { return __shared_ptr<const _Tp, _Lp>(this->_M_weak_this); }
   1413 
   1414     private:
   1415       template<typename _Tp1>
   1416 	void
   1417 	_M_weak_assign(_Tp1* __p, const __shared_count<_Lp>& __n) const noexcept
   1418 	{ _M_weak_this._M_assign(__p, __n); }
   1419 
   1420       template<typename _Tp1>
   1421 	friend void
   1422 	__enable_shared_from_this_helper(const __shared_count<_Lp>& __pn,
   1423 					 const __enable_shared_from_this* __pe,
   1424 					 const _Tp1* __px) noexcept
   1425 	{
   1426 	  if (__pe != 0)
   1427 	    __pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
   1428 	}
   1429 
   1430       mutable __weak_ptr<_Tp, _Lp>  _M_weak_this;
   1431     };
   1432 
   1433 
   1434   template<typename _Tp, _Lock_policy _Lp, typename _Alloc, typename... _Args>
   1435     inline __shared_ptr<_Tp, _Lp>
   1436     __allocate_shared(const _Alloc& __a, _Args&&... __args)
   1437     {
   1438       return __shared_ptr<_Tp, _Lp>(_Sp_make_shared_tag(), __a,
   1439 				    std::forward<_Args>(__args)...);
   1440     }
   1441 
   1442   template<typename _Tp, _Lock_policy _Lp, typename... _Args>
   1443     inline __shared_ptr<_Tp, _Lp>
   1444     __make_shared(_Args&&... __args)
   1445     {
   1446       typedef typename std::remove_const<_Tp>::type _Tp_nc;
   1447       return std::__allocate_shared<_Tp, _Lp>(std::allocator<_Tp_nc>(),
   1448 					      std::forward<_Args>(__args)...);
   1449     }
   1450 
   1451   /// std::hash specialization for __shared_ptr.
   1452   template<typename _Tp, _Lock_policy _Lp>
   1453     struct hash<__shared_ptr<_Tp, _Lp>>
   1454     : public __hash_base<size_t, __shared_ptr<_Tp, _Lp>>
   1455     {
   1456       size_t
   1457       operator()(const __shared_ptr<_Tp, _Lp>& __s) const noexcept
   1458       { return std::hash<_Tp*>()(__s.get()); }
   1459     };
   1460 
   1461 _GLIBCXX_END_NAMESPACE_VERSION
   1462 } // namespace
   1463 
   1464 #endif // _SHARED_PTR_BASE_H
   1465