]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/lib/libk/unique_ptr.h
update
[l4.git] / kernel / fiasco / src / lib / libk / unique_ptr.h
1 #pragma once
2
3 #include <cxx/type_traits>
4
5 namespace cxx
6 {
7
8 template< typename T >
9 struct default_delete
10 {
11   default_delete() {}
12
13   template< typename U >
14   default_delete(default_delete<U> const &) {}
15
16   void operator () (T *p) const
17   { delete p; }
18 };
19
20 template< typename T >
21 struct default_delete<T[]>
22 {
23   default_delete() {}
24
25   void operator () (T *p)
26   { delete [] p; }
27 };
28
29 template< typename T, typename T_Del = default_delete<T> >
30 class unique_ptr
31 {
32 private:
33   struct _unspec;
34   typedef _unspec* _unspec_ptr_type;
35
36 public:
37   typedef T *pointer;
38   typedef T element_type;
39   typedef T_Del deleter_type;
40
41   unique_ptr() : _ptr(pointer()) {}
42
43   explicit unique_ptr(pointer p) : _ptr(p) {}
44
45   unique_ptr(unique_ptr &&o) : _ptr(o.release()) {}
46
47   ~unique_ptr() { reset(); }
48
49   unique_ptr &operator = (unique_ptr &&o)
50   {
51     reset(o.release());
52     return *this;
53   }
54
55   unique_ptr &operator = (_unspec_ptr_type)
56   {
57     reset();
58     return *this;
59   }
60
61   element_type &operator * () const { return *get(); }
62   pointer operator -> () const { return get(); }
63
64   pointer get() const { return _ptr; }
65
66   operator _unspec_ptr_type () const
67   { return reinterpret_cast<_unspec_ptr_type>(get()); }
68
69   pointer release()
70   {
71     pointer r = _ptr;
72     _ptr = 0;
73     return r;
74   }
75
76   void reset(pointer p = pointer())
77   {
78     if (p != get())
79       {
80         deleter_type()(get());
81         _ptr = p;
82       }
83   }
84
85   unique_ptr(unique_ptr const &) = delete;
86   unique_ptr &operator = (unique_ptr const &) = delete;
87
88 private:
89   pointer _ptr;
90 };
91
92 }