OpenLibrary
data_ptr.hpp
1 
2 #ifndef OPENLIBRARY_UTILS_COPY_PTR
3 #define OPENLIBRARY_UTILS_COPY_PTR
4 
5 namespace ol
6 {
7 
8  //deleter
9  namespace OpenLibrary_CopyPtr
10  {
11  template<class T>
12  void deleter(T *ptr)
13  {
14  delete ptr;
15  }
16 
17  template<class T>
18  void copier(T* &to_ptr, const T *from_ptr)
19  {
20  if (from_ptr == nullptr)
21  to_ptr = new T;
22  else
23  to_ptr = new T(*from_ptr);
24  }
25  }
26 
27 
29 
34  template<class T>
35  class data_ptr
36  {
37  public:
38  typedef void (*Deleter)(T *);
39  typedef void (*Copier)(T* &, const T *);
40 
42 
46  data_ptr(T *ptr = nullptr, Deleter d = &OpenLibrary_CopyPtr::deleter, Copier c = &OpenLibrary_CopyPtr::copier): m_ptr(ptr), m_deleter(d), m_copier(c)
47  {
48 
49  }
50 
52 
55  data_ptr(const data_ptr<T> &other): m_ptr(0), m_deleter(nullptr), m_copier(nullptr)
56  {
57  copy(other);
58  }
59 
61 
64  data_ptr(data_ptr<T> &&other): m_ptr(0), m_deleter(nullptr), m_copier(nullptr)
65  {
66  move(other);
67  other.m_ptr = nullptr;
68  }
69 
70  virtual ~data_ptr()
71  {
72  del();
73  }
74 
75  //takes ownership over data
76  data_ptr& operator=(T *ptr)
77  {
78  if (m_ptr != ptr)
79  {
80  del();
81  m_ptr = ptr;
82  }
83 
84  return *this;
85  }
86 
87  data_ptr& operator=(const data_ptr<T> &other)
88  {
89  if ( &other != this )
90  copy(other);
91 
92  return *this;
93  }
94 
95  T* operator->()
96  {
97  return m_ptr;
98  }
99 
100  const T* operator->() const
101  {
102  return m_ptr;
103  }
104 
105  T& operator *()
106  {
107  return *m_ptr;
108  }
109 
110  const T& operator *() const
111  {
112  return *m_ptr;
113  }
114 
115  T* get()
116  {
117  return m_ptr;
118  }
119 
120  const T* get() const
121  {
122  return m_ptr;
123  }
124 
125  private:
126  T *m_ptr;
127  Deleter m_deleter;
128  Copier m_copier;
129 
130  //getting operators
131  Deleter getDeleter() const
132  {
133  return m_deleter;
134  }
135 
136  Copier getCopier() const
137  {
138  return m_copier;
139  }
140 
141  //copy another copy_ptr
142  void copy(const data_ptr<T> &other)
143  {
144  //copy operators
145  m_deleter = other.m_deleter;
146  m_copier = other.m_copier;
147 
148  //copy data
149  copy(other.m_ptr);
150  }
151 
152 
153  //move another copy_ptr
154  void move(const data_ptr<T> &other)
155  {
156  m_deleter = other.m_deleter;
157  m_copier = other.m_copier;
158  m_ptr = other.m_ptr;
159  }
160 
161  //copy object
162  void copy(T *ptr)
163  {
164  //delete old data
165  del();
166 
167  //create copy
168  getCopier()(m_ptr, ptr);
169  }
170 
171  //delete object
172  void del() const
173  {
174  getDeleter()(m_ptr);
175  }
176 
177  };
178 
179 }
180 
181 #endif
void(* Deleter)(T *)
deleter for hold object
Definition: data_ptr.hpp:38
Copyable data smart pointer.
Definition: data_ptr.hpp:35
Definition: debug.hpp:45
data_ptr(T *ptr=nullptr, Deleter d=&OpenLibrary_CopyPtr::deleter, Copier c=&OpenLibrary_CopyPtr::copier)
Constructor.
Definition: data_ptr.hpp:46
void(* Copier)(T *&, const T *)
interface of copying function
Definition: data_ptr.hpp:39
data_ptr(data_ptr< T > &&other)
Move constructor.
Definition: data_ptr.hpp:64
data_ptr(const data_ptr< T > &other)
Copy constructor.
Definition: data_ptr.hpp:55