2008-03-08 08:52:38 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
2008-03-08 09:43:31 -05:00
|
|
|
// Name: scopeguard.h
|
2008-03-10 11:24:38 -04:00
|
|
|
// Purpose: interface of global functions
|
2008-03-08 09:43:31 -05:00
|
|
|
// Author: wxWidgets team
|
|
|
|
// RCS-ID: $Id$
|
|
|
|
// Licence: wxWindows license
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2008-10-09 07:26:50 -04:00
|
|
|
/**
|
2008-10-09 09:45:25 -04:00
|
|
|
@class wxScopeGuard
|
|
|
|
|
2008-10-09 07:26:50 -04:00
|
|
|
Scope guard is an object which allows executing an action on scope exit.
|
|
|
|
|
|
|
|
The objects of this class must be constructed using wxMakeGuard() function.
|
2008-10-09 09:45:25 -04:00
|
|
|
|
|
|
|
@nolibrary
|
|
|
|
@category{misc}
|
2008-10-09 07:26:50 -04:00
|
|
|
*/
|
|
|
|
class wxScopeGuard
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
Call this method to dismiss the execution of the action on scope exit.
|
|
|
|
|
|
|
|
A typical example:
|
|
|
|
@code
|
|
|
|
Update1();
|
|
|
|
|
|
|
|
// ensure that changes done so far are rolled back if the next
|
|
|
|
// operation throws
|
|
|
|
wxScopeGuard guard = wxMakeGuard(RollBack);
|
|
|
|
Update2();
|
|
|
|
|
|
|
|
// it didn't throw so commit the changes, i.e. avoid rolling back
|
|
|
|
guard.Dismiss();
|
|
|
|
@endcode
|
|
|
|
*/
|
|
|
|
void Dismiss();
|
|
|
|
};
|
|
|
|
|
2009-01-05 15:48:06 -05:00
|
|
|
/** @addtogroup group_funcmacro_misc */
|
2008-10-09 07:26:50 -04:00
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
Returns a scope guard object which will call the specified function with
|
|
|
|
the given parameters on scope exit.
|
|
|
|
|
|
|
|
This function is overloaded to take several parameters up to some
|
|
|
|
implementation-defined (but relatively low) limit.
|
|
|
|
|
|
|
|
The @a func should be a functor taking parameters of the types P1, ..., PN,
|
|
|
|
i.e. the expression @c func(p1, ..., pN) should be valid.
|
|
|
|
*/
|
|
|
|
template <typename F, typename P1, ..., typename PN>
|
|
|
|
wxScopeGuard wxMakeGuard(F func, P1 p1, ..., PN pN);
|
|
|
|
|
|
|
|
//@}
|
|
|
|
|
2009-01-05 15:48:06 -05:00
|
|
|
/** @addtogroup group_funcmacro_misc */
|
2008-03-08 09:43:31 -05:00
|
|
|
//@{
|
2008-03-08 08:52:38 -05:00
|
|
|
/**
|
2008-10-09 07:26:50 -04:00
|
|
|
Ensure that the global @a function with a few (up to some
|
|
|
|
implementation-defined limit) is executed on scope exit, whether due to a
|
|
|
|
normal function return or because an exception has been thrown.
|
|
|
|
|
|
|
|
A typical example of its usage:
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
@code
|
|
|
|
void *buf = malloc(size);
|
2008-03-23 14:24:32 -04:00
|
|
|
wxON_BLOCK_EXIT1(free, buf);
|
2008-03-08 08:52:38 -05:00
|
|
|
@endcode
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
Please see the original article by Andrei Alexandrescu and Petru Marginean
|
2008-03-23 14:24:32 -04:00
|
|
|
published in December 2000 issue of C/C++ Users Journal for more details.
|
|
|
|
|
|
|
|
@see wxON_BLOCK_EXIT_OBJ0()
|
|
|
|
|
|
|
|
@header{wx/scopeguard.h}
|
|
|
|
*/
|
2008-10-09 07:26:50 -04:00
|
|
|
#define wxON_BLOCK_EXIT(function, ...)
|
2008-03-23 14:24:32 -04:00
|
|
|
#define wxON_BLOCK_EXIT0(function)
|
|
|
|
#define wxON_BLOCK_EXIT1(function, p1)
|
|
|
|
#define wxON_BLOCK_EXIT2(function, p1, p2)
|
2008-10-09 07:26:50 -04:00
|
|
|
#define wxON_BLOCK_EXIT3(function, p1, p2, p3)
|
2008-03-23 14:24:32 -04:00
|
|
|
//@}
|
|
|
|
|
2009-01-05 15:48:06 -05:00
|
|
|
/** @addtogroup group_funcmacro_misc */
|
2008-03-23 14:24:32 -04:00
|
|
|
//@{
|
|
|
|
/**
|
2008-10-09 07:26:50 -04:00
|
|
|
This family of macros is similar to wxON_BLOCK_EXIT(), but calls a method
|
2008-03-23 14:24:32 -04:00
|
|
|
of the given object instead of a free function.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-23 14:24:32 -04:00
|
|
|
@header{wx/scopeguard.h}
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
2008-10-09 07:26:50 -04:00
|
|
|
#define wxON_BLOCK_EXIT_OBJ(object, method, ...)
|
2008-03-23 14:24:32 -04:00
|
|
|
#define wxON_BLOCK_EXIT_OBJ0(object, method)
|
|
|
|
#define wxON_BLOCK_EXIT_OBJ1(object, method, p1)
|
|
|
|
#define wxON_BLOCK_EXIT_OBJ2(object, method, p1, p2)
|
2008-10-09 07:26:50 -04:00
|
|
|
#define wxON_BLOCK_EXIT_OBJ3(object, method, p1, p2, p3)
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
2009-01-05 15:48:06 -05:00
|
|
|
/** @addtogroup group_funcmacro_misc */
|
2008-03-27 11:37:41 -04:00
|
|
|
//@{
|
|
|
|
/**
|
2008-10-09 07:26:50 -04:00
|
|
|
This family of macros is similar to wxON_BLOCK_OBJ(), but calls a method
|
2008-03-27 11:37:41 -04:00
|
|
|
of @c this object instead of a method of the specified object.
|
|
|
|
|
|
|
|
@header{wx/scopeguard.h}
|
|
|
|
*/
|
2008-10-09 07:26:50 -04:00
|
|
|
#define wxON_BLOCK_EXIT_THIS(method, ...)
|
2008-03-27 11:37:41 -04:00
|
|
|
#define wxON_BLOCK_EXIT_THIS0(method)
|
|
|
|
#define wxON_BLOCK_EXIT_THIS1(method, p1)
|
|
|
|
#define wxON_BLOCK_EXIT_THIS2(method, p1, p2)
|
2008-10-09 07:26:50 -04:00
|
|
|
#define wxON_BLOCK_EXIT_THIS3(method, p1, p2, p3)
|
2008-03-27 11:37:41 -04:00
|
|
|
//@}
|
|
|
|
|
2009-01-05 15:48:06 -05:00
|
|
|
/** @addtogroup group_funcmacro_misc */
|
2008-03-27 12:13:50 -04:00
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
This macro sets a variable to the specified value on scope exit.
|
|
|
|
|
|
|
|
Example of usage:
|
|
|
|
@code
|
|
|
|
void foo()
|
|
|
|
{
|
|
|
|
bool isDoingSomething = true;
|
|
|
|
{
|
|
|
|
wxON_BLOCK_EXIT_SET(isDoingSomething, false);
|
|
|
|
... do something ...
|
|
|
|
}
|
|
|
|
... isDoingSomething is false now ...
|
|
|
|
}
|
|
|
|
@endcode
|
|
|
|
|
2008-11-19 07:06:17 -05:00
|
|
|
Notice that @a value is copied, i.e. stored by value, so it can be a
|
|
|
|
temporary object returned by a function call, for example.
|
|
|
|
|
2008-03-27 12:13:50 -04:00
|
|
|
@see wxON_BLOCK_EXIT_OBJ0(), wxON_BLOCK_EXIT_NULL()
|
|
|
|
|
|
|
|
@header{wx/scopeguard.h}
|
|
|
|
*/
|
|
|
|
#define wxON_BLOCK_EXIT_SET(var, value)
|
|
|
|
|
|
|
|
/**
|
|
|
|
This macro sets the pointer passed to it as argument to NULL on scope exit.
|
|
|
|
|
|
|
|
It must be used instead of wxON_BLOCK_EXIT_SET() when the value being set
|
|
|
|
is @c NULL.
|
|
|
|
|
|
|
|
@header{wx/scopeguard.h}
|
|
|
|
*/
|
|
|
|
#define wxON_BLOCK_EXIT_NULL(ptr)
|
|
|
|
|
|
|
|
//@}
|
|
|
|
|