LazUtils: Copy essential changes from FCL's AVL_Tree to our version Laz_AVL_Tree.

This commit is contained in:
Juha 2023-04-02 09:21:20 +03:00
parent d81d854eb5
commit 7dc0983e3c

View File

@ -20,7 +20,7 @@
balanced, so that inserting, deleting and finding a node is performed in balanced, so that inserting, deleting and finding a node is performed in
O(log(#Nodes)). O(log(#Nodes)).
Note! This is a copy of avl_tree unit from FPC 3.1.1 from 6th Apr 2017. Note! This is a copy of avl_tree unit from FPC trunk from Apr 2023.
Can be removed when FPC 3.2 is the minimun requirement for Lazarus and LazUtils. Can be removed when FPC 3.2 is the minimun requirement for Lazarus and LazUtils.
} }
unit Laz_AVL_Tree; unit Laz_AVL_Tree;
@ -123,7 +123,6 @@ type
function AddAscendingSequence(Data: Pointer; LastAdded: TAVLTreeNode; function AddAscendingSequence(Data: Pointer; LastAdded: TAVLTreeNode;
var Successor: TAVLTreeNode): TAVLTreeNode; var Successor: TAVLTreeNode): TAVLTreeNode;
procedure Delete(ANode: TAVLTreeNode); procedure Delete(ANode: TAVLTreeNode);
// JuMa: Turned Remove and RemovePointer into functions.
function Remove(Data: Pointer): boolean; function Remove(Data: Pointer): boolean;
function RemovePointer(Data: Pointer): boolean; function RemovePointer(Data: Pointer): boolean;
procedure MoveDataLeftMost(var ANode: TAVLTreeNode); procedure MoveDataLeftMost(var ANode: TAVLTreeNode);
@ -624,21 +623,23 @@ procedure TAVLTree.Clear;
procedure DeleteNode(ANode: TAVLTreeNode); procedure DeleteNode(ANode: TAVLTreeNode);
begin begin
if ANode.Left<>nil then DeleteNode(ANode.Left); if ANode<>nil then begin
if ANode.Right<>nil then DeleteNode(ANode.Right); if ANode.Left<>nil then DeleteNode(ANode.Left);
if ANode.Right<>nil then DeleteNode(ANode.Right);
end;
DisposeNode(ANode); DisposeNode(ANode);
end; end;
// Clear // Clear
begin begin
if Root<>nil then DeleteNode(Root);
DeleteNode(Root);
fRoot:=nil; fRoot:=nil;
FCount:=0; FCount:=0;
end; end;
constructor TAVLTree.Create(const OnCompareMethod: TListSortCompare); constructor TAVLTree.Create(const OnCompareMethod: TListSortCompare);
begin begin
fNodeMgr:=LazNodeMemManager;
FOnCompare:=OnCompareMethod; FOnCompare:=OnCompareMethod;
Init; Init;
end; end;
@ -646,6 +647,7 @@ end;
constructor TAVLTree.CreateObjectCompare( constructor TAVLTree.CreateObjectCompare(
const OnCompareMethod: TObjectSortCompare); const OnCompareMethod: TObjectSortCompare);
begin begin
fNodeMgr:=LazNodeMemManager;
FOnObjectCompare:=OnCompareMethod; FOnObjectCompare:=OnCompareMethod;
Init; Init;
end; end;
@ -1118,7 +1120,7 @@ end;
procedure TAVLTree.ConsistencyCheck; procedure TAVLTree.ConsistencyCheck;
procedure E(Msg: string); procedure E(const Msg: string);
begin begin
raise Exception.Create('TAVLTree.ConsistencyCheck: '+Msg); raise Exception.Create('TAVLTree.ConsistencyCheck: '+Msg);
end; end;
@ -1362,7 +1364,7 @@ end;
procedure TAVLTreeNode.ConsistencyCheck(Tree: TAVLTree); procedure TAVLTreeNode.ConsistencyCheck(Tree: TAVLTree);
procedure E(Msg: string); procedure E(const Msg: string);
begin begin
raise Exception.Create('TAVLTreeNode.ConsistencyCheck: '+Msg); raise Exception.Create('TAVLTreeNode.ConsistencyCheck: '+Msg);
end; end;