From df42108d1f4c1628fe62874e48e87282fab6bc65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Wed, 20 Jul 2022 02:12:32 +0200 Subject: Fix bug in and rename throw_nil, warn_nil. In warn_nil, the return value was undefined on exception -- I think. While informative, the names throw_nil and warn_nil don't work very well in conditionals: if (warn_nil(...)) g(); sounds like g should be called if f returns nil and a warning is issued. But it is actually the other way around; g is called if f is successful. if (prefer(...)) g(); sounds less like that. --- c/common.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'c/common.h') diff --git a/c/common.h b/c/common.h index a4f73e5..6b29ed5 100644 --- a/c/common.h +++ b/c/common.h @@ -55,7 +55,7 @@ std::optional maybe_make(U... xs) /* Call Windows API function, throwing error on NULL. */ template -inline auto throw_nil(T... xs) +inline auto require(T... xs) { auto r = F(xs...); if (!r) throw Win32Error(GetLastError()); @@ -64,15 +64,14 @@ inline auto throw_nil(T... xs) /* Call Windows API function, showing a warning on NULL. */ template -inline auto warn_nil(T... xs) +inline auto prefer(T... xs) { - decltype(F(std::declval()...)) r; try { - r = throw_nil(xs...); + return require(xs...); } catch (Win32Error& e) { EBMessageBox(e.twhat(), TEXT("System Error"), MB_ICONWARNING); + return (decltype(F(std::declval()...)))NULL; } - return r; } /* Return integer scaled for current DPI. */ -- cgit v1.2.3