summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/alloc_type.hpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/core/alloc_type.hpp b/src/core/alloc_type.hpp
index 6caaf916a..9c25cc9e3 100644
--- a/src/core/alloc_type.hpp
+++ b/src/core/alloc_type.hpp
@@ -180,4 +180,38 @@ public:
inline void operator delete[](void *ptr) { free(ptr); }
};
+/**
+ * A smart pointer class that free()'s the pointer on destruction.
+ * @tparam T Storage type.
+ */
+template <typename T>
+class AutoFreePtr
+{
+ T *ptr; ///< Stored pointer.
+
+public:
+ AutoFreePtr(T *ptr) : ptr(ptr) {}
+ ~AutoFreePtr() { free(this->ptr); }
+
+ /**
+ * Take ownership of a new pointer and free the old one if needed.
+ * @param ptr NEw pointer.
+ */
+ inline void Assign(T *ptr)
+ {
+ free(this->ptr);
+ this->ptr = ptr;
+ }
+
+ /** Dereference pointer. */
+ inline T *operator ->() { return this->ptr; }
+ /** Dereference pointer. */
+ inline const T *operator ->() const { return this->ptr; }
+
+ /** Cast to underlaying regular pointer. */
+ inline operator T *() { return this->ptr; }
+ /** Cast to underlaying regular pointer. */
+ inline operator const T *() const { return this->ptr; }
+};
+
#endif /* ALLOC_TYPE_HPP */