Browse Source

* nodememmanager now changable, but global var still default.

git-svn-id: trunk@12809 -
marco 16 years ago
parent
commit
1dfded8887
1 changed files with 27 additions and 14 deletions
  1. 27 14
      packages/fcl-base/src/avl_tree.pp

+ 27 - 14
packages/fcl-base/src/avl_tree.pp

@@ -42,10 +42,17 @@ type
     function TreeDepth: integer; // longest WAY down. e.g. only one node => 0 !
     function TreeDepth: integer; // longest WAY down. e.g. only one node => 0 !
   end;
   end;
 
 
+  TBaseAVLTreeNodeManager = class
+  public
+    procedure DisposeNode(ANode: TAVLTreeNode); virtual; abstract;
+    function NewNode: TAVLTreeNode; virtual; abstract;
+  end;
+
   TAVLTree = class
   TAVLTree = class
   private
   private
     FOnCompare: TListSortCompare;
     FOnCompare: TListSortCompare;
     FCount: integer;
     FCount: integer;
+    nodemgr :  TBaseAVLTreeNodeManager;
     procedure BalanceAfterInsert(ANode: TAVLTreeNode);
     procedure BalanceAfterInsert(ANode: TAVLTreeNode);
     procedure BalanceAfterDelete(ANode: TAVLTreeNode);
     procedure BalanceAfterDelete(ANode: TAVLTreeNode);
     function FindInsertPos(Data: Pointer): TAVLTreeNode;
     function FindInsertPos(Data: Pointer): TAVLTreeNode;
@@ -84,12 +91,13 @@ type
     function ConsistencyCheck: integer;
     function ConsistencyCheck: integer;
     procedure WriteReportToStream(s: TStream; var StreamSize: int64);
     procedure WriteReportToStream(s: TStream; var StreamSize: int64);
     function ReportAsString: string;
     function ReportAsString: string;
+    procedure SetNodeManager(newmgr:TBaseAVLTreeNodeManager);
     constructor Create(OnCompareMethod: TListSortCompare);
     constructor Create(OnCompareMethod: TListSortCompare);
     constructor Create;
     constructor Create;
     destructor Destroy; override;
     destructor Destroy; override;
   end;
   end;
 
 
-  TAVLTreeNodeMemManager = class
+  TAVLTreeNodeMemManager = class(TBaseAVLTreeNodeManager)
   private
   private
     FFirstFree: TAVLTreeNode;
     FFirstFree: TAVLTreeNode;
     FFreeCount: integer;
     FFreeCount: integer;
@@ -100,8 +108,8 @@ type
     procedure SetMinFree(NewValue: integer);
     procedure SetMinFree(NewValue: integer);
     procedure DisposeFirstFreeNode;
     procedure DisposeFirstFreeNode;
   public
   public
-    procedure DisposeNode(ANode: TAVLTreeNode);
-    function NewNode: TAVLTreeNode;
+    procedure DisposeNode(ANode: TAVLTreeNode); override;
+    function NewNode: TAVLTreeNode; override;
     property MinimumFreeNode: integer read FMinFree write SetMinFree;
     property MinimumFreeNode: integer read FMinFree write SetMinFree;
     property MaximumFreeNodeRatio: integer
     property MaximumFreeNodeRatio: integer
         read FMaxFreeRatio write SetMaxFreeRatio; // in one eighth steps
         read FMaxFreeRatio write SetMaxFreeRatio; // in one eighth steps
@@ -129,7 +137,7 @@ end;
 
 
 function TAVLTree.Add(Data: Pointer): TAVLTreeNode;
 function TAVLTree.Add(Data: Pointer): TAVLTreeNode;
 begin
 begin
-  Result:=NodeMemManager.NewNode;
+  Result:=NodeMgr.NewNode;
   Result.Data:=Data;
   Result.Data:=Data;
   Add(Result);
   Add(Result);
 end;
 end;
@@ -468,7 +476,7 @@ procedure TAVLTree.Clear;
       if ANode.Left<>nil then DeleteNode(ANode.Left);
       if ANode.Left<>nil then DeleteNode(ANode.Left);
       if ANode.Right<>nil then DeleteNode(ANode.Right);
       if ANode.Right<>nil then DeleteNode(ANode.Right);
     end;
     end;
-    NodeMemManager.DisposeNode(ANode);
+    NodeMgr.DisposeNode(ANode);
   end;
   end;
 
 
 // Clear
 // Clear
@@ -481,6 +489,7 @@ end;
 constructor TAVLTree.Create(OnCompareMethod: TListSortCompare);
 constructor TAVLTree.Create(OnCompareMethod: TListSortCompare);
 begin
 begin
   inherited Create;
   inherited Create;
+  nodemgr:=NodeMemManager;
   FOnCompare:=OnCompareMethod;
   FOnCompare:=OnCompareMethod;
   FCount:=0;
   FCount:=0;
 end;
 end;
@@ -518,7 +527,7 @@ begin
       Root:=nil;
       Root:=nil;
     end;
     end;
     dec(FCount);
     dec(FCount);
-    NodeMemManager.DisposeNode(ANode);
+    NodeMgr.DisposeNode(ANode);
     exit;
     exit;
   end;
   end;
   if (ANode.Right=nil) then begin
   if (ANode.Right=nil) then begin
@@ -541,7 +550,7 @@ begin
       Root:=OldLeft;
       Root:=OldLeft;
     end;
     end;
     dec(FCount);
     dec(FCount);
-    NodeMemManager.DisposeNode(ANode);
+    NodeMgr.DisposeNode(ANode);
     exit;
     exit;
   end;
   end;
   if (ANode.Left=nil) then begin
   if (ANode.Left=nil) then begin
@@ -564,7 +573,7 @@ begin
       Root:=OldRight;
       Root:=OldRight;
     end;
     end;
     dec(FCount);
     dec(FCount);
-    NodeMemManager.DisposeNode(ANode);
+    NodeMgr.DisposeNode(ANode);
     exit;
     exit;
   end;
   end;
   // DelNode has both: Left and Right
   // DelNode has both: Left and Right
@@ -1028,6 +1037,11 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure TAVLTree.SetNodeManager(newmgr:TBaseAVLTreeNodeManager);
+// only allowed just after create.
+begin
+ nodemgr:=newmgr;
+end;
 
 
 { TAVLTreeNode }
 { TAVLTreeNode }
 
 
@@ -1058,6 +1072,8 @@ begin
   Data:=nil;
   Data:=nil;
 end;
 end;
 
 
+
+
 { TAVLTreeNodeMemManager }
 { TAVLTreeNodeMemManager }
 
 
 constructor TAVLTreeNodeMemManager.Create;
 constructor TAVLTreeNodeMemManager.Create;
@@ -1150,12 +1166,9 @@ end;
 
 
 
 
 initialization
 initialization
-
-NodeMemManager:=TAVLTreeNodeMemManager.Create;
+  NodeMemManager:=TAVLTreeNodeMemManager.Create;
 
 
 finalization
 finalization
-
-NodeMemManager.Free;
-NodeMemManager:=nil;
-
+  NodeMemManager.Free;
+  NodeMemManager:=nil;
 end.
 end.