50 #define _SHARED_PTR_H 1
56 _GLIBCXX_BEGIN_NAMESPACE_VERSION
63 template<
typename _Ch,
typename _Tr,
typename _Tp, _Lock_policy _Lp>
65 inline std::basic_ostream<_Ch, _Tr>&
66 operator<<(std::basic_ostream<_Ch, _Tr>& __os,
67 const __shared_ptr<_Tp, _Lp>& __p)
74 template<
typename _Del,
typename _Tp, _Lock_policy _Lp>
76 get_deleter(
const __shared_ptr<_Tp, _Lp>& __p) noexcept
79 return static_cast<_Del*
>(__p._M_get_deleter(
typeid(_Del)));
92 template<
typename _Tp>
93 class shared_ptr :
public __shared_ptr<_Tp>
100 constexpr shared_ptr() noexcept
101 : __shared_ptr<_Tp>() { }
103 shared_ptr(
const shared_ptr&) noexcept = default;
111 template<typename _Tp1>
112 explicit shared_ptr(_Tp1* __p)
113 : __shared_ptr<_Tp>(__p) { }
128 template<
typename _Tp1,
typename _Deleter>
129 shared_ptr(_Tp1* __p, _Deleter __d)
130 : __shared_ptr<_Tp>(__p, __d) { }
145 template<
typename _Deleter>
146 shared_ptr(nullptr_t __p, _Deleter __d)
147 : __shared_ptr<_Tp>(__p, __d) { }
164 template<
typename _Tp1,
typename _Deleter,
typename _Alloc>
165 shared_ptr(_Tp1* __p, _Deleter __d, _Alloc __a)
166 : __shared_ptr<_Tp>(__p, __d, std::move(__a)) { }
183 template<
typename _Deleter,
typename _Alloc>
184 shared_ptr(nullptr_t __p, _Deleter __d, _Alloc __a)
185 : __shared_ptr<_Tp>(__p, __d, std::move(__a)) { }
205 template<
typename _Tp1>
206 shared_ptr(
const shared_ptr<_Tp1>& __r, _Tp* __p) noexcept
207 : __shared_ptr<_Tp>(__r, __p) { }
216 template<
typename _Tp1,
typename =
typename
217 std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
218 shared_ptr(
const shared_ptr<_Tp1>& __r) noexcept
219 : __shared_ptr<_Tp>(__r) { }
226 shared_ptr(shared_ptr&& __r) noexcept
227 : __shared_ptr<_Tp>(std::move(__r)) { }
234 template<
typename _Tp1,
typename =
typename
235 std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
236 shared_ptr(shared_ptr<_Tp1>&& __r) noexcept
237 : __shared_ptr<_Tp>(std::move(__r)) { }
247 template<
typename _Tp1>
248 explicit shared_ptr(
const weak_ptr<_Tp1>& __r)
249 : __shared_ptr<_Tp>(__r) { }
251 #if _GLIBCXX_USE_DEPRECATED
252 template<
typename _Tp1>
253 shared_ptr(std::auto_ptr<_Tp1>&& __r);
256 template<
typename _Tp1,
typename _Del>
257 shared_ptr(std::unique_ptr<_Tp1, _Del>&& __r)
258 : __shared_ptr<_Tp>(std::move(__r)) { }
265 constexpr shared_ptr(nullptr_t __p) noexcept
266 : __shared_ptr<_Tp>(__p) { }
268 shared_ptr& operator=(
const shared_ptr&) noexcept = default;
270 template<typename _Tp1>
272 operator=(const shared_ptr<_Tp1>& __r) noexcept
274 this->__shared_ptr<_Tp>::operator=(__r);
278 #if _GLIBCXX_USE_DEPRECATED
279 template<
typename _Tp1>
281 operator=(std::auto_ptr<_Tp1>&& __r)
283 this->__shared_ptr<_Tp>::operator=(std::move(__r));
289 operator=(shared_ptr&& __r) noexcept
291 this->__shared_ptr<_Tp>::operator=(std::move(__r));
297 operator=(shared_ptr<_Tp1>&& __r) noexcept
299 this->__shared_ptr<_Tp>::operator=(std::move(__r));
303 template<
typename _Tp1,
typename _Del>
305 operator=(std::unique_ptr<_Tp1, _Del>&& __r)
307 this->__shared_ptr<_Tp>::operator=(std::move(__r));
313 template<
typename _Alloc,
typename... _Args>
314 shared_ptr(_Sp_make_shared_tag __tag,
const _Alloc& __a,
316 : __shared_ptr<_Tp>(__tag, __a, std::forward<_Args>(__args)...)
319 template<
typename _Tp1,
typename _Alloc,
typename... _Args>
320 friend shared_ptr<_Tp1>
321 allocate_shared(
const _Alloc& __a, _Args&&... __args);
325 template<
typename _Tp1,
typename _Tp2>
328 const shared_ptr<_Tp2>& __b) noexcept
329 {
return __a.get() == __b.get(); }
331 template<
typename _Tp>
333 operator==(
const shared_ptr<_Tp>& __a, nullptr_t) noexcept
336 template<
typename _Tp>
338 operator==(nullptr_t,
const shared_ptr<_Tp>& __a) noexcept
341 template<
typename _Tp1,
typename _Tp2>
344 const shared_ptr<_Tp2>& __b) noexcept
345 {
return __a.get() != __b.get(); }
347 template<
typename _Tp>
349 operator!=(
const shared_ptr<_Tp>& __a, nullptr_t) noexcept
350 {
return (
bool)__a; }
352 template<
typename _Tp>
354 operator!=(nullptr_t,
const shared_ptr<_Tp>& __a) noexcept
355 {
return (
bool)__a; }
357 template<
typename _Tp1,
typename _Tp2>
359 operator<(const shared_ptr<_Tp1>& __a,
360 const shared_ptr<_Tp2>& __b) noexcept
362 typedef typename std::common_type<_Tp1*, _Tp2*>::type _CT;
363 return std::less<_CT>()(__a.get(), __b.get());
366 template<
typename _Tp>
368 operator<(const shared_ptr<_Tp>& __a, nullptr_t) noexcept
369 {
return std::less<_Tp*>()(__a.get(),
nullptr); }
371 template<
typename _Tp>
373 operator<(nullptr_t, const shared_ptr<_Tp>& __a) noexcept
374 {
return std::less<_Tp*>()(
nullptr, __a.get()); }
376 template<
typename _Tp1,
typename _Tp2>
378 operator<=(const shared_ptr<_Tp1>& __a,
379 const shared_ptr<_Tp2>& __b) noexcept
380 {
return !(__b < __a); }
382 template<
typename _Tp>
384 operator<=(const shared_ptr<_Tp>& __a, nullptr_t) noexcept
385 {
return !(
nullptr < __a); }
387 template<
typename _Tp>
389 operator<=(nullptr_t, const shared_ptr<_Tp>& __a) noexcept
390 {
return !(__a <
nullptr); }
392 template<
typename _Tp1,
typename _Tp2>
395 const shared_ptr<_Tp2>& __b) noexcept
396 {
return (__b < __a); }
398 template<
typename _Tp>
400 operator>(
const shared_ptr<_Tp>& __a, nullptr_t) noexcept
401 {
return std::less<_Tp*>()(
nullptr, __a.get()); }
403 template<
typename _Tp>
405 operator>(nullptr_t,
const shared_ptr<_Tp>& __a) noexcept
406 {
return std::less<_Tp*>()(__a.get(),
nullptr); }
408 template<
typename _Tp1,
typename _Tp2>
411 const shared_ptr<_Tp2>& __b) noexcept
412 {
return !(__a < __b); }
414 template<
typename _Tp>
416 operator>=(
const shared_ptr<_Tp>& __a, nullptr_t) noexcept
417 {
return !(__a <
nullptr); }
419 template<
typename _Tp>
421 operator>=(nullptr_t,
const shared_ptr<_Tp>& __a) noexcept
422 {
return !(
nullptr < __a); }
424 template<
typename _Tp>
425 struct less<shared_ptr<_Tp>> :
public _Sp_less<shared_ptr<_Tp>>
429 template<
typename _Tp>
431 swap(shared_ptr<_Tp>& __a, shared_ptr<_Tp>& __b) noexcept
435 template<
typename _Tp,
typename _Tp1>
436 inline shared_ptr<_Tp>
437 static_pointer_cast(
const shared_ptr<_Tp1>& __r) noexcept
438 {
return shared_ptr<_Tp>(__r,
static_cast<_Tp*
>(__r.get())); }
440 template<
typename _Tp,
typename _Tp1>
441 inline shared_ptr<_Tp>
442 const_pointer_cast(
const shared_ptr<_Tp1>& __r) noexcept
443 {
return shared_ptr<_Tp>(__r,
const_cast<_Tp*
>(__r.get())); }
445 template<
typename _Tp,
typename _Tp1>
446 inline shared_ptr<_Tp>
447 dynamic_pointer_cast(
const shared_ptr<_Tp1>& __r) noexcept
449 if (_Tp* __p = dynamic_cast<_Tp*>(__r.get()))
450 return shared_ptr<_Tp>(__r, __p);
451 return shared_ptr<_Tp>();
460 template<
typename _Tp>
461 class weak_ptr :
public __weak_ptr<_Tp>
464 constexpr weak_ptr() noexcept
465 : __weak_ptr<_Tp>() { }
467 template<
typename _Tp1,
typename =
typename
468 std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
469 weak_ptr(
const weak_ptr<_Tp1>& __r) noexcept
470 : __weak_ptr<_Tp>(__r) { }
472 template<
typename _Tp1,
typename =
typename
473 std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
474 weak_ptr(
const shared_ptr<_Tp1>& __r) noexcept
475 : __weak_ptr<_Tp>(__r) { }
477 template<
typename _Tp1>
479 operator=(
const weak_ptr<_Tp1>& __r) noexcept
481 this->__weak_ptr<_Tp>::operator=(__r);
485 template<
typename _Tp1>
487 operator=(
const shared_ptr<_Tp1>& __r) noexcept
489 this->__weak_ptr<_Tp>::operator=(__r);
494 lock() const noexcept
498 return shared_ptr<_Tp>();
502 return shared_ptr<_Tp>(*this);
506 return shared_ptr<_Tp>();
509 return this->expired() ? shared_ptr<_Tp>() : shared_ptr<_Tp>(*
this);
515 template<
typename _Tp>
517 swap(weak_ptr<_Tp>& __a, weak_ptr<_Tp>& __b) noexcept
522 template<
typename _Tp>
526 template<
typename _Tp>
527 struct owner_less<shared_ptr<_Tp>>
528 :
public _Sp_owner_less<shared_ptr<_Tp>, weak_ptr<_Tp>>
532 template<
typename _Tp>
533 struct owner_less<weak_ptr<_Tp>>
534 :
public _Sp_owner_less<weak_ptr<_Tp>, shared_ptr<_Tp>>
540 template<
typename _Tp>
541 class enable_shared_from_this
544 constexpr enable_shared_from_this() noexcept { }
546 enable_shared_from_this(
const enable_shared_from_this&) noexcept { }
548 enable_shared_from_this&
549 operator=(
const enable_shared_from_this&) noexcept
552 ~enable_shared_from_this() { }
557 {
return shared_ptr<_Tp>(this->_M_weak_this); }
559 shared_ptr<const _Tp>
560 shared_from_this()
const
561 {
return shared_ptr<const _Tp>(this->_M_weak_this); }
564 template<
typename _Tp1>
566 _M_weak_assign(_Tp1* __p,
const __shared_count<>& __n)
const noexcept
567 { _M_weak_this._M_assign(__p, __n); }
569 template<
typename _Tp1>
571 __enable_shared_from_this_helper(
const __shared_count<>& __pn,
572 const enable_shared_from_this* __pe,
573 const _Tp1* __px) noexcept
576 __pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
579 mutable weak_ptr<_Tp> _M_weak_this;
593 template<
typename _Tp,
typename _Alloc,
typename... _Args>
594 inline shared_ptr<_Tp>
595 allocate_shared(
const _Alloc& __a, _Args&&... __args)
597 return shared_ptr<_Tp>(_Sp_make_shared_tag(), __a,
598 std::forward<_Args>(__args)...);
608 template<
typename _Tp,
typename... _Args>
609 inline shared_ptr<_Tp>
610 make_shared(_Args&&... __args)
612 typedef typename std::remove_const<_Tp>::type _Tp_nc;
613 return std::allocate_shared<_Tp>(std::allocator<_Tp_nc>(),
614 std::forward<_Args>(__args)...);
618 template<
typename _Tp>
619 struct hash<shared_ptr<_Tp>>
620 :
public __hash_base<size_t, shared_ptr<_Tp>>
623 operator()(
const shared_ptr<_Tp>& __s)
const noexcept
624 {
return std::hash<_Tp*>()(__s.get()); }
629 _GLIBCXX_END_NAMESPACE_VERSION
632 #endif // _SHARED_PTR_H
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
namespace std _GLIBCXX_VISIBILITY(default)
Definition: auto_ptr.h:36
bool operator>(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:612
bool operator!=(const exception_ptr &, const exception_ptr &) _GLIBCXX_USE_NOEXCEPT __attribute__((__pure__))
#define __catch(X)
Definition: exception_defines.h:36
void swap(exception_ptr &__lhs, exception_ptr &__rhs)
Definition: exception_ptr.h:160