// core/WinApi.h #pragma once #include #include #include #include // for std::forward namespace WinApi { struct HandleDeleter { void operator()(HANDLE h) const noexcept { if (h && h != INVALID_HANDLE_VALUE) CloseHandle(h); } }; using UniqueHandle = std::unique_ptr::type, HandleDeleter>; template struct ScopeExit { F func; explicit ScopeExit(F&& f) noexcept : func(std::forward(f)) {} ~ScopeExit() noexcept { func(); } }; }