From: Vadim Zeitlin Date: Thu, 27 Mar 2008 15:37:41 +0000 (+0000) Subject: added convenient wxON_BLOCK_EXIT_THISn() macros wrapping wxON_BLOCK_EXIT_OBJn(*this) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/51c679d5e29c75e4f7f16ebe59dd9086157e7fa4?ds=sidebyside added convenient wxON_BLOCK_EXIT_THISn() macros wrapping wxON_BLOCK_EXIT_OBJn(*this) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52856 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/scopeguard.h b/include/wx/scopeguard.h index f1f5a8204c..fb756c56bf 100644 --- a/include/wx/scopeguard.h +++ b/include/wx/scopeguard.h @@ -346,6 +346,10 @@ typedef const wxScopeGuardImplBase& wxScopeGuard; #define wxON_BLOCK_EXIT_OBJ0(o, m) \ wxON_BLOCK_EXIT_OBJ0_IMPL(wxGuardName, o, &m) +#define wxON_BLOCK_EXIT_THIS0(m) \ + wxON_BLOCK_EXIT_OBJ0(*this, m) + + #define wxON_BLOCK_EXIT1_IMPL(n, f, p1) \ wxScopeGuard n = wxMakeGuard(f, p1); \ wxPrivateUse(n) @@ -358,6 +362,10 @@ typedef const wxScopeGuardImplBase& wxScopeGuard; #define wxON_BLOCK_EXIT_OBJ1(o, m, p1) \ wxON_BLOCK_EXIT_OBJ1_IMPL(wxGuardName, o, &m, p1) +#define wxON_BLOCK_EXIT_THIS1(m, p1) \ + wxON_BLOCK_EXIT_OBJ1(*this, m, p1) + + #define wxON_BLOCK_EXIT2_IMPL(n, f, p1, p2) \ wxScopeGuard n = wxMakeGuard(f, p1, p2); \ wxPrivateUse(n) @@ -370,4 +378,7 @@ typedef const wxScopeGuardImplBase& wxScopeGuard; #define wxON_BLOCK_EXIT_OBJ2(o, m, p1, p2) \ wxON_BLOCK_EXIT_OBJ2_IMPL(wxGuardName, o, &m, p1, p2) +#define wxON_BLOCK_EXIT_THIS2(m, p1, p2) \ + wxON_BLOCK_EXIT_OBJ2(*this, m, p1, p2) + #endif // _WX_SCOPEGUARD_H_ diff --git a/interface/scopeguard.h b/interface/scopeguard.h index 495ed93199..84002945cc 100644 --- a/interface/scopeguard.h +++ b/interface/scopeguard.h @@ -44,3 +44,16 @@ #define wxON_BLOCK_EXIT_OBJ2(object, method, p1, p2) //@} +/** @ingroup group_funcmacro_misc */ +//@{ +/** + This family of macros is similar to wxON_BLOCK_OBJ0(), but calls a method + of @c this object instead of a method of the specified object. + + @header{wx/scopeguard.h} +*/ +#define wxON_BLOCK_EXIT_THIS0(method) +#define wxON_BLOCK_EXIT_THIS1(method, p1) +#define wxON_BLOCK_EXIT_THIS2(method, p1, p2) +//@} + diff --git a/tests/scopeguard/scopeguardtest.cpp b/tests/scopeguard/scopeguardtest.cpp index e6a20c2473..977e316af2 100644 --- a/tests/scopeguard/scopeguardtest.cpp +++ b/tests/scopeguard/scopeguardtest.cpp @@ -60,12 +60,21 @@ public: CPPUNIT_TEST(Dismiss); CPPUNIT_TEST(BlockExit); CPPUNIT_TEST(BlockExitObj); + CPPUNIT_TEST(BlockExitThis); CPPUNIT_TEST_SUITE_END(); void Normal(); void Dismiss(); void BlockExit(); void BlockExitObj(); + void BlockExitThis(); + +private: + void Zero() { m_count = 0; } + void Set(int n) { m_count = n; } + void Sum(int n, int m) { m_count = n + m; } + + int m_count; }; // register in the unnamed registry so that these tests are run by default @@ -172,3 +181,28 @@ void ScopeGuardTestCase::BlockExitObj() CPPUNIT_ASSERT_EQUAL( 5, count2.GetCount() ); } +void ScopeGuardTestCase::BlockExitThis() +{ + m_count = 1; + + { + wxON_BLOCK_EXIT_THIS0(ScopeGuardTestCase::Zero); + + CPPUNIT_ASSERT_EQUAL( 1, m_count ); + } + CPPUNIT_ASSERT_EQUAL( 0, m_count ); + + { + wxON_BLOCK_EXIT_THIS1(ScopeGuardTestCase::Set, 17); + + CPPUNIT_ASSERT_EQUAL( 0, m_count ); + } + CPPUNIT_ASSERT_EQUAL( 17, m_count ); + + { + wxON_BLOCK_EXIT_THIS2(ScopeGuardTestCase::Sum, 2, 3); + CPPUNIT_ASSERT_EQUAL( 17, m_count ); + } + CPPUNIT_ASSERT_EQUAL( 5, m_count ); +} +