diff --git a/components/lazutils/avglvltree.pas b/components/lazutils/avglvltree.pas
index 47ef89df5f..a5dddd0e52 100644
--- a/components/lazutils/avglvltree.pas
+++ b/components/lazutils/avglvltree.pas
@@ -46,6 +46,7 @@ type
Data: Pointer;
function Successor: TAvgLvlTreeNode; // next right
function Precessor: TAvgLvlTreeNode; // next left
+ procedure Clear;
function TreeDepth: integer; // longest WAY down. e.g. only one node => 0 !
procedure ConsistencyCheck(Tree: TAvgLvlTree); virtual;
function GetCount: SizeInt;
@@ -91,13 +92,14 @@ type
procedure SetCompares(const NewCompare: TListSortCompare;
const NewObjectCompare: TObjectSortCompare);
public
- constructor Create(OnCompareMethod: TListSortCompare);
- constructor CreateObjectCompare(OnCompareMethod: TObjectSortCompare);
+ constructor Create(const OnCompareMethod: TListSortCompare);
+ constructor CreateObjectCompare(const OnCompareMethod: TObjectSortCompare);
constructor Create;
destructor Destroy; override;
property OnCompare: TListSortCompare read FOnCompare write SetOnCompare;
property OnObjectCompare: TObjectSortCompare read FOnObjectCompare write SetOnObjectCompare;
property NodeClass: TAvgLvlTreeNodeClass read FNodeClass write FNodeClass; // used for new nodes
+ function NewNode: TAvgLvlTreeNode; virtual;
// add, delete, remove, move
procedure Add(ANode: TAvgLvlTreeNode);
@@ -122,9 +124,9 @@ type
function Compare(Data1, Data2: Pointer): integer;
function Find(Data: Pointer): TAvgLvlTreeNode; // O(log(n))
function FindKey(Key: Pointer;
- OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode; // O(log(n))
+ const OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode; // O(log(n))
function FindNearestKey(Key: Pointer;
- OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode; // O(log(n))
+ const OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode; // O(log(n))
function FindSuccessor(ANode: TAvgLvlTreeNode): TAvgLvlTreeNode; inline;
function FindPrecessor(ANode: TAvgLvlTreeNode): TAvgLvlTreeNode; inline;
function FindLowest: TAvgLvlTreeNode; // O(log(n))
@@ -135,9 +137,9 @@ type
function FindLeftMost(Data: Pointer): TAvgLvlTreeNode;
function FindRightMost(Data: Pointer): TAvgLvlTreeNode;
function FindLeftMostKey(Key: Pointer;
- OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
+ const OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
function FindRightMostKey(Key: Pointer;
- OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
+ const OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
function FindLeftMostSameKey(ANode: TAvgLvlTreeNode): TAvgLvlTreeNode;
function FindRightMostSameKey(ANode: TAvgLvlTreeNode): TAvgLvlTreeNode;
@@ -849,7 +851,7 @@ end;
function TAvgLvlTree.Add(Data: Pointer): TAvgLvlTreeNode;
begin
- Result:=NodeClass.Create;
+ Result:=NewNode;
Result.Data:=Data;
Add(Result);
end;
@@ -870,7 +872,7 @@ function TAvgLvlTree.AddAscendingSequence(Data: Pointer;
var
InsertPos: TAvgLvlTreeNode;
begin
- Result:=NodeClass.Create;
+ Result:=NewNode;
Result.Data:=Data;
if (LastAdded<>nil) and (Compare(LastAdded.Data,Data)<=0)
and ((Successor=nil) or (Compare(Data,Successor.Data)<=0)) then begin
@@ -895,6 +897,11 @@ begin
end;
end;
+function TAvgLvlTree.NewNode: TAvgLvlTreeNode;
+begin
+ Result:=NodeClass.Create;
+end;
+
procedure TAvgLvlTree.Add(ANode: TAvgLvlTreeNode);
// add a node. If there are already nodes with the same value it will be
// inserted rightmost
@@ -1171,14 +1178,15 @@ begin
FCount:=0;
end;
-constructor TAvgLvlTree.Create(OnCompareMethod: TListSortCompare);
+constructor TAvgLvlTree.Create(const OnCompareMethod: TListSortCompare);
begin
inherited Create;
FOnCompare:=OnCompareMethod;
Init;
end;
-constructor TAvgLvlTree.CreateObjectCompare(OnCompareMethod: TObjectSortCompare);
+constructor TAvgLvlTree.CreateObjectCompare(
+ const OnCompareMethod: TObjectSortCompare);
begin
inherited Create;
FOnObjectCompare:=OnCompareMethod;
@@ -1286,7 +1294,7 @@ begin
end;
function TAvgLvlTree.FindKey(Key: Pointer;
- OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
+ const OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
var Comp: integer;
begin
Result:=fRoot;
@@ -1302,7 +1310,7 @@ begin
end;
function TAvgLvlTree.FindNearestKey(Key: Pointer;
- OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
+ const OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
var Comp: integer;
begin
Result:=fRoot;
@@ -1324,7 +1332,7 @@ begin
end;
function TAvgLvlTree.FindLeftMostKey(Key: Pointer;
- OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
+ const OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
var
LeftNode: TAvgLvlTreeNode;
begin
@@ -1338,7 +1346,7 @@ begin
end;
function TAvgLvlTree.FindRightMostKey(Key: Pointer;
- OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
+ const OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
var
RightNode: TAvgLvlTreeNode;
begin
@@ -1537,11 +1545,11 @@ end;
procedure TAvgLvlTree.FreeAndClear;
- procedure FreeNode(ANode: TAvgLvlTreeNode);
+ procedure FreeNodeData(ANode: TAvgLvlTreeNode);
begin
if ANode=nil then exit;
- FreeNode(ANode.Left);
- FreeNode(ANode.Right);
+ FreeNodeData(ANode.Left);
+ FreeNodeData(ANode.Right);
if ANode.Data<>nil then TObject(ANode.Data).Free;
ANode.Data:=nil;
end;
@@ -1549,7 +1557,7 @@ procedure TAvgLvlTree.FreeAndClear;
// TAvgLvlTree.FreeAndClear
begin
// free all data
- FreeNode(fRoot);
+ FreeNodeData(fRoot);
// free all nodes
Clear;
end;
@@ -1603,7 +1611,7 @@ procedure TAvgLvlTree.Assign(aTree: TAvgLvlTree);
procedure AssignNode(var MyNode: TAvgLvlTreeNode; OtherNode: TAvgLvlTreeNode);
begin
- MyNode:=NodeClass.Create;
+ MyNode:=NewNode;
MyNode.Data:=OtherNode.Data;
MyNode.Balance:=OtherNode.Balance;
if OtherNode.Left<>nil then begin
@@ -1827,12 +1835,8 @@ procedure TAvgLvlTree.SwitchPositionWithSuccessor(aNode,
Because ANode.Right<>nil the Successor is a child of ANode }
var
OldBalance: Integer;
- OldParent: TAvgLvlTreeNode;
- OldLeft: TAvgLvlTreeNode;
- OldRight: TAvgLvlTreeNode;
- OldSuccParent: TAvgLvlTreeNode;
- OldSuccLeft: TAvgLvlTreeNode;
- OldSuccRight: TAvgLvlTreeNode;
+ OldParent, OldLeft, OldRight,
+ OldSuccParent, OldSuccLeft, OldSuccRight: TAvgLvlTreeNode;
begin
OldBalance:=aNode.Balance;
aNode.Balance:=aSuccessor.Balance;
@@ -1993,6 +1997,15 @@ begin
end;
end;
+procedure TAvgLvlTreeNode.Clear;
+begin
+ Parent:=nil;
+ Left:=nil;
+ Right:=nil;
+ Balance:=0;
+ Data:=nil;
+end;
+
{ TIndexedAVLTree }
function TIndexedAVLTree.GetItems(Index: SizeInt): Pointer;
diff --git a/test/bugtestcase.pas b/test/bugtestcase.pas
index 541d6bf65b..3c0c57af0e 100644
--- a/test/bugtestcase.pas
+++ b/test/bugtestcase.pas
@@ -24,7 +24,7 @@ interface
uses
Classes, SysUtils, Math, process, fpcunit, testregistry,
- FileUtil, LazFileUtils, LazUTF8, UTF8Process, InterfaceBase,
+ FileUtil, LazFileUtils, LazUTF8, UTF8Process, InterfaceBase, LCLPlatformDef,
TestGlobals;
type
diff --git a/test/runtests.lpi b/test/runtests.lpi
index 16a03623bc..843282750e 100644
--- a/test/runtests.lpi
+++ b/test/runtests.lpi
@@ -95,6 +95,7 @@
+
@@ -123,6 +124,7 @@
+
diff --git a/test/runtests.lpr b/test/runtests.lpr
index 92825dc20f..8619dfcbad 100644
--- a/test/runtests.lpr
+++ b/test/runtests.lpr
@@ -24,8 +24,8 @@ uses
Classes, consoletestrunner,
testglobals, testunits, dom,
{Unit needed to set the LCL version and widget set name}
- LCLVersion, InterfaceBase, Interfaces, TestLazXML, TestAvgLvlTree,
- TestLConvEncoding;
+ LCLVersion, InterfaceBase, LCLPlatformDef, Interfaces, TestLazXML,
+ TestAvgLvlTree, TestLConvEncoding;
type
diff --git a/test/testlpi.pas b/test/testlpi.pas
index f58f0d34ca..d1f485ebc8 100644
--- a/test/testlpi.pas
+++ b/test/testlpi.pas
@@ -24,7 +24,7 @@ interface
uses
Classes, SysUtils, strutils, fpcunit, testregistry, process, UTF8Process,
- InterfaceBase, LazFileUtils, LazUTF8, FileUtil,
+ InterfaceBase, LCLPlatformDef, LazFileUtils, LazUTF8, FileUtil,
TestGlobals;
type