1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxWeakRef - Generic weak references for wxWidgets
4 // Author: Arne Steinarson
7 // Copyright: (c) 2007 Arne Steinarson
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 #ifndef _WX_WEAKREF_H_
12 #define _WX_WEAKREF_H_
14 #include <wx/tracker.h>
16 // A weak reference to an object of type T, where T has type wxTrackable
17 // as one of its base classes (in a static or dynamic sense).
19 class wxWeakRef
: public wxTrackerNode
22 typedef T element_type
;
24 wxWeakRef(T
*pobj
= NULL
) : m_pobj(NULL
) { Assign(pobj
); }
26 virtual ~wxWeakRef() { Assign(NULL
); }
35 wxASSERT(m_pobj
!= NULL
);
41 wxASSERT(m_pobj
!= NULL
);
51 // Assign from another weak ref, point to same object
52 T
* operator = (const wxWeakRef
<T
> &wr
)
58 virtual void OnObjectDestroy()
60 // Tracked object itself removes us from list of trackers
66 friend class wxTrackableBase
;
67 friend class wxEvtHandler
;
69 virtual wxTrackerNodeType
GetType() { return WeakRef
; }
76 // First release old object if any
79 // Remove ourselves from object tracker list
80 // This does static_cast if available, otherwise it tries dynamic cast
81 wxTrackableBase
*pt
= wxTrackableCaster
<T
,wxHasBase
<T
,wxTrackableBase
>::value
>::Cast(m_pobj
);
87 // Now set new trackable object
90 wxTrackableBase
*pt
= wxTrackableCaster
<T
,wxHasBase
<T
,wxTrackableBase
>::value
>::Cast(pobj
);
98 // If the tracked we want to track does not support wxTackableBase, then
99 // log a message and keep the NULL object pointer.
100 wxLogWarning( _T("wxWeakRef::Assign - Type does not provide wxTrackableBase - resetting tracked object") );
108 // Provide some basic types of weak references
109 class WXDLLIMPEXP_FWD_BASE wxObject
;
110 class WXDLLIMPEXP_FWD_BASE wxEvtHandler
;
111 class WXDLLIMPEXP_FWD_CORE wxWindow
;
113 typedef wxWeakRef
<wxObject
> wxObjectRef
;
114 typedef wxWeakRef
<wxEvtHandler
> wxEvtHandlerRef
;
115 typedef wxWeakRef
<wxWindow
> wxWindowRef
;
117 #endif // _WX_WEAKREF_H_