]> git.saurik.com Git - wxWidgets.git/blame - interface/recguard.h
revised base64.h;bitmap.h
[wxWidgets.git] / interface / recguard.h
CommitLineData
23324ae1
FM
1/////////////////////////////////////////////////////////////////////////////
2// Name: recguard.h
e54c96f1 3// Purpose: interface of wxRecursionGuardFlag
23324ae1
FM
4// Author: wxWidgets team
5// RCS-ID: $Id$
6// Licence: wxWindows license
7/////////////////////////////////////////////////////////////////////////////
8
9/**
10 @class wxRecursionGuardFlag
11 @wxheader{recguard.h}
7c913512
FM
12
13 This is a completely opaque class which exists only to be used with
23324ae1
FM
14 wxRecursionGuard, please see the example in that
15 class documentation.
7c913512
FM
16
17 Please notice that wxRecursionGuardFlag object must be declared
23324ae1 18 @c static or the recursion would never be detected.
7c913512 19
23324ae1
FM
20 @library{wxbase}
21 @category{FIXME}
22*/
7c913512 23class wxRecursionGuardFlag
23324ae1
FM
24{
25public:
7c913512 26
23324ae1
FM
27};
28
29
e54c96f1 30
23324ae1
FM
31/**
32 @class wxRecursionGuard
33 @wxheader{recguard.h}
7c913512 34
23324ae1
FM
35 wxRecursionGuard is a very simple class which can be used to prevent reentrancy
36 problems in a function. It is not thread-safe and so should be used only in
37 single-threaded programs or in combination with some thread synchronization
38 mechanisms.
7c913512
FM
39
40 wxRecursionGuard is always used together with the
23324ae1 41 wxRecursionGuardFlag like in this example:
7c913512 42
23324ae1
FM
43 @code
44 void Foo()
45 {
46 static wxRecursionGuardFlag s_flag;
47 wxRecursionGuard guard(s_flag);
48 if ( guard.IsInside() )
49 {
50 // don't allow reentrancy
51 return;
52 }
7c913512 53
23324ae1
FM
54 ...
55 }
56 @endcode
7c913512 57
23324ae1 58 As you can see, wxRecursionGuard simply tests the flag value and sets it to
7c913512 59 @true if it hadn't been already set.
23324ae1
FM
60 wxRecursionGuard::IsInside allows testing the old flag
61 value. The advantage of using this class compared to directly manipulating the
62 flag is that the flag is always reset in the wxRecursionGuard destructor and so
63 you don't risk to forget to do it even if the function returns in an unexpected
64 way (for example because an exception has been thrown).
7c913512 65
23324ae1
FM
66 @library{wxbase}
67 @category{FIXME}
68*/
7c913512 69class wxRecursionGuard
23324ae1
FM
70{
71public:
72 /**
7c913512 73 A wxRecursionGuard object must always be initialized with a (static)
23324ae1 74 wxRecursionGuardFlag. The constructor saves the
7c913512 75 value of the flag to be able to return the correct value from
23324ae1
FM
76 IsInside().
77 */
78 wxRecursionGuard(wxRecursionGuardFlag& flag);
79
80 /**
81 The destructor resets the flag value so that the function can be entered again
82 the next time.
23324ae1
FM
83 Note that it is not virtual and so this class is not meant to be derived from
84 (besides, there is absolutely no reason to do it anyhow).
85 */
86 ~wxRecursionGuard();
87
88 /**
89 Returns @true if we're already inside the code block "protected'' by this
90 wxRecursionGuard (i.e. between this line and the end of current scope). Usually
91 the function using wxRecursionGuard takes some specific actions in such case
92 (may be simply returning) to prevent reentrant calls to itself.
23324ae1
FM
93 If this method returns @false, it is safe to continue.
94 */
328f5751 95 bool IsInside() const;
23324ae1 96};
e54c96f1 97