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