std::hash specialization for __shared_ptr.
Thown by exception safety machinery.
Base class for checking address and label information about allocations. Create a std::map between the allocated address (void*) and a datum for annotations, which are a pair of numbers corresponding to label and allocated size.
Base struct for condition policy.
Base class for incremental control and throw.
Never enter the condition.
Always enter the condition.
Enter the nth condition.
Base class for random probability control and throw.
Group condition.
Never enter the condition.
Always enter the condition.
Class with exception generation control. Intended to be used as a value_type in templatized code.
Note: Destructor not allowed to throw.
Type throwing via limit condition.
Type throwing via random condition.
Allocator class with logging and exception generation control. Intended to be used as an allocator_type in templatized code.
Note: Deallocate not allowed to throw.
Allocator throwing via limit condition.
Allocator throwing via random condition.
54 _GLIBCXX_BEGIN_NAMESPACE_VERSION
56 #if _GLIBCXX_USE_DEPRECATED
57 template<
typename>
class auto_ptr;
64 class bad_weak_ptr :
public std::exception
68 what() const noexcept;
70 virtual ~bad_weak_ptr() noexcept;
75 __throw_bad_weak_ptr()
76 { _GLIBCXX_THROW_OR_ABORT(bad_weak_ptr()); }
78 using __gnu_cxx::_Lock_policy;
79 using __gnu_cxx::__default_lock_policy;
80 using __gnu_cxx::_S_single;
81 using __gnu_cxx::_S_mutex;
82 using __gnu_cxx::_S_atomic;
85 template<_Lock_policy _Lp>
90 enum { _S_need_barriers = 0 };
94 class _Mutex_base<_S_mutex>
95 :
public __gnu_cxx::__mutex
101 enum { _S_need_barriers = 1 };
104 template<_Lock_policy _Lp = __default_lock_policy>
105 class _Sp_counted_base
106 :
public _Mutex_base<_Lp>
109 _Sp_counted_base() noexcept
110 : _M_use_count(1), _M_weak_count(1) { }
113 ~_Sp_counted_base() noexcept
119 _M_dispose() noexcept = 0;
123 _M_destroy() noexcept
131 { __gnu_cxx::__atomic_add_dispatch(&_M_use_count, 1); }
137 _M_release() noexcept
140 _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_use_count);
141 if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, -1) == 1)
143 _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_use_count);
149 if (_Mutex_base<_Lp>::_S_need_barriers)
156 _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_weak_count);
157 if (__gnu_cxx::__exchange_and_add_dispatch(&_M_weak_count,
160 _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_weak_count);
167 _M_weak_add_ref() noexcept
168 { __gnu_cxx::__atomic_add_dispatch(&_M_weak_count, 1); }
171 _M_weak_release() noexcept
174 _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_weak_count);
175 if (__gnu_cxx::__exchange_and_add_dispatch(&_M_weak_count, -1) == 1)
177 _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_weak_count);
178 if (_Mutex_base<_Lp>::_S_need_barriers)
190 _M_get_use_count() const noexcept
194 return __atomic_load_n(&_M_use_count, __ATOMIC_RELAXED);
198 _Sp_counted_base(_Sp_counted_base
const&) =
delete;
199 _Sp_counted_base& operator=(_Sp_counted_base
const&) =
delete;
201 _Atomic_word _M_use_count;
202 _Atomic_word _M_weak_count;
207 _Sp_counted_base<_S_single>::
210 if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, 1) == 0)
213 __throw_bad_weak_ptr();
219 _Sp_counted_base<_S_mutex>::
222 __gnu_cxx::__scoped_lock sentry(*
this);
223 if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, 1) == 0)
226 __throw_bad_weak_ptr();
232 _Sp_counted_base<_S_atomic>::
236 _Atomic_word __count = _M_get_use_count();
240 __throw_bad_weak_ptr();
244 while (!__atomic_compare_exchange_n(&_M_use_count, &__count, __count + 1,
245 true, __ATOMIC_ACQ_REL,
251 template<
typename _Tp, _Lock_policy _Lp = __default_lock_policy>
254 template<
typename _Tp, _Lock_policy _Lp = __default_lock_policy>
257 template<
typename _Tp, _Lock_policy _Lp = __default_lock_policy>
258 class __enable_shared_from_this;
260 template<
typename _Tp>
263 template<
typename _Tp>
266 template<
typename _Tp>
269 template<
typename _Tp>
270 class enable_shared_from_this;
272 template<_Lock_policy _Lp = __default_lock_policy>
275 template<_Lock_policy _Lp = __default_lock_policy>
276 class __shared_count;
280 template<
typename _Ptr, _Lock_policy _Lp>
281 class _Sp_counted_ptr final :
public _Sp_counted_base<_Lp>
285 _Sp_counted_ptr(_Ptr __p)
289 _M_dispose() noexcept
293 _M_destroy() noexcept
300 _Sp_counted_ptr(
const _Sp_counted_ptr&) =
delete;
301 _Sp_counted_ptr& operator=(
const _Sp_counted_ptr&) =
delete;
309 _Sp_counted_ptr<nullptr_t, _S_single>::_M_dispose() noexcept { }
313 _Sp_counted_ptr<nullptr_t, _S_mutex>::_M_dispose() noexcept { }
317 _Sp_counted_ptr<nullptr_t, _S_atomic>::_M_dispose() noexcept { }
320 template<
typename _Ptr,
typename _Deleter,
typename _Alloc, _Lock_policy _Lp>
321 class _Sp_counted_deleter final :
public _Sp_counted_base<_Lp>
330 _My_Deleter(_Deleter __d,
const _Alloc& __a)
331 : _Alloc(__a), _M_del(__d) { }
336 _Sp_counted_deleter(_Ptr __p, _Deleter __d)
337 : _M_ptr(__p), _M_del(__d, _Alloc()) { }
340 _Sp_counted_deleter(_Ptr __p, _Deleter __d,
const _Alloc& __a)
341 : _M_ptr(__p), _M_del(__d, __a) { }
343 ~_Sp_counted_deleter() noexcept { }
346 _M_dispose() noexcept
347 { _M_del._M_del(_M_ptr); }
350 _M_destroy() noexcept
352 typedef typename allocator_traits<_Alloc>::template
353 rebind_traits<_Sp_counted_deleter> _Alloc_traits;
354 typename _Alloc_traits::allocator_type __a(_M_del);
355 _Alloc_traits::destroy(__a,
this);
356 _Alloc_traits::deallocate(__a,
this, 1);
363 return __ti ==
typeid(_Deleter) ? &_M_del._M_del : 0;
376 struct _Sp_make_shared_tag { };
378 template<
typename _Tp,
typename _Alloc, _Lock_policy _Lp>
379 class _Sp_counted_ptr_inplace final :
public _Sp_counted_base<_Lp>
387 _Impl(_Alloc __a) : _Alloc(__a), _M_ptr() { }
392 template<
typename... _Args>
393 _Sp_counted_ptr_inplace(_Alloc __a, _Args&&... __args)
396 _M_impl._M_ptr =
static_cast<_Tp*
>(
static_cast<void*
>(&_M_storage));
399 allocator_traits<_Alloc>::construct(__a, _M_impl._M_ptr,
400 std::forward<_Args>(__args)...);
403 ~_Sp_counted_ptr_inplace() noexcept { }
406 _M_dispose() noexcept
407 { allocator_traits<_Alloc>::destroy(_M_impl, _M_impl._M_ptr); }
411 _M_destroy() noexcept
413 typedef typename allocator_traits<_Alloc>::template
414 rebind_traits<_Sp_counted_ptr_inplace> _Alloc_traits;
415 typename _Alloc_traits::allocator_type __a(_M_impl);
416 _Alloc_traits::destroy(__a,
this);
417 _Alloc_traits::deallocate(__a,
this, 1);
425 return __ti ==
typeid(_Sp_make_shared_tag)
426 ? static_cast<void*>(&_M_storage)
435 typename aligned_storage<sizeof(_Tp), alignment_of<_Tp>::value>::type
439 template<_Lock_policy _Lp>
443 constexpr __shared_count() noexcept : _M_pi(0)
446 template<
typename _Ptr>
448 __shared_count(_Ptr __p) : _M_pi(0)
452 _M_pi =
new _Sp_counted_ptr<_Ptr, _Lp>(__p);
461 template<
typename _Ptr,
typename _Deleter>
462 __shared_count(_Ptr __p, _Deleter __d)
463 : __shared_count(__p, std::move(__d), allocator<int>())
466 template<
typename _Ptr,
typename _Deleter,
typename _Alloc>
467 __shared_count(_Ptr __p, _Deleter __d, _Alloc __a) : _M_pi(0)
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 __a2(__a);
473 _Sp_cd_type* __mem = 0;
476 __mem = _Alloc_traits::allocate(__a2, 1);
477 _Alloc_traits::construct(__a2, __mem,
478 __p, std::move(__d), std::move(__a));
485 _Alloc_traits::deallocate(__a2, __mem, 1);
490 template<
typename _Tp,
typename _Alloc,
typename... _Args>
491 __shared_count(_Sp_make_shared_tag, _Tp*,
const _Alloc& __a,
495 typedef _Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp> _Sp_cp_type;
496 typedef typename allocator_traits<_Alloc>::template
497 rebind_traits<_Sp_cp_type> _Alloc_traits;
498 typename _Alloc_traits::allocator_type __a2(__a);
499 _Sp_cp_type* __mem = _Alloc_traits::allocate(__a2, 1);
502 _Alloc_traits::construct(__a2, __mem, std::move(__a),
503 std::forward<_Args>(__args)...);
508 _Alloc_traits::deallocate(__a2, __mem, 1);
513 #if _GLIBCXX_USE_DEPRECATED
515 template<
typename _Tp>
517 __shared_count(std::auto_ptr<_Tp>&& __r);
521 template<
typename _Tp,
typename _Del>
523 __shared_count(std::unique_ptr<_Tp, _Del>&& __r) : _M_pi(0)
525 using _Ptr =
typename unique_ptr<_Tp, _Del>::pointer;
526 using _Del2 =
typename conditional<is_reference<_Del>::value,
527 reference_wrapper<typename remove_reference<_Del>::type>,
530 = _Sp_counted_deleter<_Ptr, _Del2, allocator<void>, _Lp>;
531 using _Alloc = allocator<_Sp_cd_type>;
532 using _Alloc_traits = allocator_traits<_Alloc>;
534 _Sp_cd_type* __mem = _Alloc_traits::allocate(__a, 1);
535 _Alloc_traits::construct(__a, __mem, __r.release(),
541 explicit __shared_count(
const __weak_count<_Lp>& __r);
543 ~__shared_count() noexcept
545 if (_M_pi !=
nullptr)
549 __shared_count(
const __shared_count& __r) noexcept
553 _M_pi->_M_add_ref_copy();
557 operator=(
const __shared_count& __r) noexcept
559 _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
563 __tmp->_M_add_ref_copy();
572 _M_swap(__shared_count& __r) noexcept
574 _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
580 _M_get_use_count() const noexcept
581 {
return _M_pi != 0 ? _M_pi->_M_get_use_count() : 0; }
584 _M_unique() const noexcept
585 {
return this->_M_get_use_count() == 1; }
589 {
return _M_pi ? _M_pi->_M_get_deleter(__ti) : 0; }
592 _M_less(
const __shared_count& __rhs)
const noexcept
593 {
return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
596 _M_less(
const __weak_count<_Lp>& __rhs)
const noexcept
597 {
return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
601 operator==(
const __shared_count& __a,
const __shared_count& __b) noexcept
602 {
return __a._M_pi == __b._M_pi; }
605 friend class __weak_count<_Lp>;
607 _Sp_counted_base<_Lp>* _M_pi;
611 template<_Lock_policy _Lp>
615 constexpr __weak_count() noexcept : _M_pi(0)
618 __weak_count(
const __shared_count<_Lp>& __r) noexcept
622 _M_pi->_M_weak_add_ref();
625 __weak_count(
const __weak_count<_Lp>& __r) noexcept
629 _M_pi->_M_weak_add_ref();
632 ~__weak_count() noexcept
635 _M_pi->_M_weak_release();
639 operator=(
const __shared_count<_Lp>& __r) noexcept
641 _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
643 __tmp->_M_weak_add_ref();
645 _M_pi->_M_weak_release();
651 operator=(
const __weak_count<_Lp>& __r) noexcept
653 _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
655 __tmp->_M_weak_add_ref();
657 _M_pi->_M_weak_release();
663 _M_swap(__weak_count<_Lp>& __r) noexcept
665 _Sp_counted_base<_Lp>* __tmp = __r._M_pi;
671 _M_get_use_count() const noexcept
672 {
return _M_pi != 0 ? _M_pi->_M_get_use_count() : 0; }
675 _M_less(
const __weak_count& __rhs)
const noexcept
676 {
return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
679 _M_less(
const __shared_count<_Lp>& __rhs)
const noexcept
680 {
return std::less<_Sp_counted_base<_Lp>*>()(this->_M_pi, __rhs._M_pi); }
684 operator==(
const __weak_count& __a,
const __weak_count& __b) noexcept
685 {
return __a._M_pi == __b._M_pi; }
688 friend class __shared_count<_Lp>;
690 _Sp_counted_base<_Lp>* _M_pi;
694 template<_Lock_policy _Lp>
695 inline __shared_count<_Lp>:: __shared_count(
const __weak_count<_Lp>& __r)
699 _M_pi->_M_add_ref_lock();
701 __throw_bad_weak_ptr();
708 template<_Lock_policy _Lp,
typename _Tp1,
typename _Tp2>
710 __enable_shared_from_this_helper(
const __shared_count<_Lp>&,
711 const __enable_shared_from_this<_Tp1,
712 _Lp>*,
const _Tp2*) noexcept;
715 template<typename _Tp1, typename _Tp2>
717 __enable_shared_from_this_helper(const __shared_count<>&,
718 const enable_shared_from_this<_Tp1>*,
719 const _Tp2*) noexcept;
721 template<_Lock_policy _Lp>
723 __enable_shared_from_this_helper(const __shared_count<_Lp>&, ...) noexcept
727 template<
typename _Tp, _Lock_policy _Lp>
731 typedef _Tp element_type;
733 constexpr __shared_ptr() noexcept
734 : _M_ptr(0), _M_refcount()
737 template<
typename _Tp1>
738 explicit __shared_ptr(_Tp1* __p)
739 : _M_ptr(__p), _M_refcount(__p)
742 static_assert( sizeof(_Tp1) > 0, "incomplete type" );
743 __enable_shared_from_this_helper(_M_refcount, __p, __p);
746 template<typename _Tp1, typename _Deleter>
747 __shared_ptr(_Tp1* __p, _Deleter __d)
748 : _M_ptr(__p), _M_refcount(__p, __d)
752 __enable_shared_from_this_helper(_M_refcount, __p, __p);
755 template<typename _Tp1, typename _Deleter, typename _Alloc>
756 __shared_ptr(_Tp1* __p, _Deleter __d, _Alloc __a)
757 : _M_ptr(__p), _M_refcount(__p, __d, std::move(__a))
761 __enable_shared_from_this_helper(_M_refcount, __p, __p);
764 template<typename _Deleter>
765 __shared_ptr(nullptr_t __p, _Deleter __d)
766 : _M_ptr(0), _M_refcount(__p, __d)
769 template<
typename _Deleter,
typename _Alloc>
770 __shared_ptr(nullptr_t __p, _Deleter __d, _Alloc __a)
771 : _M_ptr(0), _M_refcount(__p, __d, std::move(__a))
774 template<
typename _Tp1>
775 __shared_ptr(
const __shared_ptr<_Tp1, _Lp>& __r, _Tp* __p) noexcept
776 : _M_ptr(__p), _M_refcount(__r._M_refcount)
779 __shared_ptr(
const __shared_ptr&) noexcept = default;
780 __shared_ptr& operator=(const __shared_ptr&) noexcept = default;
781 ~__shared_ptr() = default;
783 template<typename _Tp1, typename = typename
784 std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
785 __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
786 : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount)
789 __shared_ptr(__shared_ptr&& __r) noexcept
790 : _M_ptr(__r._M_ptr), _M_refcount()
792 _M_refcount._M_swap(__r._M_refcount);
796 template<
typename _Tp1,
typename =
typename
797 std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
798 __shared_ptr(__shared_ptr<_Tp1, _Lp>&& __r) noexcept
799 : _M_ptr(__r._M_ptr), _M_refcount()
801 _M_refcount._M_swap(__r._M_refcount);
805 template<
typename _Tp1>
806 explicit __shared_ptr(
const __weak_ptr<_Tp1, _Lp>& __r)
807 : _M_refcount(__r._M_refcount)
817 template<typename _Tp1, typename _Del>
818 __shared_ptr(std::unique_ptr<_Tp1, _Del>&& __r)
819 : _M_ptr(__r.get()), _M_refcount()
822 auto __tmp = __r.get();
823 _M_refcount = __shared_count<_Lp>(std::move(__r));
824 __enable_shared_from_this_helper(_M_refcount, __tmp, __tmp);
827 #if _GLIBCXX_USE_DEPRECATED
829 template<
typename _Tp1>
830 __shared_ptr(std::auto_ptr<_Tp1>&& __r);
834 constexpr __shared_ptr(nullptr_t) noexcept
835 : _M_ptr(0), _M_refcount()
838 template<
typename _Tp1>
840 operator=(
const __shared_ptr<_Tp1, _Lp>& __r) noexcept
843 _M_refcount = __r._M_refcount;
847 #if _GLIBCXX_USE_DEPRECATED
848 template<
typename _Tp1>
850 operator=(std::auto_ptr<_Tp1>&& __r)
852 __shared_ptr(std::move(__r)).swap(*
this);
858 operator=(__shared_ptr&& __r) noexcept
860 __shared_ptr(std::move(__r)).swap(*
this);
866 operator=(__shared_ptr<_Tp1, _Lp>&& __r) noexcept
868 __shared_ptr(std::move(__r)).swap(*
this);
872 template<
typename _Tp1,
typename _Del>
874 operator=(std::unique_ptr<_Tp1, _Del>&& __r)
876 __shared_ptr(std::move(__r)).swap(*
this);
882 { __shared_ptr().swap(*
this); }
884 template<
typename _Tp1>
890 __shared_ptr(__p).swap(*
this);
893 template<
typename _Tp1,
typename _Deleter>
895 reset(_Tp1* __p, _Deleter __d)
896 { __shared_ptr(__p, __d).swap(*
this); }
898 template<
typename _Tp1,
typename _Deleter,
typename _Alloc>
900 reset(_Tp1* __p, _Deleter __d, _Alloc __a)
901 { __shared_ptr(__p, __d, std::move(__a)).swap(*
this); }
904 typename std::add_lvalue_reference<_Tp>::type
905 operator*() const noexcept
912 operator->() const noexcept
922 explicit operator bool() const
923 {
return _M_ptr == 0 ?
false :
true; }
926 unique() const noexcept
927 {
return _M_refcount._M_unique(); }
930 use_count() const noexcept
931 {
return _M_refcount._M_get_use_count(); }
934 swap(__shared_ptr<_Tp, _Lp>& __other) noexcept
937 _M_refcount._M_swap(__other._M_refcount);
940 template<
typename _Tp1>
942 owner_before(__shared_ptr<_Tp1, _Lp>
const& __rhs)
const
943 {
return _M_refcount._M_less(__rhs._M_refcount); }
945 template<
typename _Tp1>
947 owner_before(__weak_ptr<_Tp1, _Lp>
const& __rhs)
const
948 {
return _M_refcount._M_less(__rhs._M_refcount); }
953 template<
typename _Alloc,
typename... _Args>
954 __shared_ptr(_Sp_make_shared_tag __tag,
const _Alloc& __a,
956 : _M_ptr(), _M_refcount(__tag, (_Tp*)0, __a,
957 std::forward<_Args>(__args)...)
961 void* __p = _M_refcount._M_get_deleter(
typeid(__tag));
962 _M_ptr =
static_cast<_Tp*
>(__p);
963 __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
966 template<
typename _Alloc>
969 void operator()(_Tp* __ptr)
971 typedef allocator_traits<_Alloc> _Alloc_traits;
972 _Alloc_traits::destroy(_M_alloc, __ptr);
973 _Alloc_traits::deallocate(_M_alloc, __ptr, 1);
978 template<
typename _Alloc,
typename... _Args>
979 __shared_ptr(_Sp_make_shared_tag __tag,
const _Alloc& __a,
981 : _M_ptr(), _M_refcount()
983 typedef typename _Alloc::template rebind<_Tp>::other _Alloc2;
984 _Deleter<_Alloc2> __del = { _Alloc2(__a) };
985 typedef allocator_traits<_Alloc2> __traits;
986 _M_ptr = __traits::allocate(__del._M_alloc, 1);
991 __traits::construct(__del._M_alloc, _M_ptr,
992 std::forward<_Args>(__args)...);
996 __traits::deallocate(__del._M_alloc, _M_ptr, 1);
999 __shared_count<_Lp> __count(_M_ptr, __del, __del._M_alloc);
1000 _M_refcount._M_swap(__count);
1001 __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
1005 template<
typename _Tp1, _Lock_policy _Lp1,
typename _Alloc,
1007 friend __shared_ptr<_Tp1, _Lp1>
1008 __allocate_shared(
const _Alloc& __a, _Args&&... __args);
1013 {
return _M_refcount._M_get_deleter(__ti); }
1015 template<
typename _Tp1, _Lock_policy _Lp1>
friend class __shared_ptr;
1016 template<
typename _Tp1, _Lock_policy _Lp1>
friend class __weak_ptr;
1018 template<
typename _Del,
typename _Tp1, _Lock_policy _Lp1>
1019 friend _Del* get_deleter(
const __shared_ptr<_Tp1, _Lp1>&) noexcept;
1022 __shared_count<_Lp> _M_refcount;
1027 template<typename _Tp1, typename _Tp2, _Lock_policy _Lp>
1029 operator==(const __shared_ptr<_Tp1, _Lp>& __a,
1030 const __shared_ptr<_Tp2, _Lp>& __b) noexcept
1031 {
return __a.get() == __b.get(); }
1033 template<
typename _Tp, _Lock_policy _Lp>
1035 operator==(
const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
1038 template<
typename _Tp, _Lock_policy _Lp>
1040 operator==(nullptr_t,
const __shared_ptr<_Tp, _Lp>& __a) noexcept
1043 template<
typename _Tp1,
typename _Tp2, _Lock_policy _Lp>
1045 operator!=(
const __shared_ptr<_Tp1, _Lp>& __a,
1046 const __shared_ptr<_Tp2, _Lp>& __b) noexcept
1047 {
return __a.get() != __b.get(); }
1049 template<
typename _Tp, _Lock_policy _Lp>
1051 operator!=(
const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
1052 {
return (
bool)__a; }
1054 template<
typename _Tp, _Lock_policy _Lp>
1056 operator!=(nullptr_t,
const __shared_ptr<_Tp, _Lp>& __a) noexcept
1057 {
return (
bool)__a; }
1059 template<
typename _Tp1,
typename _Tp2, _Lock_policy _Lp>
1061 operator<(const __shared_ptr<_Tp1, _Lp>& __a,
1062 const __shared_ptr<_Tp2, _Lp>& __b) noexcept
1064 typedef typename std::common_type<_Tp1*, _Tp2*>::type _CT;
1065 return std::less<_CT>()(__a.get(), __b.get());
1068 template<
typename _Tp, _Lock_policy _Lp>
1070 operator<(const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
1071 {
return std::less<_Tp*>()(__a.get(),
nullptr); }
1073 template<
typename _Tp, _Lock_policy _Lp>
1075 operator<(nullptr_t, const __shared_ptr<_Tp, _Lp>& __a) noexcept
1076 {
return std::less<_Tp*>()(
nullptr, __a.get()); }
1078 template<
typename _Tp1,
typename _Tp2, _Lock_policy _Lp>
1080 operator<=(const __shared_ptr<_Tp1, _Lp>& __a,
1081 const __shared_ptr<_Tp2, _Lp>& __b) noexcept
1082 {
return !(__b < __a); }
1084 template<
typename _Tp, _Lock_policy _Lp>
1086 operator<=(const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
1087 {
return !(
nullptr < __a); }
1089 template<
typename _Tp, _Lock_policy _Lp>
1091 operator<=(nullptr_t, const __shared_ptr<_Tp, _Lp>& __a) noexcept
1092 {
return !(__a <
nullptr); }
1094 template<
typename _Tp1,
typename _Tp2, _Lock_policy _Lp>
1096 operator>(
const __shared_ptr<_Tp1, _Lp>& __a,
1097 const __shared_ptr<_Tp2, _Lp>& __b) noexcept
1098 {
return (__b < __a); }
1100 template<
typename _Tp, _Lock_policy _Lp>
1102 operator>(
const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
1103 {
return std::less<_Tp*>()(
nullptr, __a.get()); }
1105 template<
typename _Tp, _Lock_policy _Lp>
1107 operator>(nullptr_t,
const __shared_ptr<_Tp, _Lp>& __a) noexcept
1108 {
return std::less<_Tp*>()(__a.get(),
nullptr); }
1110 template<
typename _Tp1,
typename _Tp2, _Lock_policy _Lp>
1112 operator>=(
const __shared_ptr<_Tp1, _Lp>& __a,
1113 const __shared_ptr<_Tp2, _Lp>& __b) noexcept
1114 {
return !(__a < __b); }
1116 template<
typename _Tp, _Lock_policy _Lp>
1118 operator>=(
const __shared_ptr<_Tp, _Lp>& __a, nullptr_t) noexcept
1119 {
return !(__a <
nullptr); }
1121 template<
typename _Tp, _Lock_policy _Lp>
1123 operator>=(nullptr_t,
const __shared_ptr<_Tp, _Lp>& __a) noexcept
1124 {
return !(
nullptr < __a); }
1126 template<
typename _Sp>
1127 struct _Sp_less :
public binary_function<_Sp, _Sp, bool>
1130 operator()(
const _Sp& __lhs,
const _Sp& __rhs)
const noexcept
1132 typedef typename _Sp::element_type element_type;
1133 return std::less<element_type*>()(__lhs.get(), __rhs.get());
1137 template<
typename _Tp, _Lock_policy _Lp>
1138 struct less<__shared_ptr<_Tp, _Lp>>
1139 :
public _Sp_less<__shared_ptr<_Tp, _Lp>>
1143 template<
typename _Tp, _Lock_policy _Lp>
1145 swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>& __b) noexcept
1155 template<
typename _Tp,
typename _Tp1, _Lock_policy _Lp>
1156 inline __shared_ptr<_Tp, _Lp>
1157 static_pointer_cast(
const __shared_ptr<_Tp1, _Lp>& __r) noexcept
1158 {
return __shared_ptr<_Tp, _Lp>(__r,
static_cast<_Tp*
>(__r.get())); }
1165 template<
typename _Tp,
typename _Tp1, _Lock_policy _Lp>
1166 inline __shared_ptr<_Tp, _Lp>
1167 const_pointer_cast(
const __shared_ptr<_Tp1, _Lp>& __r) noexcept
1168 {
return __shared_ptr<_Tp, _Lp>(__r,
const_cast<_Tp*
>(__r.get())); }
1175 template<
typename _Tp,
typename _Tp1, _Lock_policy _Lp>
1176 inline __shared_ptr<_Tp, _Lp>
1177 dynamic_pointer_cast(
const __shared_ptr<_Tp1, _Lp>& __r) noexcept
1179 if (_Tp* __p = dynamic_cast<_Tp*>(__r.get()))
1180 return __shared_ptr<_Tp, _Lp>(__r, __p);
1181 return __shared_ptr<_Tp, _Lp>();
1185 template<
typename _Tp, _Lock_policy _Lp>
1189 typedef _Tp element_type;
1191 constexpr __weak_ptr() noexcept
1192 : _M_ptr(0), _M_refcount()
1195 __weak_ptr(
const __weak_ptr&) noexcept = default;
1196 __weak_ptr& operator=(const __weak_ptr&) noexcept = default;
1197 ~__weak_ptr() = default;
1213 template<typename _Tp1, typename = typename
1214 std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
1215 __weak_ptr(const __weak_ptr<_Tp1, _Lp>& __r) noexcept
1216 : _M_refcount(__r._M_refcount)
1217 { _M_ptr = __r.lock().get(); }
1219 template<
typename _Tp1,
typename =
typename
1220 std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
1221 __weak_ptr(
const __shared_ptr<_Tp1, _Lp>& __r) noexcept
1222 : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount)
1225 template<
typename _Tp1>
1227 operator=(
const __weak_ptr<_Tp1, _Lp>& __r) noexcept
1229 _M_ptr = __r.lock().get();
1230 _M_refcount = __r._M_refcount;
1234 template<
typename _Tp1>
1236 operator=(
const __shared_ptr<_Tp1, _Lp>& __r) noexcept
1238 _M_ptr = __r._M_ptr;
1239 _M_refcount = __r._M_refcount;
1243 __shared_ptr<_Tp, _Lp>
1244 lock() const noexcept
1249 return __shared_ptr<element_type, _Lp>();
1253 return __shared_ptr<element_type, _Lp>(*this);
1260 return __shared_ptr<element_type, _Lp>();
1265 return expired() ? __shared_ptr<element_type, _Lp>()
1266 : __shared_ptr<element_type, _Lp>(*
this);
1272 use_count() const noexcept
1273 {
return _M_refcount._M_get_use_count(); }
1276 expired() const noexcept
1277 {
return _M_refcount._M_get_use_count() == 0; }
1279 template<
typename _Tp1>
1281 owner_before(
const __shared_ptr<_Tp1, _Lp>& __rhs)
const
1282 {
return _M_refcount._M_less(__rhs._M_refcount); }
1284 template<
typename _Tp1>
1286 owner_before(
const __weak_ptr<_Tp1, _Lp>& __rhs)
const
1287 {
return _M_refcount._M_less(__rhs._M_refcount); }
1291 { __weak_ptr().swap(*
this); }
1294 swap(__weak_ptr& __s) noexcept
1297 _M_refcount._M_swap(__s._M_refcount);
1303 _M_assign(_Tp* __ptr,
const __shared_count<_Lp>& __refcount) noexcept
1306 _M_refcount = __refcount;
1309 template<
typename _Tp1, _Lock_policy _Lp1>
friend class __shared_ptr;
1310 template<
typename _Tp1, _Lock_policy _Lp1>
friend class __weak_ptr;
1311 friend class __enable_shared_from_this<_Tp, _Lp>;
1312 friend class enable_shared_from_this<_Tp>;
1315 __weak_count<_Lp> _M_refcount;
1319 template<
typename _Tp, _Lock_policy _Lp>
1321 swap(__weak_ptr<_Tp, _Lp>& __a, __weak_ptr<_Tp, _Lp>& __b) noexcept
1324 template<
typename _Tp,
typename _Tp1>
1325 struct _Sp_owner_less :
public binary_function<_Tp, _Tp, bool>
1328 operator()(
const _Tp& __lhs,
const _Tp& __rhs)
const
1329 {
return __lhs.owner_before(__rhs); }
1332 operator()(
const _Tp& __lhs,
const _Tp1& __rhs)
const
1333 {
return __lhs.owner_before(__rhs); }
1336 operator()(
const _Tp1& __lhs,
const _Tp& __rhs)
const
1337 {
return __lhs.owner_before(__rhs); }
1340 template<
typename _Tp, _Lock_policy _Lp>
1341 struct owner_less<__shared_ptr<_Tp, _Lp>>
1342 :
public _Sp_owner_less<__shared_ptr<_Tp, _Lp>, __weak_ptr<_Tp, _Lp>>
1345 template<
typename _Tp, _Lock_policy _Lp>
1346 struct owner_less<__weak_ptr<_Tp, _Lp>>
1347 :
public _Sp_owner_less<__weak_ptr<_Tp, _Lp>, __shared_ptr<_Tp, _Lp>>
1351 template<
typename _Tp, _Lock_policy _Lp>
1352 class __enable_shared_from_this
1355 constexpr __enable_shared_from_this() noexcept { }
1357 __enable_shared_from_this(
const __enable_shared_from_this&) noexcept { }
1359 __enable_shared_from_this&
1360 operator=(
const __enable_shared_from_this&) noexcept
1363 ~__enable_shared_from_this() { }
1366 __shared_ptr<_Tp, _Lp>
1368 {
return __shared_ptr<_Tp, _Lp>(this->_M_weak_this); }
1370 __shared_ptr<const _Tp, _Lp>
1371 shared_from_this()
const
1372 {
return __shared_ptr<const _Tp, _Lp>(this->_M_weak_this); }
1375 template<
typename _Tp1>
1377 _M_weak_assign(_Tp1* __p,
const __shared_count<_Lp>& __n)
const noexcept
1378 { _M_weak_this._M_assign(__p, __n); }
1380 template<
typename _Tp1>
1382 __enable_shared_from_this_helper(
const __shared_count<_Lp>& __pn,
1383 const __enable_shared_from_this* __pe,
1384 const _Tp1* __px) noexcept
1387 __pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
1390 mutable __weak_ptr<_Tp, _Lp> _M_weak_this;
1394 template<
typename _Tp, _Lock_policy _Lp,
typename _Alloc,
typename... _Args>
1395 inline __shared_ptr<_Tp, _Lp>
1396 __allocate_shared(
const _Alloc& __a, _Args&&... __args)
1398 return __shared_ptr<_Tp, _Lp>(_Sp_make_shared_tag(), __a,
1399 std::forward<_Args>(__args)...);
1402 template<
typename _Tp, _Lock_policy _Lp,
typename... _Args>
1403 inline __shared_ptr<_Tp, _Lp>
1404 __make_shared(_Args&&... __args)
1406 typedef typename std::remove_const<_Tp>::type _Tp_nc;
1407 return std::__allocate_shared<_Tp, _Lp>(std::allocator<_Tp_nc>(),
1408 std::forward<_Args>(__args)...);
1412 template<
typename _Tp, _Lock_policy _Lp>
1413 struct hash<__shared_ptr<_Tp, _Lp>>
1414 :
public __hash_base<size_t, __shared_ptr<_Tp, _Lp>>
1417 operator()(
const __shared_ptr<_Tp, _Lp>& __s)
const noexcept
1418 {
return std::hash<_Tp*>()(__s.get()); }
1421 _GLIBCXX_END_NAMESPACE_VERSION
#define __glibcxx_function_requires(...)
Definition: concept_check.h:47
bool operator>=(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:644
bool operator==(const exception_ptr &, const exception_ptr &) _GLIBCXX_USE_NOEXCEPT __attribute__((__pure__))
#define __try
Definition: exception_defines.h:35
Part of RTTI.
Definition: typeinfo:88
#define _GLIBCXX_DEBUG_ASSERT(_Condition)
Definition: debug.h:61
#define __throw_exception_again
Definition: exception_defines.h:37
#define bool
Definition: stdbool.h:33
bool operator>(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:612
#define _GLIBCXX_READ_MEM_BARRIER
Definition: atomicity.h:111
bool operator!=(const exception_ptr &, const exception_ptr &) _GLIBCXX_USE_NOEXCEPT __attribute__((__pure__))
#define __catch(X)
Definition: exception_defines.h:36
#define _GLIBCXX_WRITE_MEM_BARRIER
Definition: atomicity.h:114
void swap(exception_ptr &__lhs, exception_ptr &__rhs)
Definition: exception_ptr.h:160