Browse Source

avltree: made nodemgr protected

git-svn-id: trunk@18008 -
Mattias Gaertner 14 years ago
parent
commit
e18d5e1f61
1 changed files with 19 additions and 10 deletions
  1. 19 10
      packages/fcl-base/src/avl_tree.pp

+ 19 - 10
packages/fcl-base/src/avl_tree.pp

@@ -52,11 +52,13 @@ type
   private
     FOnCompare: TListSortCompare;
     FCount: integer;
-    nodemgr :  TBaseAVLTreeNodeManager;
     procedure BalanceAfterInsert(ANode: TAVLTreeNode);
     procedure BalanceAfterDelete(ANode: TAVLTreeNode);
     function FindInsertPos(Data: Pointer): TAVLTreeNode;
     procedure SetOnCompare(const AValue: TListSortCompare);
+  protected
+    fNodeMgrAutoFree: boolean;
+    fNodeMgr: TBaseAVLTreeNodeManager;
   public
     Root: TAVLTreeNode;
     function Find(Data: Pointer): TAVLTreeNode;
@@ -91,7 +93,8 @@ type
     function ConsistencyCheck: integer;
     procedure WriteReportToStream(s: TStream; var StreamSize: int64);
     function ReportAsString: string;
-    procedure SetNodeManager(newmgr:TBaseAVLTreeNodeManager);
+    procedure SetNodeManager(NewMgr: TBaseAVLTreeNodeManager;
+                             AutoFree: boolean = false);
     constructor Create(OnCompareMethod: TListSortCompare);
     constructor Create;
     destructor Destroy; override;
@@ -137,7 +140,7 @@ end;
 
 function TAVLTree.Add(Data: Pointer): TAVLTreeNode;
 begin
-  Result:=NodeMgr.NewNode;
+  Result:=fNodeMgr.NewNode;
   Result.Data:=Data;
   Add(Result);
 end;
@@ -476,7 +479,7 @@ procedure TAVLTree.Clear;
       if ANode.Left<>nil then DeleteNode(ANode.Left);
       if ANode.Right<>nil then DeleteNode(ANode.Right);
     end;
-    NodeMgr.DisposeNode(ANode);
+    fNodeMgr.DisposeNode(ANode);
   end;
 
 // Clear
@@ -489,7 +492,7 @@ end;
 constructor TAVLTree.Create(OnCompareMethod: TListSortCompare);
 begin
   inherited Create;
-  nodemgr:=NodeMemManager;
+  fNodeMgr:=NodeMemManager;
   FOnCompare:=OnCompareMethod;
   FCount:=0;
 end;
@@ -527,7 +530,7 @@ begin
       Root:=nil;
     end;
     dec(FCount);
-    NodeMgr.DisposeNode(ANode);
+    fNodeMgr.DisposeNode(ANode);
     exit;
   end;
   if (ANode.Right=nil) then begin
@@ -550,7 +553,7 @@ begin
       Root:=OldLeft;
     end;
     dec(FCount);
-    NodeMgr.DisposeNode(ANode);
+    fNodeMgr.DisposeNode(ANode);
     exit;
   end;
   if (ANode.Left=nil) then begin
@@ -573,7 +576,7 @@ begin
       Root:=OldRight;
     end;
     dec(FCount);
-    NodeMgr.DisposeNode(ANode);
+    fNodeMgr.DisposeNode(ANode);
     exit;
   end;
   // DelNode has both: Left and Right
@@ -641,6 +644,8 @@ end;
 destructor TAVLTree.Destroy;
 begin
   Clear;
+  if fNodeMgrAutoFree then
+    FreeAndNil(fNodeMgr);
   inherited Destroy;
 end;
 
@@ -1038,10 +1043,14 @@ begin
     FOnCompare:=AValue;
 end;
 
-procedure TAVLTree.SetNodeManager(newmgr:TBaseAVLTreeNodeManager);
+procedure TAVLTree.SetNodeManager(NewMgr: TBaseAVLTreeNodeManager;
+  AutoFree: boolean);
 // only allowed just after create.
 begin
- nodemgr:=newmgr;
+  if fNodeMgrAutoFree then
+    FreeAndNil(fNodeMgr);
+  fNodeMgr:=NewMgr;
+  fNodeMgrAutoFree:=AutoFree;
 end;
 
 { TAVLTreeNode }