X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d775fa82354a1f8d5db87ad1d71ab00ef7d9123c..e304942c65edbe2842f1d1ad60de19f567150559:/include/wx/scopeguard.h diff --git a/include/wx/scopeguard.h b/include/wx/scopeguard.h index c46f443569..8d5795f13f 100644 --- a/include/wx/scopeguard.h +++ b/include/wx/scopeguard.h @@ -31,7 +31,7 @@ namespace wxPrivate // in the original implementation this was a member template function of // ScopeGuardImplBase but gcc 2.8 which is still used for OS/2 doesn't // support member templates and so we must make it global - template + template void OnScopeExit(ScopeGuardImpl& guard) { if ( !guard.WasDismissed() ) @@ -46,7 +46,7 @@ namespace wxPrivate } // just to avoid the warning about unused variables - template + template void Use(const T& WXUNUSED(t)) { } @@ -67,7 +67,7 @@ public: void Dismiss() const { m_wasDismissed = true; } - // for OnScopeExit() only we can't make it friend, unfortunately)! + // for OnScopeExit() only (we can't make it friend, unfortunately)! bool WasDismissed() const { return m_wasDismissed; } protected: @@ -90,7 +90,7 @@ private: // wxScopeGuardImpl0: scope guard for actions without parameters // ---------------------------------------------------------------------------- -template +template class wxScopeGuardImpl0 : public wxScopeGuardImplBase { public: @@ -111,7 +111,7 @@ protected: wxScopeGuardImpl0& operator=(const wxScopeGuardImpl0&); }; -template +template inline wxScopeGuardImpl0 wxMakeGuard(F fun) { return wxScopeGuardImpl0::MakeGuard(fun); @@ -121,7 +121,7 @@ inline wxScopeGuardImpl0 wxMakeGuard(F fun) // wxScopeGuardImpl1: scope guard for actions with 1 parameter // ---------------------------------------------------------------------------- -template +template class wxScopeGuardImpl1 : public wxScopeGuardImplBase { public: @@ -143,7 +143,7 @@ protected: wxScopeGuardImpl1& operator=(const wxScopeGuardImpl1&); }; -template +template inline wxScopeGuardImpl1 wxMakeGuard(F fun, P1 p1) { return wxScopeGuardImpl1::MakeGuard(fun, p1); @@ -153,7 +153,7 @@ inline wxScopeGuardImpl1 wxMakeGuard(F fun, P1 p1) // wxScopeGuardImpl2: scope guard for actions with 2 parameters // ---------------------------------------------------------------------------- -template +template class wxScopeGuardImpl2 : public wxScopeGuardImplBase { public: @@ -176,7 +176,7 @@ protected: wxScopeGuardImpl2& operator=(const wxScopeGuardImpl2&); }; -template +template inline wxScopeGuardImpl2 wxMakeGuard(F fun, P1 p1, P2 p2) { return wxScopeGuardImpl2::MakeGuard(fun, p1, p2); @@ -190,7 +190,7 @@ inline wxScopeGuardImpl2 wxMakeGuard(F fun, P1 p1, P2 p2) // wxObjScopeGuardImpl0 // ---------------------------------------------------------------------------- -template +template class wxObjScopeGuardImpl0 : public wxScopeGuardImplBase { public: @@ -212,13 +212,13 @@ protected: MemFun m_memfun; }; -template +template inline wxObjScopeGuardImpl0 wxMakeObjGuard(Obj& obj, MemFun memFun) { return wxObjScopeGuardImpl0::MakeObjGuard(obj, memFun); } -template +template class wxObjScopeGuardImpl1 : public wxScopeGuardImplBase { public: @@ -241,14 +241,14 @@ protected: const P1 m_p1; }; -template +template inline wxObjScopeGuardImpl1 wxMakeObjGuard(Obj& obj, MemFun memFun, P1 p1) { return wxObjScopeGuardImpl1::MakeObjGuard(obj, memFun, p1); } -template +template class wxObjScopeGuardImpl2 : public wxScopeGuardImplBase { public: @@ -272,7 +272,7 @@ protected: const P2 m_p2; }; -template +template inline wxObjScopeGuardImpl2 wxMakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2) { @@ -293,29 +293,43 @@ typedef const wxScopeGuardImplBase& wxScopeGuard; // but this results in compiler warnings about unused variables and I // didn't find a way to work around this other than by having different // macros with different names + +#define wxGuardName wxMAKE_UNIQUE_NAME(scopeGuard) + +#define wxON_BLOCK_EXIT0_IMPL(n, f) \ + wxScopeGuard n = wxMakeGuard(f); \ + wxPrivate::Use(n) #define wxON_BLOCK_EXIT0(f) \ - wxScopeGuard wxMAKE_UNIQUE_NAME(scopeGuard) = wxMakeGuard(f); \ - wxPrivate::Use(wxMAKE_UNIQUE_NAME(scopeGuard)) + wxON_BLOCK_EXIT0_IMPL(wxGuardName, f) +#define wxON_BLOCK_EXIT_OBJ0_IMPL(n, o, m) \ + wxScopeGuard n = wxMakeObjGuard(o, m); \ + wxPrivate::Use(n) #define wxON_BLOCK_EXIT_OBJ0(o, m) \ - wxScopeGuard wxMAKE_UNIQUE_NAME(scopeGuard) = wxMakeObjGuard(o, m); \ - wxPrivate::Use(wxMAKE_UNIQUE_NAME(scopeGuard)) + wxON_BLOCK_EXIT_OBJ0_IMPL(wxGuardName, o, m) +#define wxON_BLOCK_EXIT1_IMPL(n, f, p1) \ + wxScopeGuard n = wxMakeGuard(f, p1); \ + wxPrivate::Use(n) #define wxON_BLOCK_EXIT1(f, p1) \ - wxScopeGuard wxMAKE_UNIQUE_NAME(scopeGuard) = wxMakeGuard(f, p1); \ - wxPrivate::Use(wxMAKE_UNIQUE_NAME(scopeGuard)) + wxON_BLOCK_EXIT1_IMPL(wxGuardName, f, p1) +#define wxON_BLOCK_EXIT_OBJ1_IMPL(n, o, m, p1) \ + wxScopeGuard n = wxMakeObjGuard(o, m, p1); \ + wxPrivate::Use(n) #define wxON_BLOCK_EXIT_OBJ1(o, m, p1) \ - wxScopeGuard wxMAKE_UNIQUE_NAME(scopeGuard) = wxMakeObjGuard(o, m, p1); \ - wxPrivate::Use(wxMAKE_UNIQUE_NAME(scopeGuard)) + wxON_BLOCK_EXIT_OBJ1_IMPL(wxGuardName, o, m, p1) +#define wxON_BLOCK_EXIT2_IMPL(n, f, p1, p2) \ + wxScopeGuard n = wxMakeGuard(f, p1, p2); \ + wxPrivate::Use(n) #define wxON_BLOCK_EXIT2(f, p1, p2) \ - wxScopeGuard wxMAKE_UNIQUE_NAME(scopeGuard) = wxMakeGuard(f, p1, p2); \ - wxPrivate::Use(wxMAKE_UNIQUE_NAME(scopeGuard)) + wxON_BLOCK_EXIT2_IMPL(wxGuardName, f, p1, p2) +#define wxON_BLOCK_EXIT_OBJ2_IMPL(n, o, m, p1, p2) \ + wxScopeGuard n = wxMakeObjGuard(o, m, p1, p2); \ + wxPrivate::Use(n) #define wxON_BLOCK_EXIT_OBJ2(o, m, p1, p2) \ - wxScopeGuard wxMAKE_UNIQUE_NAME(scopeGuard) = wxMakeObjGuard(o, m, p1, p2); \ - wxPrivate::Use(wxMAKE_UNIQUE_NAME(scopeGuard)) + wxON_BLOCK_EXIT_OBJ2_IMPL(wxGuardName, o, m, p1, p2) #endif // _WX_SCOPEGUARD_H_ -