From d7fbe9332f01153efaea40e7a35f0025c75b9a04 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Sun, 16 Nov 2025 10:22:07 +0800 Subject: Abstract out AutoDestruct. --- include/cru/base/platform/win/Base.h | 73 +----------------------------------- 1 file changed, 2 insertions(+), 71 deletions(-) (limited to 'include/cru/base/platform/win/Base.h') diff --git a/include/cru/base/platform/win/Base.h b/include/cru/base/platform/win/Base.h index 8d221c83..cdd92541 100644 --- a/include/cru/base/platform/win/Base.h +++ b/include/cru/base/platform/win/Base.h @@ -6,8 +6,8 @@ #include "../../Base.h" #include "../../Bitmask.h" +#include "../../Guard.h" -#include #include #define NOMINMAX @@ -54,80 +54,11 @@ inline void CheckWinReturn(BOOL r, std::string_view message = "") { } } -template -class CRU_BASE_API TWin32Handle { - public: - TWin32Handle() : handle_(std::nullopt), auto_close_(false) {} - - TWin32Handle(H handle, bool auto_close) - : handle_(handle), auto_close_(auto_close) {} - - CRU_DELETE_COPY(TWin32Handle) - - TWin32Handle(TWin32Handle&& other) noexcept - : handle_(other.handle_), auto_close_(other.auto_close_) { - other.handle_ = std::nullopt; - other.auto_close_ = false; - } - - TWin32Handle& operator=(TWin32Handle&& other) noexcept { - if (this != &other) { - DoClose(); - handle_ = other.handle_; - auto_close_ = other.auto_close_; - other.handle_ = std::nullopt; - other.auto_close_ = false; - } - return *this; - } - - ~TWin32Handle() { DoClose(); } - - public: - bool IsValid() const { return handle_.has_value(); } - - void CheckValid( - std::optional additional_message = std::nullopt) const { - if (!IsValid()) { - std::string message("The win32 handle is invalid."); - if (additional_message) { - message += " "; - message += *additional_message; - } - throw Exception(std::move(message)); - } - } - - H Get() const { - CheckValid(); - return *handle_; - } - - H Release() { - CheckValid(); - auto handle = *handle_; - handle_ = std::nullopt; - auto_close_ = false; - return handle; - } - - private: - void DoClose() { - if (auto_close_ && handle_) { - CloseFunc(*handle_); - } - } - - private: - std::optional handle_; - bool auto_close_; -}; - namespace details { inline void MyCloseHandle(HANDLE handle) noexcept { ::CloseHandle(handle); } } // namespace details -using Win32Handle = TWin32Handle; +using Win32Handle = AutoDestruct; struct UniDirectionalWin32PipeResult { Win32Handle read; -- cgit v1.2.3