#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)
#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)
#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_
#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)
+//@}
+
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
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 );
+}
+