]> git.saurik.com Git - wxWidgets.git/blob - utils/framelayout/src/garbagec.h
fix for the crash when many listctrl items change state
[wxWidgets.git] / utils / framelayout / src / garbagec.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: No names yet.
3 // Purpose: Contrib. demo
4 // Author: Aleksandras Gluchovas (@Lithuania)
5 // Modified by:
6 // Created: ??/10/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Aleksandras Gluchovas
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef __GARBAGEC_G__
13 #define __GARBAGEC_G__
14
15 #include "wx/list.h"
16
17 struct GCItem
18 {
19 void* mpObj;
20 wxList mRefs; // references to other nodes
21 };
22
23 inline void* gc_node_to_obj( wxNode* pGCNode )
24 {
25 return ( (GCItem*) (pGCNode->Data()) )->mpObj;
26 }
27
28 // class implements extreamly slow, but probably one of the most simple GC alogrithms
29
30 class GarbageCollector
31 {
32 protected:
33 wxList mAllNodes;
34 wxList mRegularLst;
35 wxList mCycledLst;
36
37 wxNode* FindItemNode( void* pForObj );
38 void ResolveReferences();
39
40 wxNode* FindRefernceFreeItemNode();
41 void RemoveReferencesToNode( wxNode* pItemNode );
42 void DestroyItemList( wxList& lst );
43
44 public:
45
46 GarbageCollector() {}
47
48 virtual ~GarbageCollector();
49
50 // prepare data for GC alg.
51
52 virtual void AddObject( void* pObj, int refCnt = 1 );
53 virtual void AddDependency( void* pObj, void* pDepnedsOnObj );
54
55 // executes GC alg.
56
57 virtual void ArrangeCollection();
58
59 // acces results of the alg.
60
61 wxList& GetRegularObjects();
62 wxList& GetCycledObjects();
63
64 // removes all date form GC
65
66 void Reset();
67 };
68
69 #endif