| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/tracker.h
- // Purpose: Support class for object lifetime tracking (wxWeakRef<T>)
- // Author: Arne Steinarson
- // Created: 28 Dec 07
- // Copyright: (c) 2007 Arne Steinarson
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_TRACKER_H_
- #define _WX_TRACKER_H_
- #include "wx/defs.h"
- class wxEventConnectionRef;
- // This class represents an object tracker and is stored in a linked list
- // in the tracked object. It is only used in one of its derived forms.
- class WXDLLIMPEXP_BASE wxTrackerNode
- {
- public:
- wxTrackerNode() : m_nxt(NULL) { }
- virtual ~wxTrackerNode() { }
- virtual void OnObjectDestroy() = 0;
- virtual wxEventConnectionRef *ToEventConnection() { return NULL; }
- private:
- wxTrackerNode *m_nxt;
- friend class wxTrackable; // For list access
- friend class wxEvtHandler; // For list access
- };
- // Add-on base class for a trackable object.
- class WXDLLIMPEXP_BASE wxTrackable
- {
- public:
- void AddNode(wxTrackerNode *prn)
- {
- prn->m_nxt = m_first;
- m_first = prn;
- }
- void RemoveNode(wxTrackerNode *prn)
- {
- for ( wxTrackerNode **pprn = &m_first; *pprn; pprn = &(*pprn)->m_nxt )
- {
- if ( *pprn == prn )
- {
- *pprn = prn->m_nxt;
- return;
- }
- }
- wxFAIL_MSG( "removing invalid tracker node" );
- }
- wxTrackerNode *GetFirst() const { return m_first; }
- protected:
- // this class is only supposed to be used as a base class but never be
- // created nor destroyed directly so all ctors and dtor are protected
- wxTrackable() : m_first(NULL) { }
- // copy ctor and assignment operator intentionally do not copy m_first: the
- // objects which track the original trackable shouldn't track the new copy
- wxTrackable(const wxTrackable& WXUNUSED(other)) : m_first(NULL) { }
- wxTrackable& operator=(const wxTrackable& WXUNUSED(other)) { return *this; }
- // dtor is not virtual: this class is not supposed to be used
- // polymorphically and adding a virtual table to it would add unwanted
- // overhead
- ~wxTrackable()
- {
- // Notify all registered refs
- while ( m_first )
- {
- wxTrackerNode * const first = m_first;
- m_first = first->m_nxt;
- first->OnObjectDestroy();
- }
- }
- wxTrackerNode *m_first;
- };
- #endif // _WX_TRACKER_H_
|