X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..0a64bfdfd0c4bf305ea2882a3c5c1de62124a2e0:/include/wx/scopeguard.h?ds=sidebyside diff --git a/include/wx/scopeguard.h b/include/wx/scopeguard.h index 21719fb017..8d5795f13f 100644 --- a/include/wx/scopeguard.h +++ b/include/wx/scopeguard.h @@ -31,8 +31,8 @@ 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 - void OnScopeExit(ScopeGuardImpl& guard) + template + void OnScopeExit(ScopeGuardImpl& guard) { if ( !guard.WasDismissed() ) { @@ -46,12 +46,12 @@ namespace wxPrivate } // just to avoid the warning about unused variables - template + template void Use(const T& WXUNUSED(t)) { } } // namespace wxPrivate - + // ============================================================================ // wxScopeGuard for functions and functors // ============================================================================ @@ -67,13 +67,13 @@ 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: ~wxScopeGuardImplBase() { } - wxScopeGuardImplBase(const wxScopeGuardImplBase& other) + wxScopeGuardImplBase(const wxScopeGuardImplBase& other) : m_wasDismissed(other.m_wasDismissed) { other.Dismiss(); @@ -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: @@ -233,7 +233,7 @@ public: void Execute() { (m_obj.*m_memfun)(m_p1); } protected: - wxObjScopeGuardImpl1(Obj& obj, MemFun memFun, P1 p1) + wxObjScopeGuardImpl1(Obj& obj, MemFun memFun, P1 p1) : m_obj(obj), m_memfun(memFun), m_p1(p1) { } Obj& m_obj; @@ -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: @@ -263,7 +263,7 @@ public: void Execute() { (m_obj.*m_memfun)(m_p1, m_p2); } protected: - wxObjScopeGuardImpl2(Obj& obj, MemFun memFun, P1 p1, P2 p2) + wxObjScopeGuardImpl2(Obj& obj, MemFun memFun, P1 p1, P2 p2) : m_obj(obj), m_memfun(memFun), m_p1(p1), m_p2(p2) { } Obj& m_obj; @@ -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_ -