]> git.saurik.com Git - wxWidgets.git/blame - interface/wx/weakref.h
Make wxPGValidationInfo class instead of struct, re-document it (used at least by...
[wxWidgets.git] / interface / wx / weakref.h
CommitLineData
23324ae1
FM
1/////////////////////////////////////////////////////////////////////////////
2// Name: weakref.h
e25cd775 3// Purpose: interface of wxWeakRefDynamic<T>, wxWeakRef<T>
23324ae1
FM
4// Author: wxWidgets team
5// RCS-ID: $Id$
6// Licence: wxWindows license
7/////////////////////////////////////////////////////////////////////////////
8
e25cd775 9
23324ae1 10/**
e25cd775 11 @class wxWeakRefDynamic<T>
7c913512 12
73473b3e
RR
13 wxWeakRefDynamic<T> is a template class for weak references that is used in
14 the same way as wxWeakRef<T>. The only difference is that wxWeakRefDynamic
e25cd775
FM
15 defaults to using @c dynamic_cast for establishing the object reference
16 (while wxWeakRef defaults to @c static_cast).
7c913512 17
23324ae1
FM
18 So, wxWeakRef will detect a type mismatch during compile time and will
19 have a little better run-time performance. The role of wxWeakRefDynamic
7c913512
FM
20 is to handle objects which derived type one does not know.
21
e25cd775
FM
22 @note wxWeakRef<T> selects an implementation based on the static type of T.
23 If T does not have wxTrackable statically, it defaults to to a mixed-
24 mode operation, where it uses @c dynamic_cast as the last measure
25 (if available from the compiler and enabled when building wxWidgets).
7c913512 26
73473b3e 27 For general cases, wxWeakRef<T> is the better choice.
7c913512 28
e25cd775 29 For API documentation, see: wxWeakRef<T>.
7c913512 30
e25cd775
FM
31 @nolibrary
32 @category{misc}
23324ae1 33*/
5cb947fd 34template<typename T>
7c913512 35class wxWeakRefDynamic<T>
23324ae1
FM
36{
37public:
7c913512 38
23324ae1
FM
39};
40
41
e54c96f1 42
23324ae1 43/**
e25cd775 44 @class wxWeakRef<T>
7c913512 45
e25cd775
FM
46 wxWeakRef<T> is a template class for weak references to wxWidgets objects,
47 such as wxEvtHandler, wxWindow and wxObject.
48 A weak reference behaves much like an ordinary pointer, but when the object
49 pointed is destroyed, the weak reference is automatically reset to a @NULL pointer.
7c913512 50
73473b3e 51 wxWeakRef<T> can be used whenever one must keep a pointer to an object
23324ae1 52 that one does not directly own, and that may be destroyed before the object
7c913512
FM
53 holding the reference.
54
73473b3e 55 wxWeakRef<T> is a small object and the mechanism behind it is fast
7c913512
FM
56 (@b O(1)). So the overall cost of using it is small.
57
e25cd775
FM
58 Example:
59
e84fd6a1
RR
60 @code
61 wxWindow *wnd = new wxWindow( parent, wxID_ANY, "wxWindow" );
e25cd775 62 wxWeakRef<wxWindow> wr = wnd;
e84fd6a1
RR
63 wxWindowRef wr2 = wnd; // Same as above, but using a typedef
64 // Do things with window
65 wnd->Show( true );
e25cd775 66 // Weak ref is used like an ordinary pointer
e84fd6a1 67 wr->Show( false );
e25cd775 68 wnd->Destroy();
e84fd6a1
RR
69 // Now the weak ref has been reset, so we don't risk accessing
70 // a dangling pointer:
71 wxASSERT( wr==NULL );
72 @endcode
73
e25cd775
FM
74 wxWeakRef<T> works for any objects that are derived from wxTrackable.
75 By default, wxEvtHandler and wxWindow derive from wxTrackable.
76 However, wxObject does not, so types like wxFont and wxColour are not
77 trackable. The example below shows how to create a wxObject derived class
78 that is trackable:
e84fd6a1
RR
79
80 @code
81 class wxMyTrackableObject : public wxObject, public wxTrackable
e25cd775
FM
82 {
83 // ... other members here
84 };
e84fd6a1
RR
85 @endcode
86
87 The following types of weak references are predefined:
88
89 @code
90 typedef wxWeakRef<wxEvtHandler> wxEvtHandlerRef;
91 typedef wxWeakRef<wxWindow> wxWindowRef;
92 @endcode
93
e25cd775
FM
94 @nolibrary
95 @category{misc}
7c913512 96
73473b3e 97 @see wxSharedPtr<T>, wxScopedPtr<T>
23324ae1 98*/
5cb947fd 99template<typename T>
e25cd775 100class wxWeakRef<T> : public wxTrackerNode
23324ae1
FM
101{
102public:
103 /**
104 Constructor. The weak reference is initialized to @e pobj.
105 */
5cb947fd 106 wxWeakRef(T* pobj = NULL);
23324ae1 107
6dd21c54
RR
108 /**
109 Copy constructor.
110 */
111 wxWeakRef(const wxWeakRef<T>& wr);
e25cd775 112
23324ae1
FM
113 /**
114 Destructor.
115 */
5cb947fd 116 ~wxWeakRef();
23324ae1
FM
117
118 /**
119 Called when the tracked object is destroyed. Be default sets
e25cd775
FM
120 internal pointer to @NULL.
121 You need to call this method if you override it.
23324ae1
FM
122 */
123 virtual void OnObjectDestroy();
124
125 /**
126 Release currently tracked object and rests object reference.
127 */
128 void Release();
129
130 /**
131 Returns pointer to the tracked object or @NULL.
132 */
328f5751 133 T* get() const;
23324ae1
FM
134
135 /**
136 Release currently tracked object and start tracking the same object as
137 the wxWeakRef @e wr.
138 */
139 T* operator =(wxWeakRef<T>& wr);
140
141 /**
e25cd775
FM
142 Implicit conversion to T*.
143 Returns pointer to the tracked object or @NULL.
23324ae1 144 */
328f5751 145 T* operator*() const;
23324ae1
FM
146
147 /**
e25cd775
FM
148 Returns a reference to the tracked object.
149 If the internal pointer is @NULL this method will cause an assert in debug mode.
23324ae1 150 */
e25cd775 151 T& operator*() const;
23324ae1
FM
152
153 /**
e25cd775
FM
154 Smart pointer member access.
155 Returns a pointer to the tracked object.
156 If the internal pointer is @NULL this method will cause an assert in debug mode.
23324ae1
FM
157 */
158 T* operator-();
159
160 /**
161 Releases the currently tracked object and starts tracking @e pobj.
162 A weak reference may be reset by passing @e @NULL as @e pobj.
163 */
164 T* operator=(T* pobj);
165};
e54c96f1 166