aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/cru/base/Guard.h44
1 files changed, 10 insertions, 34 deletions
diff --git a/include/cru/base/Guard.h b/include/cru/base/Guard.h
index 65e2dee4..c05bc668 100644
--- a/include/cru/base/Guard.h
+++ b/include/cru/base/Guard.h
@@ -29,51 +29,27 @@ struct Guard {
ExitFunc on_exit;
};
-/**
- * FreeFunc must handle nullptr correctly.
- */
-template <typename T, void (*FreeFunc)(T*) noexcept>
-struct TAutoFreePtr {
- TAutoFreePtr(T* ptr) : ptr(ptr) {}
- ~TAutoFreePtr() { FreeFunc(ptr); }
-
- CRU_DELETE_COPY(TAutoFreePtr)
-
- TAutoFreePtr(TAutoFreePtr&& other) noexcept : ptr(other.ptr) {
- other.ptr = nullptr;
- }
-
- TAutoFreePtr& operator=(TAutoFreePtr&& other) noexcept {
- if (this != &other) {
- FreeFunc(ptr);
- ptr = other.ptr;
- other.ptr = nullptr;
- }
- return *this;
- }
-
- operator T*() const { return ptr; }
- T* operator->() { return ptr; }
-
- T* ptr;
-};
-
namespace details {
template <typename T>
-inline void MyFree(T* p) noexcept {
- ::free(p);
-}
+struct AutoFreePtrDeleter {
+ void operator()(T* ptr) const noexcept { ::free(ptr); }
+};
} // namespace details
template <typename T>
-using AutoFreePtr = TAutoFreePtr<T, details::MyFree<T>>;
+using AutoFreePtr = std::unique_ptr<T, details::AutoFreePtrDeleter<T>>;
+
+template <typename T>
+inline AutoFreePtr<T> MakeAutoFree(T* ptr) {
+ return AutoFreePtr<T>(ptr);
+}
template <typename T, void (*DestructFunc)(T value) noexcept>
class AutoDestruct {
public:
AutoDestruct() : value_(std::nullopt), auto_destruct_(false) {}
- AutoDestruct(T value, bool auto_destruct = true)
+ explicit AutoDestruct(T value, bool auto_destruct = true)
: value_(std::move(value)), auto_destruct_(auto_destruct) {}
CRU_DELETE_COPY(AutoDestruct)