Horizon
Loading...
Searching...
No Matches
autofree_ptr.hpp
1#pragma once
2#include <functional>
3
4namespace horizon {
5template <typename T> class autofree_ptr {
6public:
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
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
44 {
45 if (ptr)
46 free_fn(ptr);
47 }
48};
49} // namespace horizon
Definition autofree_ptr.hpp:5