avltree: made nodemgr protected

git-svn-id: trunk@18008 -
This commit is contained in:
Mattias Gaertner 2011-07-17 09:54:14 +00:00
parent 04e2321724
commit e18d5e1f61

View File

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