X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d2a48d5cbc5b3764c6b578238ec6cc5f16c5dd0f..cc2608047b09f1fedfae027c083a35b1073010a4:/include/wx/scopeguard.h diff --git a/include/wx/scopeguard.h b/include/wx/scopeguard.h index 45fe82f5bf..da056e08db 100644 --- a/include/wx/scopeguard.h +++ b/include/wx/scopeguard.h @@ -226,6 +226,41 @@ inline wxScopeGuardImpl2 wxMakeGuard(F fun, P1 p1, P2 p2) return wxScopeGuardImpl2::MakeGuard(fun, p1, p2); } +// ---------------------------------------------------------------------------- +// wxScopeGuardImpl3: scope guard for actions with 3 parameters +// ---------------------------------------------------------------------------- + +template +class wxScopeGuardImpl3 : public wxScopeGuardImplBase +{ +public: + static wxScopeGuardImpl3 MakeGuard(F fun, P1 p1, P2 p2, P3 p3) + { + return wxScopeGuardImpl3(fun, p1, p2, p3); + } + + ~wxScopeGuardImpl3() { wxPrivateOnScopeExit(*this); } + + void Execute() { m_fun(m_p1, m_p2, m_p3); } + +protected: + wxScopeGuardImpl3(F fun, P1 p1, P2 p2, P3 p3) + : m_fun(fun), m_p1(p1), m_p2(p2), m_p3(p3) { } + + F m_fun; + const P1 m_p1; + const P2 m_p2; + const P3 m_p3; + + wxScopeGuardImpl3& operator=(const wxScopeGuardImpl3&); +}; + +template +inline wxScopeGuardImpl3 wxMakeGuard(F fun, P1 p1, P2 p2, P3 p3) +{ + return wxScopeGuardImpl3::MakeGuard(fun, p1, p2, p3); +} + // ============================================================================ // wxScopeGuards for object methods // ============================================================================ @@ -324,6 +359,39 @@ wxMakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2) MakeObjGuard(obj, memFun, p1, p2); } +template +class wxObjScopeGuardImpl3 : public wxScopeGuardImplBase +{ +public: + static wxObjScopeGuardImpl3 + MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2, P3 p3) + { + return wxObjScopeGuardImpl3(obj, memFun, p1, p2, p3); + } + + ~wxObjScopeGuardImpl3() { wxPrivateOnScopeExit(*this); } + + void Execute() { (m_obj.*m_memfun)(m_p1, m_p2, m_p3); } + +protected: + wxObjScopeGuardImpl3(Obj& obj, MemFun memFun, P1 p1, P2 p2, P3 p3) + : m_obj(obj), m_memfun(memFun), m_p1(p1), m_p2(p2), m_p3(p3) { } + + Obj& m_obj; + MemFun m_memfun; + const P1 m_p1; + const P2 m_p2; + const P3 m_p3; +}; + +template +inline wxObjScopeGuardImpl3 +wxMakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2, P3 p3) +{ + return wxObjScopeGuardImpl3:: + MakeObjGuard(obj, memFun, p1, p2, p3); +} + // ---------------------------------------------------------------------------- // wxVariableSetter: use the same technique as for wxScopeGuard to allow // setting a variable to some value on block exit @@ -343,7 +411,7 @@ template class VariableSetterImpl : public VariableSetterBase { public: - VariableSetterImpl(T& var, const U& value) + VariableSetterImpl(T& var, U value) : m_var(var), m_value(value) { @@ -356,7 +424,7 @@ public: private: T& m_var; - const U& m_value; + const U m_value; // suppress the warning about assignment operator not being generated VariableSetterImpl& operator=(const VariableSetterImpl&); @@ -386,7 +454,7 @@ private: template inline -wxPrivate::VariableSetterImpl wxMakeVarSetter(T& var, const U& value) +wxPrivate::VariableSetterImpl wxMakeVarSetter(T& var, U value) { return wxPrivate::VariableSetterImpl(var, value); } @@ -465,6 +533,22 @@ wxPrivate::VariableNullerImpl wxMakeVarNuller(T& var) wxON_BLOCK_EXIT_OBJ2(*this, m, p1, p2) +#define wxON_BLOCK_EXIT3_IMPL(n, f, p1, p2, p3) \ + wxScopeGuard n = wxMakeGuard(f, p1, p2, p3); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT3(f, p1, p2, p3) \ + wxON_BLOCK_EXIT3_IMPL(wxGuardName, f, p1, p2, p3) + +#define wxON_BLOCK_EXIT_OBJ3_IMPL(n, o, m, p1, p2, p3) \ + wxScopeGuard n = wxMakeObjGuard(o, m, p1, p2, p3); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT_OBJ3(o, m, p1, p2, p3) \ + wxON_BLOCK_EXIT_OBJ3_IMPL(wxGuardName, o, &m, p1, p2, p3) + +#define wxON_BLOCK_EXIT_THIS3(m, p1, p2, p3) \ + wxON_BLOCK_EXIT_OBJ3(*this, m, p1, p2, p3) + + #define wxSetterName wxMAKE_UNIQUE_NAME(wxVarSetter) #define wxON_BLOCK_EXIT_SET_IMPL(n, var, value) \