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>
73 "can't delete pointer to incomplete type");
74 static_assert(
sizeof(_Tp)>0,
75 "can't delete pointer to incomplete type");
83 template<
typename _Tp>
99 template<
typename _Up,
typename =
typename 100 enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value>::type>
104 template<
typename _Up>
105 typename enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value>::type
108 static_assert(
sizeof(_Tp)>0,
109 "can't delete pointer to incomplete type");
115 template <
typename _Tp,
typename _Dp = default_delete<_Tp> >
121 template<
typename _Up>
122 static typename _Up::pointer __test(
typename _Up::pointer*);
124 template<
typename _Up>
125 static _Tp* __test(...);
127 typedef typename remove_reference<_Dp>::type _Del;
130 typedef decltype(__test<_Del>(0)) type;
137 typedef typename _Pointer::type pointer;
138 typedef _Tp element_type;
139 typedef _Dp deleter_type;
144 template<
typename _Up,
typename _Ep>
145 using __safe_conversion_up = __and_<
146 is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>,
147 __not_<is_array<_Up>>,
148 __or_<__and_<is_reference<deleter_type>,
149 is_same<deleter_type, _Ep>>,
150 __and_<__not_<is_reference<deleter_type>>,
151 is_convertible<_Ep, deleter_type>>
161 "constructed with null function pointer deleter"); }
173 std::get<0>(_M_t) = __p;
175 "constructed with null function pointer deleter");
187 deleter_type,
const deleter_type&>::type __d) noexcept
198 typename remove_reference<deleter_type>::type&& __d) noexcept
199 : _M_t(
std::move(__p),
std::move(__d))
201 "rvalue deleter bound to reference"); }
206 "constructed with null function pointer deleter"); }
220 template<
typename _Up,
typename _Ep,
typename = _Require<
221 __safe_conversion_up<_Up, _Ep>,
222 typename conditional<is_reference<_Dp>::value,
224 is_convertible<_Ep, _Dp>>::type>>
229 #if _GLIBCXX_USE_DEPRECATED 231 template<
typename _Up,
typename = _Require<
232 is_convertible<_Up*, _Tp*>, is_same<_Dp, default_delete<_Tp>>>>
239 auto& __ptr = std::get<0>(_M_t);
240 if (__ptr !=
nullptr)
256 reset(__u.release());
257 get_deleter() = std::forward<deleter_type>(__u.get_deleter());
268 template<
typename _Up,
typename _Ep>
269 typename enable_if< __and_<
270 __safe_conversion_up<_Up, _Ep>,
271 is_assignable<deleter_type&, _Ep&&>
276 reset(__u.release());
277 get_deleter() = std::forward<_Ep>(__u.get_deleter());
292 typename add_lvalue_reference<element_type>::type
295 __glibcxx_assert(
get() != pointer());
303 _GLIBCXX_DEBUG_PEDASSERT(
get() != pointer());
310 {
return std::get<0>(_M_t); }
315 {
return std::get<1>(_M_t); }
320 {
return std::get<1>(_M_t); }
323 explicit operator bool() const noexcept
324 {
return get() == pointer() ?
false :
true; }
333 std::get<0>(_M_t) = pointer();
344 reset(pointer __p = pointer()) noexcept
347 swap(std::get<0>(_M_t), __p);
348 if (__p != pointer())
357 swap(_M_t, __u._M_t);
369 template<
typename _Tp,
typename _Dp>
375 template<
typename _Up>
376 static typename _Up::pointer __test(
typename _Up::pointer*);
378 template<
typename _Up>
379 static _Tp* __test(...);
381 typedef typename remove_reference<_Dp>::type _Del;
384 typedef decltype(__test<_Del>(0)) type;
390 template<
typename _Up>
391 using __remove_cv =
typename remove_cv<_Up>::type;
394 template<
typename _Up>
395 using __is_derived_Tp
396 = __and_< is_base_of<_Tp, _Up>,
397 __not_<is_same<__remove_cv<_Tp>, __remove_cv<_Up>>> >;
401 typedef typename _Pointer::type pointer;
402 typedef _Tp element_type;
403 typedef _Dp deleter_type;
407 template<
typename _Up,
typename _Ep,
409 typename _Up_element_type =
typename _Up_up::element_type>
410 using __safe_conversion_up = __and_<
412 is_same<pointer, element_type*>,
413 is_same<typename _Up_up::pointer, _Up_element_type*>,
414 is_convertible<_Up_element_type(*)[], element_type(*)[]>,
415 __or_<__and_<is_reference<deleter_type>, is_same<deleter_type, _Ep>>,
416 __and_<__not_<is_reference<deleter_type>>,
417 is_convertible<_Ep, deleter_type>>>
421 template<
typename _Up>
422 using __safe_conversion_raw = __and_<
423 __or_<__or_<is_same<_Up, pointer>,
424 is_same<_Up, nullptr_t>>,
425 __and_<is_pointer<_Up>,
426 is_same<pointer, element_type*>,
428 typename remove_pointer<_Up>::type(*)[],
440 "constructed with null function pointer deleter"); }
449 template<
typename _Up,
450 typename =
typename enable_if<
451 __safe_conversion_raw<_Up>::value,
bool>::type>
454 : _M_t(__p, deleter_type())
456 "constructed with null function pointer deleter"); }
466 template<
typename _Up,
467 typename =
typename enable_if<
468 __safe_conversion_raw<_Up>::value,
bool>::type>
471 deleter_type,
const deleter_type&>::type __d) noexcept
482 template<
typename _Up,
483 typename =
typename enable_if<
484 __safe_conversion_raw<_Up>::value,
bool>::type>
486 remove_reference<deleter_type>::type&& __d) noexcept
487 : _M_t(
std::move(__p),
std::move(__d))
489 "rvalue deleter bound to reference"); }
498 "constructed with null function pointer deleter"); }
500 template<
typename _Up,
typename _Ep,
501 typename = _Require<__safe_conversion_up<_Up, _Ep>>>
503 : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter()))
509 auto& __ptr = std::get<0>(_M_t);
510 if (__ptr !=
nullptr)
526 reset(__u.release());
527 get_deleter() = std::forward<deleter_type>(__u.get_deleter());
538 template<
typename _Up,
typename _Ep>
540 enable_if<__and_<__safe_conversion_up<_Up, _Ep>,
541 is_assignable<deleter_type&, _Ep&&>
546 reset(__u.release());
547 get_deleter() = std::forward<_Ep>(__u.get_deleter());
562 typename std::add_lvalue_reference<element_type>::type
565 __glibcxx_assert(
get() != pointer());
572 {
return std::get<0>(_M_t); }
577 {
return std::get<1>(_M_t); }
582 {
return std::get<1>(_M_t); }
585 explicit operator bool() const noexcept
586 {
return get() == pointer() ?
false :
true; }
595 std::get<0>(_M_t) = pointer();
605 template <
typename _Up,
607 __or_<is_same<_Up, pointer>,
608 __and_<is_same<pointer, element_type*>,
611 typename remove_pointer<_Up>::type(*)[],
622 swap(std::get<0>(_M_t), __ptr);
623 if (__ptr !=
nullptr)
627 void reset(nullptr_t =
nullptr) noexcept
637 swap(_M_t, __u._M_t);
645 template<
typename _Tp,
typename _Dp>
651 template<
typename _Tp,
typename _Dp,
652 typename _Up,
typename _Ep>
656 {
return __x.
get() == __y.
get(); }
658 template<
typename _Tp,
typename _Dp>
663 template<
typename _Tp,
typename _Dp>
668 template<
typename _Tp,
typename _Dp,
669 typename _Up,
typename _Ep>
673 {
return __x.
get() != __y.
get(); }
675 template<
typename _Tp,
typename _Dp>
678 {
return (
bool)__x; }
680 template<
typename _Tp,
typename _Dp>
683 {
return (
bool)__x; }
685 template<
typename _Tp,
typename _Dp,
686 typename _Up,
typename _Ep>
688 operator<(const unique_ptr<_Tp, _Dp>& __x,
692 std::common_type<typename unique_ptr<_Tp, _Dp>::pointer,
693 typename unique_ptr<_Up, _Ep>::pointer>::type _CT;
697 template<
typename _Tp,
typename _Dp>
699 operator<(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
703 template<
typename _Tp,
typename _Dp>
705 operator<(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
709 template<
typename _Tp,
typename _Dp,
710 typename _Up,
typename _Ep>
712 operator<=(const unique_ptr<_Tp, _Dp>& __x,
714 {
return !(__y < __x); }
716 template<
typename _Tp,
typename _Dp>
718 operator<=(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
719 {
return !(
nullptr < __x); }
721 template<
typename _Tp,
typename _Dp>
723 operator<=(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
724 {
return !(__x <
nullptr); }
726 template<
typename _Tp,
typename _Dp,
727 typename _Up,
typename _Ep>
731 {
return (__y < __x); }
733 template<
typename _Tp,
typename _Dp>
739 template<
typename _Tp,
typename _Dp>
745 template<
typename _Tp,
typename _Dp,
746 typename _Up,
typename _Ep>
750 {
return !(__x < __y); }
752 template<
typename _Tp,
typename _Dp>
755 {
return !(__x <
nullptr); }
757 template<
typename _Tp,
typename _Dp>
760 {
return !(
nullptr < __x); }
763 template<
typename _Tp,
typename _Dp>
765 :
public __hash_base<size_t, unique_ptr<_Tp, _Dp>>
775 #if __cplusplus > 201103L 777 #define __cpp_lib_make_unique 201304 779 template<
typename _Tp>
783 template<
typename _Tp>
784 struct _MakeUniq<_Tp[]>
787 template<
typename _Tp,
size_t _Bound>
788 struct _MakeUniq<_Tp[_Bound]>
789 {
struct __invalid_type { }; };
792 template<
typename _Tp,
typename... _Args>
798 template<
typename _Tp>
799 inline typename _MakeUniq<_Tp>::__array
804 template<
typename _Tp,
typename... _Args>
805 inline typename _MakeUniq<_Tp>::__invalid_type
811 _GLIBCXX_END_NAMESPACE_VERSION
void swap(unique_ptr &__u) noexcept
Exchange the pointer and deleter with another object.
pointer release() noexcept
Release ownership of any stored pointer.
constexpr unique_ptr() noexcept
Default constructor, creates a unique_ptr that owns nothing.
unique_ptr(pointer __p, typename conditional< is_reference< deleter_type >::value, deleter_type, const deleter_type & >::type __d) noexcept
~unique_ptr()
Destructor, invokes the deleter if the stored pointer is not null.
default_delete(const default_delete< _Up[]> &) noexcept
Converting constructor.
void swap(unique_ptr &__u) noexcept
Exchange the pointer and deleter with another object.
enable_if< is_convertible< _Up(*)[], _Tp(*)[]>::value >::type operator()(_Up *__ptr) const
Calls delete[] __ptr.
unique_ptr(_Up __p, typename remove_reference< deleter_type >::type &&__d) noexcept
_MakeUniq< _Tp >::__single_object make_unique(_Args &&...__args)
std::make_unique for single objects
deleter_type & get_deleter() noexcept
Return a reference to the stored deleter.
_Del * get_deleter(const __shared_ptr< _Tp, _Lp > &__p) noexcept
20.7.2.2.10 shared_ptr get_deleter
default_delete(const default_delete< _Up > &) noexcept
Converting constructor.
unique_ptr & operator=(unique_ptr &&__u) noexcept
Move assignment operator.
Primary template of default_delete, used by unique_ptr.
enable_if< __and_< __safe_conversion_up< _Up, _Ep >, is_assignable< deleter_type &, _Ep && > >::value, unique_ptr & >::type operator=(unique_ptr< _Up, _Ep > &&__u) noexcept
Assignment from another type.
unique_ptr(pointer __p) noexcept
unique_ptr(_Up __p) noexcept
pointer operator->() const noexcept
Return the stored pointer.
constexpr unique_ptr(nullptr_t) noexcept
Creates a unique_ptr that owns nothing.
unique_ptr & operator=(unique_ptr &&__u) noexcept
Move assignment operator.
unique_ptr & operator=(nullptr_t) noexcept
Reset the unique_ptr to empty, invoking the deleter if necessary.
A simple smart pointer providing strict ownership semantics.
void operator()(_Tp *__ptr) const
Calls delete __ptr.
constexpr unique_ptr(nullptr_t) noexcept
Creates a unique_ptr that owns nothing.
enable_if< __and_< __safe_conversion_up< _Up, _Ep >, is_assignable< deleter_type &, _Ep && > >::value, unique_ptr & >::type operator=(unique_ptr< _Up, _Ep > &&__u) noexcept
Assignment from another type.
std::add_lvalue_reference< element_type >::type operator[](size_t __i) const
Access an element of owned array.
constexpr default_delete() noexcept=default
Default constructor.
unique_ptr(pointer __p, typename remove_reference< deleter_type >::type &&__d) noexcept
unique_ptr & operator=(nullptr_t) noexcept
Reset the unique_ptr to empty, invoking the deleter if necessary.
pointer release() noexcept
Release ownership of any stored pointer.
const deleter_type & get_deleter() const noexcept
Return a reference to the stored deleter.
unique_ptr(unique_ptr &&__u) noexcept
Move constructor.
~unique_ptr() noexcept
Destructor, invokes the deleter if the stored pointer is not null.
pointer get() const noexcept
Return the stored pointer.
One of the comparison functors.
unique_ptr(unique_ptr< _Up, _Ep > &&__u) noexcept
Converting constructor from another type.
unique_ptr(unique_ptr &&__u) noexcept
Move constructor.
20.7.1.2 unique_ptr for single objects.
add_lvalue_reference< element_type >::type operator*() const
Dereference the stored pointer.
unique_ptr(_Up __p, typename conditional< is_reference< deleter_type >::value, deleter_type, const deleter_type & >::type __d) noexcept
constexpr unique_ptr() noexcept
Default constructor, creates a unique_ptr that owns nothing.
ISO C++ entities toplevel namespace is std.
void reset(_Up __p) noexcept
Replace the stored pointer.
Primary class template hash.
void reset(pointer __p=pointer()) noexcept
Replace the stored pointer.
deleter_type & get_deleter() noexcept
Return a reference to the stored deleter.
const deleter_type & get_deleter() const noexcept
Return a reference to the stored deleter.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.