31 #define _UNIQUE_PTR_H 1
33 #ifndef __GXX_EXPERIMENTAL_CXX0X__
39 #include <type_traits>
43 _GLIBCXX_BEGIN_NAMESPACE(std)
51 template<typename _Tp>
56 template<
typename _Up>
60 operator()(_Tp* __ptr)
const
62 static_assert(
sizeof(_Tp)>0,
63 "can't delete pointer to incomplete type");
71 template<
typename _Tp>
75 operator()(_Tp* __ptr)
const
77 static_assert(
sizeof(_Tp)>0,
78 "can't delete pointer to incomplete type");
84 template <
typename _Tp,
typename _Tp_Deleter = default_delete<_Tp> >
89 typedef _Tp*
unique_ptr::* __unspecified_pointer_type;
93 typedef _Tp element_type;
94 typedef _Tp_Deleter deleter_type;
98 : _M_t(pointer(), deleter_type())
100 "constructed with null function pointer deleter"); }
104 : _M_t(__p, deleter_type())
106 "constructed with null function pointer deleter"); }
110 deleter_type,
const deleter_type&>::type __d)
114 typename std::remove_reference<deleter_type>::type&& __d)
117 "rvalue deleter bound to reference"); }
121 : _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) { }
123 template<
typename _Up,
typename _Up_Deleter>
125 : _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter()))
135 reset(__u.release());
136 get_deleter() =
std::move(__u.get_deleter());
140 template<
typename _Up,
typename _Up_Deleter>
144 reset(__u.release());
145 get_deleter() =
std::move(__u.get_deleter());
150 operator=(__unspecified_pointer_type)
157 typename std::add_lvalue_reference<element_type>::type operator*()
const
159 _GLIBCXX_DEBUG_ASSERT(
get() != 0);
166 _GLIBCXX_DEBUG_ASSERT(
get() != 0);
172 {
return std::get<0>(_M_t); }
174 typename std::add_lvalue_reference<deleter_type>::type
176 {
return std::get<1>(_M_t); }
179 typename std::add_const<deleter_type>::type
182 {
return std::get<1>(_M_t); }
184 operator __unspecified_bool_type ()
const
185 {
return get() == 0 ? 0 : &unique_ptr::_M_t; }
192 std::get<0>(_M_t) = 0;
197 reset(pointer __p = pointer())
201 get_deleter()(
get());
202 std::get<0>(_M_t) = __p;
210 swap(_M_t, __u._M_t);
216 template<
typename _Up,
typename _Up_Deleter>
221 template<
typename _Up,
typename _Up_Deleter>
232 template<
typename _Tp,
typename _Tp_Deleter>
237 typedef _Tp*
unique_ptr::* __unspecified_pointer_type;
240 typedef _Tp* pointer;
241 typedef _Tp element_type;
242 typedef _Tp_Deleter deleter_type;
246 : _M_t(pointer(), deleter_type())
248 "constructed with null function pointer deleter"); }
252 : _M_t(__p, deleter_type())
254 "constructed with null function pointer deleter"); }
258 deleter_type,
const deleter_type&>::type __d)
262 typename std::remove_reference<deleter_type>::type && __d)
265 "rvalue deleter bound to reference"); }
269 : _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) { }
271 template<
typename _Up,
typename _Up_Deleter>
273 : _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter()))
283 reset(__u.release());
284 get_deleter() =
std::move(__u.get_deleter());
288 template<
typename _Up,
typename _Up_Deleter>
292 reset(__u.release());
293 get_deleter() =
std::move(__u.get_deleter());
298 operator=(__unspecified_pointer_type)
305 typename std::add_lvalue_reference<element_type>::type
306 operator[](
size_t __i)
const
308 _GLIBCXX_DEBUG_ASSERT(
get() != 0);
314 {
return std::get<0>(_M_t); }
316 typename std::add_lvalue_reference<deleter_type>::type
318 {
return std::get<1>(_M_t); }
321 typename std::add_const<deleter_type>::type
324 {
return std::get<1>(_M_t); }
326 operator __unspecified_bool_type ()
const
327 {
return get() == 0 ? 0 : &unique_ptr::_M_t; }
334 std::get<0>(_M_t) = 0;
339 reset(pointer __p = pointer())
343 get_deleter()(
get());
344 std::get<0>(_M_t) = __p;
349 template<
typename _Up>
350 void reset(_Up) =
delete;
356 swap(_M_t, __u._M_t);
365 template<
typename _Up>
368 deleter_type,
const deleter_type&>::type,
369 typename std::enable_if<std::is_convertible<_Up*,
370 pointer>::value>::type* = 0) =
delete;
372 template<
typename _Up>
373 unique_ptr(_Up*,
typename std::remove_reference<deleter_type>::type&&,
374 typename std::enable_if<std::is_convertible<_Up*,
375 pointer>::value>::type* = 0) =
delete;
377 template<
typename _Up>
379 unique_ptr(_Up*,
typename std::enable_if<std::is_convertible<_Up*,
380 pointer>::value>::type* = 0) =
delete;
386 template<
typename _Tp,
typename _Tp_Deleter>
392 template<
typename _Tp,
typename _Tp_Deleter>
394 swap(unique_ptr<_Tp, _Tp_Deleter>&& __x,
395 unique_ptr<_Tp, _Tp_Deleter>& __y)
398 template<
typename _Tp,
typename _Tp_Deleter>
400 swap(unique_ptr<_Tp, _Tp_Deleter>& __x,
401 unique_ptr<_Tp, _Tp_Deleter>&& __y)
404 template<
typename _Tp,
typename _Tp_Deleter,
405 typename _Up,
typename _Up_Deleter>
407 operator==(
const unique_ptr<_Tp, _Tp_Deleter>& __x,
408 const unique_ptr<_Up, _Up_Deleter>& __y)
409 {
return __x.get() == __y.get(); }
411 template<
typename _Tp,
typename _Tp_Deleter,
412 typename _Up,
typename _Up_Deleter>
414 operator!=(
const unique_ptr<_Tp, _Tp_Deleter>& __x,
415 const unique_ptr<_Up, _Up_Deleter>& __y)
416 {
return !(__x.get() == __y.get()); }
418 template<
typename _Tp,
typename _Tp_Deleter,
419 typename _Up,
typename _Up_Deleter>
421 operator<(const unique_ptr<_Tp, _Tp_Deleter>& __x,
422 const unique_ptr<_Up, _Up_Deleter>& __y)
423 {
return __x.get() < __y.get(); }
425 template<
typename _Tp,
typename _Tp_Deleter,
426 typename _Up,
typename _Up_Deleter>
428 operator<=(const unique_ptr<_Tp, _Tp_Deleter>& __x,
429 const unique_ptr<_Up, _Up_Deleter>& __y)
430 {
return !(__y.get() < __x.get()); }
432 template<
typename _Tp,
typename _Tp_Deleter,
433 typename _Up,
typename _Up_Deleter>
435 operator>(
const unique_ptr<_Tp, _Tp_Deleter>& __x,
436 const unique_ptr<_Up, _Up_Deleter>& __y)
437 {
return __y.get() < __x.get(); }
439 template<
typename _Tp,
typename _Tp_Deleter,
440 typename _Up,
typename _Up_Deleter>
442 operator>=(
const unique_ptr<_Tp, _Tp_Deleter>& __x,
443 const unique_ptr<_Up, _Up_Deleter>& __y)
444 {
return !(__x.get() < __y.get()); }
448 _GLIBCXX_END_NAMESPACE
20.7.12.2 unique_ptr for single objects.
_OI move(_II __first, _II __last, _OI __result)
Moves the range [first,last) into result.
Primary template, default_delete.