13 template< typename U >
14 default_delete(default_delete<U> const &) {}
16 void operator () (T *p) const
20 template< typename T >
21 struct default_delete<T[]>
25 void operator () (T *p)
29 template< typename T, typename T_Del = default_delete<T> >
34 typedef _unspec* _unspec_ptr_type;
37 typedef typename cxx::remove_extent<T>::type element_type;
38 typedef element_type *pointer;
39 typedef element_type &reference;
40 typedef T_Del deleter_type;
42 unique_ptr() : _ptr(pointer()) {}
44 explicit unique_ptr(pointer p) : _ptr(p) {}
46 unique_ptr(unique_ptr &&o) : _ptr(o.release()) {}
48 ~unique_ptr() { reset(); }
50 unique_ptr &operator = (unique_ptr &&o)
56 unique_ptr &operator = (_unspec_ptr_type)
62 element_type &operator * () const { return *get(); }
63 pointer operator -> () const { return get(); }
65 pointer get() const { return _ptr; }
67 operator _unspec_ptr_type () const
68 { return reinterpret_cast<_unspec_ptr_type>(get()); }
77 void reset(pointer p = pointer())
81 deleter_type()(get());
86 typename cxx::enable_if<cxx::is_array<T>::value, reference>::type
87 operator [] (unsigned long idx) const
91 unique_ptr(unique_ptr const &) = delete;
92 unique_ptr &operator = (unique_ptr const &) = delete;
99 template< typename T >
101 make_unique_ptr(T *p)
102 { return unique_ptr<T>(p); }