14 template<
typename U >
15 default_delete(default_delete<U>
const &) {}
17 void operator () (T *p)
const 21 template<
typename T >
22 struct default_delete<T[]>
26 void operator () (T *p)
30 template<
typename T,
typename C >
31 struct unique_ptr_index_op {};
33 template<
typename T,
typename C >
34 struct unique_ptr_index_op<T[], C>
37 reference operator [] (
int idx)
const 38 {
return static_cast<C
const *
>(
this)->
get()[idx]; }
41 template<
typename T,
typename T_Del = default_delete<T> >
42 class unique_ptr :
public unique_ptr_index_op<T, unique_ptr<T, T_Del> >
46 typedef _unspec* _unspec_ptr_type;
49 typedef typename cxx::remove_extent<T>::type element_type;
50 typedef element_type *pointer;
51 typedef element_type &reference;
52 typedef T_Del deleter_type;
54 unique_ptr() : _ptr(pointer()) {}
56 explicit unique_ptr(pointer p) : _ptr(p) {}
58 unique_ptr(unique_ptr &&o) : _ptr(o.release()) {}
60 ~unique_ptr() { reset(); }
62 unique_ptr &operator = (unique_ptr &&o)
68 unique_ptr &operator = (_unspec_ptr_type)
74 element_type &operator * ()
const {
return *
get(); }
75 pointer operator -> ()
const {
return get(); }
77 pointer
get()
const {
return _ptr; }
79 operator _unspec_ptr_type ()
const 80 {
return reinterpret_cast<_unspec_ptr_type
>(
get()); }
89 void reset(pointer p = pointer())
93 deleter_type()(
get());
98 unique_ptr(unique_ptr
const &) =
delete;
99 unique_ptr &operator = (unique_ptr
const &) =
delete;
105 template<
typename T >
107 make_unique_ptr(T *p)
108 {
return unique_ptr<T>(p); }
110 template<
typename T >
111 typename cxx::enable_if<cxx::is_array<T>::value, unique_ptr<T>>::type
112 make_unique(
unsigned long size)
113 {
return cxx::unique_ptr<T>(
new typename cxx::remove_extent<T>::type[size]()); }
115 template<
typename T,
typename... Args >
116 typename cxx::enable_if<!cxx::is_array<T>::value, unique_ptr<T>>::type
117 make_unique(Args &&... args)
118 {
return cxx::unique_ptr<T>(
new T(cxx::forward<Args>(args)...)); }