Horizon
autofree_ptr.hpp
1 #pragma once
2 #include <functional>
3 
4 namespace horizon {
5 template <typename T> class autofree_ptr {
6 public:
7  autofree_ptr(T *p, std::function<void(T *)> ffn) : ptr(p), free_fn(ffn)
8  {
9  }
10  autofree_ptr(std::function<void(T *)> ffn) : free_fn(ffn)
11  {
12  }
13 
14  autofree_ptr(autofree_ptr &&other)
15  {
16  ptr = other.ptr;
17  free_fn = other.free_fn;
18  other.ptr = nullptr;
19  }
20  autofree_ptr &operator=(autofree_ptr &&) = delete;
21 
22  autofree_ptr(autofree_ptr const &) = delete;
23  autofree_ptr &operator=(autofree_ptr const &) = delete;
24 
25  T *ptr = nullptr;
26  std::function<void(T *)> free_fn;
27 
28  T &operator*()
29  {
30  return *ptr;
31  }
32 
33  T *operator->() const
34  {
35  return ptr;
36  }
37 
38  operator T *() const
39  {
40  return ptr;
41  }
42 
43  ~autofree_ptr()
44  {
45  if (ptr)
46  free_fn(ptr);
47  }
48 };
49 } // namespace horizon