31 #define _UNIQUE_PTR_H 1
39 namespace std _GLIBCXX_VISIBILITY(default)
41 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 #if _GLIBCXX_USE_DEPRECATED
49 template<
typename>
class auto_ptr;
53 template<
typename _Tp>
64 template<
typename _Up,
typename =
typename
65 enable_if<is_convertible<_Up*, _Tp*>::value>::type>
72 static_assert(
sizeof(_Tp)>0,
73 "can't delete pointer to incomplete type");
81 template<
typename _Tp>
85 template<
typename _Up>
86 using __remove_cv =
typename remove_cv<_Up>::type;
89 template<
typename _Up>
91 = __and_< is_base_of<_Tp, _Up>,
92 __not_<is_same<__remove_cv<_Tp>, __remove_cv<_Up>>> >;
107 template<
typename _Up,
typename =
typename
108 enable_if<!__is_derived_Tp<_Up>::value>::type>
115 static_assert(
sizeof(_Tp)>0,
116 "can't delete pointer to incomplete type");
120 template<
typename _Up>
121 typename enable_if<__is_derived_Tp<_Up>::value>::type
126 template <
typename _Tp,
typename _Dp = default_delete<_Tp> >
132 template<
typename _Up>
133 static typename _Up::pointer __test(
typename _Up::pointer*);
135 template<
typename _Up>
136 static _Tp* __test(...);
138 typedef typename remove_reference<_Dp>::type _Del;
141 typedef decltype(__test<_Del>(0)) type;
148 typedef typename _Pointer::type pointer;
149 typedef _Tp element_type;
150 typedef _Dp deleter_type;
158 "constructed with null function pointer deleter"); }
168 : _M_t(__p, deleter_type())
170 "constructed with null function pointer deleter"); }
181 deleter_type,
const deleter_type&>::type __d) noexcept
192 typename remove_reference<deleter_type>::type&& __d) noexcept
193 : _M_t(std::move(__p), std::move(__d))
195 "rvalue deleter bound to reference"); }
212 template<
typename _Up,
typename _Ep,
typename = _Require<
213 is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>,
214 __not_<is_array<_Up>>,
215 typename conditional<is_reference<_Dp>::value,
217 is_convertible<_Ep, _Dp>>::type>>
222 #if _GLIBCXX_USE_DEPRECATED
224 template<
typename _Up,
typename = _Require<
225 is_convertible<_Up*, _Tp*>, is_same<_Dp, default_delete<_Tp>>>>
232 auto& __ptr = std::get<0>(_M_t);
233 if (__ptr !=
nullptr)
249 reset(__u.release());
250 get_deleter() = std::forward<deleter_type>(__u.get_deleter());
261 template<
typename _Up,
typename _Ep>
262 typename enable_if< __and_<
263 is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>,
264 __not_<is_array<_Up>>
269 reset(__u.release());
270 get_deleter() = std::forward<_Ep>(__u.get_deleter());
285 typename add_lvalue_reference<element_type>::type
288 _GLIBCXX_DEBUG_ASSERT(
get() != pointer());
296 _GLIBCXX_DEBUG_ASSERT(
get() != pointer());
303 {
return std::get<0>(_M_t); }
308 {
return std::get<1>(_M_t); }
313 {
return std::get<1>(_M_t); }
316 explicit operator bool() const noexcept
317 {
return get() == pointer() ?
false :
true; }
326 std::get<0>(_M_t) = pointer();
337 reset(pointer __p = pointer()) noexcept
340 swap(std::get<0>(_M_t), __p);
341 if (__p != pointer())
350 swap(_M_t, __u._M_t);
362 template<
typename _Tp,
typename _Dp>
368 template<
typename _Up>
369 static typename _Up::pointer __test(
typename _Up::pointer*);
371 template<
typename _Up>
372 static _Tp* __test(...);
374 typedef typename remove_reference<_Dp>::type _Del;
377 typedef decltype(__test<_Del>(0)) type;
383 template<
typename _Up>
384 using __remove_cv =
typename remove_cv<_Up>::type;
387 template<
typename _Up>
388 using __is_derived_Tp
389 = __and_< is_base_of<_Tp, _Up>,
390 __not_<is_same<__remove_cv<_Tp>, __remove_cv<_Up>>> >;
392 template<
typename _Up,
typename _Ep,
393 typename _Tp_pointer =
typename _Pointer::type,
394 typename _Up_pointer =
typename unique_ptr<_Up, _Ep>::pointer>
395 using __safe_conversion = __and_<
396 is_convertible<_Up_pointer, _Tp_pointer>,
398 __or_<__not_<is_pointer<_Up_pointer>>,
399 __not_<is_pointer<_Tp_pointer>>,
400 __not_<__is_derived_Tp<typename remove_extent<_Up>::type>>
405 typedef typename _Pointer::type pointer;
406 typedef _Tp element_type;
407 typedef _Dp deleter_type;
415 "constructed with null function pointer deleter"); }
425 : _M_t(__p, deleter_type())
427 "constructed with null function pointer deleter"); }
430 template<
typename _Up,
typename = _Require<is_po
inter<po
inter>,
431 is_convertible<_Up*, po
inter>, __is_derived_Tp<_Up>>>
444 deleter_type,
const deleter_type&>::type __d) noexcept
455 remove_reference<deleter_type>::type&& __d) noexcept
456 : _M_t(std::move(__p), std::move(__d))
458 "rvalue deleter bound to reference"); }
467 template<
typename _Up,
typename _Ep,
468 typename = _Require<__safe_conversion<_Up, _Ep>,
469 typename conditional<is_reference<_Dp>::value,
471 is_convertible<_Ep, _Dp>>::type
480 auto& __ptr = std::get<0>(_M_t);
481 if (__ptr !=
nullptr)
497 reset(__u.release());
498 get_deleter() = std::forward<deleter_type>(__u.get_deleter());
509 template<
typename _Up,
typename _Ep>
511 enable_if<__safe_conversion<_Up, _Ep>::value,
unique_ptr&>::type
514 reset(__u.release());
515 get_deleter() = std::forward<_Ep>(__u.get_deleter());
530 typename std::add_lvalue_reference<element_type>::type
533 _GLIBCXX_DEBUG_ASSERT(
get() != pointer());
540 {
return std::get<0>(_M_t); }
545 {
return std::get<1>(_M_t); }
550 {
return std::get<1>(_M_t); }
553 explicit operator bool() const noexcept
554 {
return get() == pointer() ?
false :
true; }
563 std::get<0>(_M_t) = pointer();
574 reset(pointer __p = pointer()) noexcept
577 swap(std::get<0>(_M_t), __p);
583 template<
typename _Up,
typename = _Require<is_po
inter<po
inter>,
584 is_convertible<_Up*, po
inter>, __is_derived_Tp<_Up>>>
585 void reset(_Up*) =
delete;
592 swap(_M_t, __u._M_t);
600 template<
typename _Up,
typename = _Require<is_po
inter<po
inter>,
601 is_convertible<_Up*, po
inter>, __is_derived_Tp<_Up>>>
604 deleter_type,
const deleter_type&>::type) =
delete;
607 template<
typename _Up,
typename = _Require<is_po
inter<po
inter>,
608 is_convertible<_Up*, po
inter>, __is_derived_Tp<_Up>>>
610 remove_reference<deleter_type>::type&&) =
delete;
613 template<
typename _Tp,
typename _Dp>
615 swap(unique_ptr<_Tp, _Dp>& __x,
616 unique_ptr<_Tp, _Dp>& __y) noexcept
619 template<
typename _Tp,
typename _Dp,
620 typename _Up,
typename _Ep>
622 operator==(
const unique_ptr<_Tp, _Dp>& __x,
623 const unique_ptr<_Up, _Ep>& __y)
624 {
return __x.get() == __y.get(); }
626 template<
typename _Tp,
typename _Dp>
628 operator==(
const unique_ptr<_Tp, _Dp>& __x, nullptr_t) noexcept
631 template<
typename _Tp,
typename _Dp>
633 operator==(nullptr_t,
const unique_ptr<_Tp, _Dp>& __x) noexcept
636 template<
typename _Tp,
typename _Dp,
637 typename _Up,
typename _Ep>
639 operator!=(
const unique_ptr<_Tp, _Dp>& __x,
640 const unique_ptr<_Up, _Ep>& __y)
641 {
return __x.get() != __y.get(); }
643 template<
typename _Tp,
typename _Dp>
645 operator!=(
const unique_ptr<_Tp, _Dp>& __x, nullptr_t) noexcept
646 {
return (
bool)__x; }
648 template<
typename _Tp,
typename _Dp>
650 operator!=(nullptr_t,
const unique_ptr<_Tp, _Dp>& __x) noexcept
651 {
return (
bool)__x; }
653 template<
typename _Tp,
typename _Dp,
654 typename _Up,
typename _Ep>
656 operator<(const unique_ptr<_Tp, _Dp>& __x,
657 const unique_ptr<_Up, _Ep>& __y)
660 std::common_type<typename unique_ptr<_Tp, _Dp>::pointer,
661 typename unique_ptr<_Up, _Ep>::pointer>::type _CT;
665 template<
typename _Tp,
typename _Dp>
667 operator<(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
671 template<
typename _Tp,
typename _Dp>
673 operator<(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
677 template<
typename _Tp,
typename _Dp,
678 typename _Up,
typename _Ep>
680 operator<=(const unique_ptr<_Tp, _Dp>& __x,
681 const unique_ptr<_Up, _Ep>& __y)
682 {
return !(__y < __x); }
684 template<
typename _Tp,
typename _Dp>
686 operator<=(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
687 {
return !(
nullptr < __x); }
689 template<
typename _Tp,
typename _Dp>
691 operator<=(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
692 {
return !(__x <
nullptr); }
694 template<
typename _Tp,
typename _Dp,
695 typename _Up,
typename _Ep>
697 operator>(
const unique_ptr<_Tp, _Dp>& __x,
698 const unique_ptr<_Up, _Ep>& __y)
699 {
return (__y < __x); }
701 template<
typename _Tp,
typename _Dp>
703 operator>(
const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
707 template<
typename _Tp,
typename _Dp>
709 operator>(nullptr_t,
const unique_ptr<_Tp, _Dp>& __x)
713 template<
typename _Tp,
typename _Dp,
714 typename _Up,
typename _Ep>
716 operator>=(
const unique_ptr<_Tp, _Dp>& __x,
717 const unique_ptr<_Up, _Ep>& __y)
718 {
return !(__x < __y); }
720 template<
typename _Tp,
typename _Dp>
722 operator>=(
const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
723 {
return !(__x <
nullptr); }
725 template<
typename _Tp,
typename _Dp>
727 operator>=(nullptr_t,
const unique_ptr<_Tp, _Dp>& __x)
728 {
return !(
nullptr < __x); }
731 template<
typename _Tp,
typename _Dp>
733 :
public __hash_base<size_t, unique_ptr<_Tp, _Dp>>
743 #if __cplusplus > 201103L
744 template<
typename _Tp>
748 template<
typename _Tp>
749 struct _MakeUniq<_Tp[]>
750 {
typedef unique_ptr<_Tp[]> __array; };
752 template<
typename _Tp,
size_t _Bound>
753 struct _MakeUniq<_Tp[_Bound]>
754 {
struct __invalid_type { }; };
757 template<
typename _Tp,
typename... _Args>
758 inline typename _MakeUniq<_Tp>::__single_object
759 make_unique(_Args&&... __args)
760 {
return unique_ptr<_Tp>(
new _Tp(std::forward<_Args>(__args)...)); }
763 template<
typename _Tp>
764 inline typename _MakeUniq<_Tp>::__array
765 make_unique(
size_t __num)
766 {
return unique_ptr<_Tp>(
new typename remove_extent<_Tp>::type[__num]()); }
769 template<
typename _Tp,
typename... _Args>
770 inline typename _MakeUniq<_Tp>::__invalid_type
771 make_unique(_Args&&...) =
delete;
776 _GLIBCXX_END_NAMESPACE_VERSION