31 #define _UNIQUE_PTR_H 1 41 namespace std _GLIBCXX_VISIBILITY(default)
43 _GLIBCXX_BEGIN_NAMESPACE_VERSION
50 #if _GLIBCXX_USE_DEPRECATED 51 #pragma GCC diagnostic push 52 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 53 template<
typename>
class auto_ptr;
54 #pragma GCC diagnostic pop 58 template<
typename _Tp>
69 template<
typename _Up,
typename =
typename 78 "can't delete pointer to incomplete type");
79 static_assert(
sizeof(_Tp)>0,
80 "can't delete pointer to incomplete type");
88 template<
typename _Tp>
104 template<
typename _Up,
typename =
typename 109 template<
typename _Up>
113 static_assert(
sizeof(_Tp)>0,
114 "can't delete pointer to incomplete type");
119 template <
typename _Tp,
typename _Dp>
120 class __uniq_ptr_impl
122 template <
typename _Up,
typename _Ep,
typename =
void>
128 template <
typename _Up,
typename _Ep>
130 _Ptr<_Up, _Ep, __void_t<typename remove_reference<_Ep>::type::pointer>>
137 __and_<__not_<is_pointer<_Dp>>,
140 using pointer =
typename _Ptr<_Tp, _Dp>::type;
142 __uniq_ptr_impl() =
default;
143 __uniq_ptr_impl(pointer __p) : _M_t() { _M_ptr() = __p; }
145 template<
typename _Del>
146 __uniq_ptr_impl(pointer __p, _Del&& __d)
147 : _M_t(__p, std::forward<_Del>(__d)) { }
149 pointer& _M_ptr() {
return std::get<0>(_M_t); }
150 pointer _M_ptr()
const {
return std::get<0>(_M_t); }
151 _Dp& _M_deleter() {
return std::get<1>(_M_t); }
152 const _Dp& _M_deleter()
const {
return std::get<1>(_M_t); }
159 template <
typename _Tp,
typename _Dp = default_delete<_Tp>>
163 using _DeleterConstraint =
164 typename __uniq_ptr_impl<_Tp, _Up>::_DeleterConstraint::type;
166 __uniq_ptr_impl<_Tp, _Dp> _M_t;
169 using pointer =
typename __uniq_ptr_impl<_Tp, _Dp>::pointer;
170 using element_type = _Tp;
171 using deleter_type = _Dp;
175 template<
typename _Up,
typename _Ep>
176 using __safe_conversion_up = __and_<
178 __not_<is_array<_Up>>
184 template <
typename _Up = _Dp,
185 typename = _DeleterConstraint<_Up>>
196 template <
typename _Up = _Dp,
197 typename = _DeleterConstraint<_Up>>
223 typename remove_reference<deleter_type>::type&& __d) noexcept
224 : _M_t(std::move(__p), std::move(__d))
226 "rvalue deleter bound to reference"); }
229 template <
typename _Up = _Dp,
230 typename = _DeleterConstraint<_Up>>
237 : _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) { }
245 template<
typename _Up,
typename _Ep,
typename = _Require<
246 __safe_conversion_up<_Up, _Ep>,
251 : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter()))
254 #if _GLIBCXX_USE_DEPRECATED 255 #pragma GCC diagnostic push 256 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 258 template<
typename _Up,
typename = _Require<
261 #pragma GCC diagnostic pop 267 auto& __ptr = _M_t._M_ptr();
268 if (__ptr !=
nullptr)
269 get_deleter()(__ptr);
284 reset(__u.release());
285 get_deleter() = std::forward<deleter_type>(__u.get_deleter());
296 template<
typename _Up,
typename _Ep>
298 __safe_conversion_up<_Up, _Ep>,
304 reset(__u.release());
305 get_deleter() = std::forward<_Ep>(__u.get_deleter());
320 typename add_lvalue_reference<element_type>::type
323 __glibcxx_assert(
get() != pointer());
331 _GLIBCXX_DEBUG_PEDASSERT(
get() != pointer());
338 {
return _M_t._M_ptr(); }
343 {
return _M_t._M_deleter(); }
348 {
return _M_t._M_deleter(); }
351 explicit operator bool() const noexcept
352 {
return get() == pointer() ? false :
true; }
361 _M_t._M_ptr() = pointer();
372 reset(pointer __p = pointer()) noexcept
375 swap(_M_t._M_ptr(), __p);
376 if (__p != pointer())
385 swap(_M_t, __u._M_t);
397 template<
typename _Tp,
typename _Dp>
400 template <
typename _Up>
401 using _DeleterConstraint =
402 typename __uniq_ptr_impl<_Tp, _Up>::_DeleterConstraint::type;
404 __uniq_ptr_impl<_Tp, _Dp> _M_t;
406 template<
typename _Up>
407 using __remove_cv =
typename remove_cv<_Up>::type;
410 template<
typename _Up>
411 using __is_derived_Tp
412 = __and_< is_base_of<_Tp, _Up>,
413 __not_<is_same<__remove_cv<_Tp>, __remove_cv<_Up>>> >;
416 using pointer =
typename __uniq_ptr_impl<_Tp, _Dp>::pointer;
417 using element_type = _Tp;
418 using deleter_type = _Dp;
422 template<
typename _Up,
typename _Ep,
424 typename _UP_pointer =
typename _UPtr::pointer,
425 typename _UP_element_type =
typename _UPtr::element_type>
426 using __safe_conversion_up = __and_<
434 template<
typename _Up>
435 using __safe_conversion_raw = __and_<
436 __or_<__or_<is_same<_Up, pointer>,
438 __and_<is_pointer<_Up>,
439 is_same<pointer, element_type*>,
441 typename remove_pointer<_Up>::type(*)[],
450 template <
typename _Up = _Dp,
451 typename = _DeleterConstraint<_Up>>
463 template<
typename _Up,
465 typename = _DeleterConstraint<_Vp>,
467 __safe_conversion_raw<_Up>::value,
bool>::type>
481 template<
typename _Up,
483 __safe_conversion_raw<_Up>::value,
bool>::type>
486 deleter_type,
const deleter_type&>::type __d) noexcept
497 template<
typename _Up,
499 __safe_conversion_raw<_Up>::value,
bool>::type>
501 remove_reference<deleter_type>::type&& __d) noexcept
502 : _M_t(std::move(__p), std::move(__d))
504 "rvalue deleter bound to reference"); }
508 : _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) { }
511 template <
typename _Up = _Dp,
512 typename = _DeleterConstraint<_Up>>
515 template<
typename _Up,
typename _Ep,
typename = _Require<
516 __safe_conversion_up<_Up, _Ep>,
517 typename conditional<is_reference<_Dp>::value,
521 : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter()))
527 auto& __ptr = _M_t._M_ptr();
528 if (__ptr !=
nullptr)
529 get_deleter()(__ptr);
544 reset(__u.release());
545 get_deleter() = std::forward<deleter_type>(__u.get_deleter());
556 template<
typename _Up,
typename _Ep>
564 reset(__u.release());
565 get_deleter() = std::forward<_Ep>(__u.get_deleter());
580 typename std::add_lvalue_reference<element_type>::type
583 __glibcxx_assert(
get() != pointer());
590 {
return _M_t._M_ptr(); }
595 {
return _M_t._M_deleter(); }
600 {
return _M_t._M_deleter(); }
603 explicit operator bool() const noexcept
604 {
return get() == pointer() ? false :
true; }
613 _M_t._M_ptr() = pointer();
623 template <
typename _Up,
625 __or_<is_same<_Up, pointer>,
626 __and_<is_same<pointer, element_type*>,
629 typename remove_pointer<_Up>::type(*)[],
640 swap(_M_t._M_ptr(), __ptr);
641 if (__ptr !=
nullptr)
642 get_deleter()(__ptr);
645 void reset(nullptr_t =
nullptr) noexcept
655 swap(_M_t, __u._M_t);
663 template<
typename _Tp,
typename _Dp>
665 #if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11 675 #if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11 676 template<
typename _Tp,
typename _Dp>
682 template<
typename _Tp,
typename _Dp,
683 typename _Up,
typename _Ep>
687 {
return __x.
get() == __y.
get(); }
689 template<
typename _Tp,
typename _Dp>
694 template<
typename _Tp,
typename _Dp>
699 template<
typename _Tp,
typename _Dp,
700 typename _Up,
typename _Ep>
704 {
return __x.
get() != __y.
get(); }
706 template<
typename _Tp,
typename _Dp>
709 {
return (
bool)__x; }
711 template<
typename _Tp,
typename _Dp>
714 {
return (
bool)__x; }
716 template<
typename _Tp,
typename _Dp,
717 typename _Up,
typename _Ep>
719 operator<(const unique_ptr<_Tp, _Dp>& __x,
724 typename unique_ptr<_Up, _Ep>::pointer>::type _CT;
728 template<
typename _Tp,
typename _Dp>
730 operator<(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
734 template<
typename _Tp,
typename _Dp>
736 operator<(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
740 template<
typename _Tp,
typename _Dp,
741 typename _Up,
typename _Ep>
743 operator<=(const unique_ptr<_Tp, _Dp>& __x,
745 {
return !(__y < __x); }
747 template<
typename _Tp,
typename _Dp>
749 operator<=(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
750 {
return !(
nullptr < __x); }
752 template<
typename _Tp,
typename _Dp>
754 operator<=(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
755 {
return !(__x <
nullptr); }
757 template<
typename _Tp,
typename _Dp,
758 typename _Up,
typename _Ep>
762 {
return (__y < __x); }
764 template<
typename _Tp,
typename _Dp>
770 template<
typename _Tp,
typename _Dp>
776 template<
typename _Tp,
typename _Dp,
777 typename _Up,
typename _Ep>
781 {
return !(__x < __y); }
783 template<
typename _Tp,
typename _Dp>
786 {
return !(__x <
nullptr); }
788 template<
typename _Tp,
typename _Dp>
791 {
return !(
nullptr < __x); }
794 template<
typename _Tp,
typename _Dp>
796 :
public __hash_base<size_t, unique_ptr<_Tp, _Dp>>,
797 private __poison_hash<typename unique_ptr<_Tp, _Dp>::pointer>
807 #if __cplusplus > 201103L 809 #define __cpp_lib_make_unique 201304 811 template<
typename _Tp>
815 template<
typename _Tp>
816 struct _MakeUniq<_Tp[]>
819 template<
typename _Tp,
size_t _Bound>
820 struct _MakeUniq<_Tp[_Bound]>
821 {
struct __invalid_type { }; };
824 template<
typename _Tp,
typename... _Args>
830 template<
typename _Tp>
831 inline typename _MakeUniq<_Tp>::__array
836 template<
typename _Tp,
typename... _Args>
837 inline typename _MakeUniq<_Tp>::__invalid_type
843 _GLIBCXX_END_NAMESPACE_VERSION
pointer release() noexcept
Release ownership of any stored pointer.
default_delete(const default_delete< _Up > &) noexcept
Converting constructor.
constexpr unique_ptr() noexcept
Default constructor, creates a unique_ptr that owns nothing.
unique_ptr & operator=(unique_ptr &&__u) noexcept
Move assignment operator.
Primary class template hash.
Define a member typedef type to one of two argument types.
~unique_ptr() noexcept
Destructor, invokes the deleter if the stored pointer is not null.
void reset(_Up __p) noexcept
Replace the stored pointer.
Define a member typedef type only if a boolean constant is true.
const deleter_type & get_deleter() const noexcept
Return a reference to the stored deleter.
unique_ptr(unique_ptr &&__u) noexcept
Move constructor.
add_lvalue_reference< element_type >::type operator*() const
Dereference the stored pointer.
pointer release() noexcept
Release ownership of any stored pointer.
constexpr unique_ptr() noexcept
Default constructor, creates a unique_ptr that owns nothing.
pointer get() const noexcept
Return the stored pointer.
enable_if< is_convertible< _Up(*)[], _Tp(*)[]>::value >::type operator()(_Up *__ptr) const
Calls delete[] __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.
const deleter_type & get_deleter() const noexcept
Return a reference to the stored deleter.
_MakeUniq< _Tp >::__single_object make_unique(_Args &&... __args)
std::make_unique for single objects
A simple smart pointer providing strict ownership semantics.
~unique_ptr()
Destructor, invokes the deleter if the stored pointer is not null.
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.
default_delete(const default_delete< _Up[]> &) noexcept
Converting constructor.
ISO C++ entities toplevel namespace is std.
unique_ptr(pointer __p, typename remove_reference< deleter_type >::type &&__d) noexcept
typename remove_extent< _Tp >::type remove_extent_t
Alias template for remove_extent.
unique_ptr(unique_ptr< _Up, _Ep > &&__u) noexcept
Converting constructor from another type.
unique_ptr(pointer __p, typename conditional< is_reference< deleter_type >::value, deleter_type, const deleter_type &>::type __d) noexcept
std::add_lvalue_reference< element_type >::type operator[](size_t __i) const
Access an element of owned array.
unique_ptr(unique_ptr &&__u) noexcept
Move constructor.
void reset(pointer __p=pointer()) noexcept
Replace the stored pointer.
constexpr unique_ptr(nullptr_t) noexcept
Creates a unique_ptr that owns nothing.
deleter_type & get_deleter() noexcept
Return a reference to the stored deleter.
unique_ptr(_Up __p, typename remove_reference< deleter_type >::type &&__d) noexcept
deleter_type & get_deleter() noexcept
Return a reference to the stored deleter.
unique_ptr & operator=(unique_ptr &&__u) noexcept
Move assignment operator.
constexpr default_delete() noexcept=default
Default constructor.
unique_ptr & operator=(nullptr_t) noexcept
Reset the unique_ptr to empty, invoking the deleter if necessary.
void operator()(_Tp *__ptr) const
Calls delete __ptr.
pointer operator->() const noexcept
Return the stored pointer.
unique_ptr(pointer __p) noexcept
constexpr unique_ptr(nullptr_t) noexcept
Creates a unique_ptr that owns nothing.
unique_ptr(_Up __p) noexcept
void swap(unique_ptr &__u) noexcept
Exchange the pointer and deleter with another object.
unique_ptr(_Up __p, typename conditional< is_reference< deleter_type >::value, deleter_type, const deleter_type &>::type __d) noexcept
Primary template of default_delete, used by unique_ptr.
void swap(unique_ptr &__u) noexcept
Exchange the pointer and deleter with another object.
One of the comparison functors.
unique_ptr & operator=(nullptr_t) noexcept
Reset the unique_ptr to empty, invoking the deleter if necessary.
20.7.1.2 unique_ptr for single objects.