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,
70 typename = _Require<is_convertible<_Up*, _Tp*>>>
78 "can't delete pointer to incomplete type");
79 static_assert(
sizeof(_Tp)>0,
80 "can't delete pointer to incomplete type");
89 template<
typename _Tp>
105 template<
typename _Up,
110 template<
typename _Up>
114 static_assert(
sizeof(_Tp)>0,
115 "can't delete pointer to incomplete type");
123 template <
typename _Tp,
typename _Dp>
124 class __uniq_ptr_impl
126 template <
typename _Up,
typename _Ep,
typename =
void>
132 template <
typename _Up,
typename _Ep>
134 _Ptr<_Up, _Ep, __void_t<typename remove_reference<_Ep>::type::pointer>>
136 using type =
typename remove_reference<_Ep>::type::pointer;
140 using _DeleterConstraint = enable_if<
141 __and_<__not_<is_pointer<_Dp>>,
142 is_default_constructible<_Dp>>::value>;
144 using pointer =
typename _Ptr<_Tp, _Dp>::type;
146 static_assert( !is_rvalue_reference<_Dp>::value,
147 "unique_ptr's deleter type must be a function object type"
148 " or an lvalue reference type" );
150 __uniq_ptr_impl() =
default;
151 __uniq_ptr_impl(pointer __p) : _M_t() { _M_ptr() = __p; }
153 template<
typename _Del>
154 __uniq_ptr_impl(pointer __p, _Del&& __d)
157 __uniq_ptr_impl(__uniq_ptr_impl&& __u) noexcept
159 { __u._M_ptr() =
nullptr; }
161 __uniq_ptr_impl& operator=(__uniq_ptr_impl&& __u) noexcept
163 reset(__u.release());
164 _M_deleter() = std::forward<_Dp>(__u._M_deleter());
168 pointer& _M_ptr() {
return std::get<0>(_M_t); }
169 pointer _M_ptr()
const {
return std::get<0>(_M_t); }
170 _Dp& _M_deleter() {
return std::get<1>(_M_t); }
171 const _Dp& _M_deleter()
const {
return std::get<1>(_M_t); }
173 void reset(pointer __p) noexcept
175 const pointer __old_p = _M_ptr();
178 _M_deleter()(__old_p);
181 pointer release() noexcept
183 pointer __p = _M_ptr();
189 tuple<pointer, _Dp> _M_t;
193 template <
typename _Tp,
typename _Dp,
194 bool = is_move_constructible<_Dp>::value,
195 bool = is_move_assignable<_Dp>::value>
196 struct __uniq_ptr_data : __uniq_ptr_impl<_Tp, _Dp>
198 using __uniq_ptr_impl<_Tp, _Dp>::__uniq_ptr_impl;
199 __uniq_ptr_data(__uniq_ptr_data&&) =
default;
200 __uniq_ptr_data& operator=(__uniq_ptr_data&&) =
default;
203 template <
typename _Tp,
typename _Dp>
204 struct __uniq_ptr_data<_Tp, _Dp, true, false> : __uniq_ptr_impl<_Tp, _Dp>
206 using __uniq_ptr_impl<_Tp, _Dp>::__uniq_ptr_impl;
207 __uniq_ptr_data(__uniq_ptr_data&&) =
default;
208 __uniq_ptr_data& operator=(__uniq_ptr_data&&) =
delete;
211 template <
typename _Tp,
typename _Dp>
212 struct __uniq_ptr_data<_Tp, _Dp, false, true> : __uniq_ptr_impl<_Tp, _Dp>
214 using __uniq_ptr_impl<_Tp, _Dp>::__uniq_ptr_impl;
215 __uniq_ptr_data(__uniq_ptr_data&&) =
delete;
216 __uniq_ptr_data& operator=(__uniq_ptr_data&&) =
default;
219 template <
typename _Tp,
typename _Dp>
220 struct __uniq_ptr_data<_Tp, _Dp, false, false> : __uniq_ptr_impl<_Tp, _Dp>
222 using __uniq_ptr_impl<_Tp, _Dp>::__uniq_ptr_impl;
223 __uniq_ptr_data(__uniq_ptr_data&&) =
delete;
224 __uniq_ptr_data& operator=(__uniq_ptr_data&&) =
delete;
229 template <
typename _Tp,
typename _Dp = default_delete<_Tp>>
232 template <
typename _Up>
233 using _DeleterConstraint =
234 typename __uniq_ptr_impl<_Tp, _Up>::_DeleterConstraint::type;
236 __uniq_ptr_data<_Tp, _Dp> _M_t;
239 using pointer =
typename __uniq_ptr_impl<_Tp, _Dp>::pointer;
240 using element_type = _Tp;
241 using deleter_type = _Dp;
246 template<
typename _Up,
typename _Ep>
247 using __safe_conversion_up = __and_<
249 __not_<is_array<_Up>>
256 template<
typename _Del = _Dp,
typename = _DeleterConstra
int<_Del>>
267 template<
typename _Del = _Dp,
typename = _DeleterConstra
int<_Del>>
280 template<
typename _Del = deleter_type,
281 typename = _Require<is_copy_constructible<_Del>>>
292 template<
typename _Del = deleter_type,
293 typename = _Require<is_move_constructible<_Del>>>
296 _Del&&> __d) noexcept
300 template<
typename _Del = deleter_type,
301 typename _DelUnref =
typename remove_reference<_Del>::type>
304 _DelUnref&&>) =
delete;
307 template<
typename _Del = _Dp,
typename = _DeleterConstra
int<_Del>>
323 template<
typename _Up,
typename _Ep,
typename = _Require<
324 __safe_conversion_up<_Up, _Ep>,
329 : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter()))
332 #if _GLIBCXX_USE_DEPRECATED
333 #pragma GCC diagnostic push
334 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
336 template<
typename _Up,
typename = _Require<
339 #pragma GCC diagnostic pop
345 static_assert(__is_invocable<deleter_type&, pointer>::value,
346 "unique_ptr's deleter must be invocable with a pointer");
347 auto& __ptr = _M_t._M_ptr();
348 if (__ptr !=
nullptr)
368 template<
typename _Up,
typename _Ep>
370 __safe_conversion_up<_Up, _Ep>,
376 reset(__u.release());
377 get_deleter() = std::forward<_Ep>(__u.get_deleter());
392 typename add_lvalue_reference<element_type>::type
395 __glibcxx_assert(
get() != pointer());
403 _GLIBCXX_DEBUG_PEDASSERT(
get() != pointer());
410 {
return _M_t._M_ptr(); }
415 {
return _M_t._M_deleter(); }
420 {
return _M_t._M_deleter(); }
423 explicit operator bool() const noexcept
424 {
return get() == pointer() ? false :
true; }
431 {
return _M_t.release(); }
440 reset(pointer __p = pointer()) noexcept
442 static_assert(__is_invocable<deleter_type&, pointer>::value,
443 "unique_ptr's deleter must be invocable with a pointer");
452 swap(_M_t, __u._M_t);
464 template<
typename _Tp,
typename _Dp>
467 template <
typename _Up>
468 using _DeleterConstraint =
469 typename __uniq_ptr_impl<_Tp, _Up>::_DeleterConstraint::type;
471 __uniq_ptr_data<_Tp, _Dp> _M_t;
473 template<
typename _Up>
474 using __remove_cv =
typename remove_cv<_Up>::type;
477 template<
typename _Up>
478 using __is_derived_Tp
479 = __and_< is_base_of<_Tp, _Up>,
480 __not_<is_same<__remove_cv<_Tp>, __remove_cv<_Up>>> >;
483 using pointer =
typename __uniq_ptr_impl<_Tp, _Dp>::pointer;
484 using element_type = _Tp;
485 using deleter_type = _Dp;
489 template<
typename _Up,
typename _Ep,
491 typename _UP_pointer =
typename _UPtr::pointer,
492 typename _UP_element_type =
typename _UPtr::element_type>
493 using __safe_conversion_up = __and_<
501 template<
typename _Up>
502 using __safe_conversion_raw = __and_<
503 __or_<__or_<is_same<_Up, pointer>,
505 __and_<is_pointer<_Up>,
508 typename remove_pointer<_Up>::type(*)[],
517 template<
typename _Del = _Dp,
typename = _DeleterConstra
int<_Del>>
529 template<
typename _Up,
531 typename = _DeleterConstraint<_Vp>,
533 __safe_conversion_raw<_Up>::value,
bool>::type>
547 template<
typename _Up,
typename _Del = deleter_type,
548 typename = _Require<__safe_conversion_raw<_Up>,
561 template<
typename _Up,
typename _Del = deleter_type,
562 typename = _Require<__safe_conversion_raw<_Up>,
566 _Del&&> __d) noexcept
570 template<
typename _Up,
typename _Del = deleter_type,
571 typename _DelUnref =
typename remove_reference<_Del>::type,
572 typename = _Require<__safe_conversion_raw<_Up>>>
575 _DelUnref&&>) =
delete;
581 template<
typename _Del = _Dp,
typename = _DeleterConstra
int<_Del>>
586 template<
typename _Up,
typename _Ep,
typename = _Require<
587 __safe_conversion_up<_Up, _Ep>,
592 : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter()))
598 auto& __ptr = _M_t._M_ptr();
599 if (__ptr !=
nullptr)
620 template<
typename _Up,
typename _Ep>
628 reset(__u.release());
629 get_deleter() = std::forward<_Ep>(__u.get_deleter());
644 typename std::add_lvalue_reference<element_type>::type
647 __glibcxx_assert(
get() != pointer());
654 {
return _M_t._M_ptr(); }
659 {
return _M_t._M_deleter(); }
664 {
return _M_t._M_deleter(); }
667 explicit operator bool() const noexcept
668 {
return get() == pointer() ? false :
true; }
675 {
return _M_t.release(); }
683 template <
typename _Up,
685 __or_<is_same<_Up, pointer>,
686 __and_<is_same<pointer, element_type*>,
689 typename remove_pointer<_Up>::type(*)[],
699 void reset(nullptr_t =
nullptr) noexcept
700 {
reset(pointer()); }
707 swap(_M_t, __u._M_t);
718 template<
typename _Tp,
typename _Dp>
720 #if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11
722 typename enable_if<__is_swappable<_Dp>::value>::type
730 #if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11
731 template<
typename _Tp,
typename _Dp>
738 template<
typename _Tp,
typename _Dp,
739 typename _Up,
typename _Ep>
740 _GLIBCXX_NODISCARD
inline bool
743 {
return __x.
get() == __y.
get(); }
746 template<
typename _Tp,
typename _Dp>
747 _GLIBCXX_NODISCARD
inline bool
752 template<
typename _Tp,
typename _Dp>
753 _GLIBCXX_NODISCARD
inline bool
758 template<
typename _Tp,
typename _Dp,
759 typename _Up,
typename _Ep>
760 _GLIBCXX_NODISCARD
inline bool
763 {
return __x.
get() != __y.
get(); }
766 template<
typename _Tp,
typename _Dp>
767 _GLIBCXX_NODISCARD
inline bool
769 {
return (
bool)__x; }
772 template<
typename _Tp,
typename _Dp>
773 _GLIBCXX_NODISCARD
inline bool
775 {
return (
bool)__x; }
778 template<
typename _Tp,
typename _Dp,
779 typename _Up,
typename _Ep>
780 _GLIBCXX_NODISCARD
inline bool
786 typename unique_ptr<_Up, _Ep>::pointer>::type _CT;
791 template<
typename _Tp,
typename _Dp>
792 _GLIBCXX_NODISCARD
inline bool
800 template<
typename _Tp,
typename _Dp>
801 _GLIBCXX_NODISCARD
inline bool
809 template<
typename _Tp,
typename _Dp,
810 typename _Up,
typename _Ep>
811 _GLIBCXX_NODISCARD
inline bool
814 {
return !(__y < __x); }
817 template<
typename _Tp,
typename _Dp>
818 _GLIBCXX_NODISCARD
inline bool
820 {
return !(
nullptr < __x); }
823 template<
typename _Tp,
typename _Dp>
824 _GLIBCXX_NODISCARD
inline bool
826 {
return !(__x <
nullptr); }
829 template<
typename _Tp,
typename _Dp,
830 typename _Up,
typename _Ep>
831 _GLIBCXX_NODISCARD
inline bool
834 {
return (__y < __x); }
837 template<
typename _Tp,
typename _Dp>
838 _GLIBCXX_NODISCARD
inline bool
846 template<
typename _Tp,
typename _Dp>
847 _GLIBCXX_NODISCARD
inline bool
855 template<
typename _Tp,
typename _Dp,
856 typename _Up,
typename _Ep>
857 _GLIBCXX_NODISCARD
inline bool
860 {
return !(__x < __y); }
863 template<
typename _Tp,
typename _Dp>
864 _GLIBCXX_NODISCARD
inline bool
866 {
return !(__x <
nullptr); }
869 template<
typename _Tp,
typename _Dp>
870 _GLIBCXX_NODISCARD
inline bool
872 {
return !(
nullptr < __x); }
876 template<
typename _Up,
typename _Ptr =
typename _Up::pointer,
877 bool = __poison_hash<_Ptr>::__enable_hash_call>
878 struct __uniq_ptr_hash
879 #if ! _GLIBCXX_INLINE_VERSION
880 :
private __poison_hash<_Ptr>
884 operator()(
const _Up& __u)
const
885 noexcept(noexcept(std::declval<
hash<_Ptr>>()(std::declval<_Ptr>())))
889 template<
typename _Up,
typename _Ptr>
890 struct __uniq_ptr_hash<_Up, _Ptr, false>
891 :
private __poison_hash<_Ptr>
896 template<
typename _Tp,
typename _Dp>
898 :
public __hash_base<size_t, unique_ptr<_Tp, _Dp>>,
899 public __uniq_ptr_hash<unique_ptr<_Tp, _Dp>>
902 #if __cplusplus > 201103L
904 #define __cpp_lib_make_unique 201304
908 template<
typename _Tp>
910 {
typedef unique_ptr<_Tp> __single_object; };
912 template<
typename _Tp>
913 struct _MakeUniq<_Tp[]>
914 {
typedef unique_ptr<_Tp[]> __array; };
916 template<
typename _Tp,
size_t _Bound>
917 struct _MakeUniq<_Tp[_Bound]>
918 {
struct __invalid_type { }; };
923 template<
typename _Tp,
typename... _Args>
924 inline typename _MakeUniq<_Tp>::__single_object
929 template<
typename _Tp>
930 inline typename _MakeUniq<_Tp>::__array
935 template<
typename _Tp,
typename... _Args>
936 inline typename _MakeUniq<_Tp>::__invalid_type
937 make_unique(_Args&&...) =
delete;
943 #if __cplusplus >= 201703L
944 namespace __detail::__variant
946 template<
typename>
struct _Never_valueless_alt;
950 template<
typename _Tp,
typename _Del>
957 _GLIBCXX_END_NAMESPACE_VERSION