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
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 }