mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-13 20:44:03 +02:00
lazutils: TAvgLvlTree.OwnsObjects
git-svn-id: trunk@53968 -
This commit is contained in:
parent
de4b901bdd
commit
6059715450
@ -72,6 +72,8 @@ type
|
|||||||
{ TAvgLvlTree }
|
{ TAvgLvlTree }
|
||||||
|
|
||||||
TAvgLvlTree = class
|
TAvgLvlTree = class
|
||||||
|
private
|
||||||
|
FOwnsObjects: boolean;
|
||||||
protected
|
protected
|
||||||
fRoot: TAvgLvlTreeNode;
|
fRoot: TAvgLvlTreeNode;
|
||||||
FCount: SizeInt;
|
FCount: SizeInt;
|
||||||
@ -99,7 +101,9 @@ type
|
|||||||
property OnCompare: TListSortCompare read FOnCompare write SetOnCompare;
|
property OnCompare: TListSortCompare read FOnCompare write SetOnCompare;
|
||||||
property OnObjectCompare: TObjectSortCompare read FOnObjectCompare write SetOnObjectCompare;
|
property OnObjectCompare: TObjectSortCompare read FOnObjectCompare write SetOnObjectCompare;
|
||||||
property NodeClass: TAvgLvlTreeNodeClass read FNodeClass write FNodeClass; // used for new nodes
|
property NodeClass: TAvgLvlTreeNodeClass read FNodeClass write FNodeClass; // used for new nodes
|
||||||
function NewNode: TAvgLvlTreeNode; virtual;
|
function NewNode: TAvgLvlTreeNode; virtual; // create a node, not connected, outside the tree
|
||||||
|
procedure DisposeNode(aNode: TAvgLvlTreeNode); virtual; // free a node, already disconnected from the tree
|
||||||
|
property OwnsObjects: boolean read FOwnsObjects write FOwnsObjects;
|
||||||
|
|
||||||
// add, delete, remove, move
|
// add, delete, remove, move
|
||||||
procedure Add(ANode: TAvgLvlTreeNode);
|
procedure Add(ANode: TAvgLvlTreeNode);
|
||||||
@ -926,6 +930,15 @@ begin
|
|||||||
Result:=NodeClass.Create;
|
Result:=NodeClass.Create;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TAvgLvlTree.DisposeNode(aNode: TAvgLvlTreeNode);
|
||||||
|
begin
|
||||||
|
if OwnsObjects then begin
|
||||||
|
TObject(aNode.Data).Free;
|
||||||
|
aNode.Data := nil;
|
||||||
|
end;
|
||||||
|
aNode.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TAvgLvlTree.Add(ANode: TAvgLvlTreeNode);
|
procedure TAvgLvlTree.Add(ANode: TAvgLvlTreeNode);
|
||||||
// add a node. If there are already nodes with the same value it will be
|
// add a node. If there are already nodes with the same value it will be
|
||||||
// inserted rightmost
|
// inserted rightmost
|
||||||
@ -1068,10 +1081,10 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TAvgLvlTree.DeletingNode(aNode: TAvgLvlTreeNode);
|
procedure TAvgLvlTree.DeletingNode(aNode: TAvgLvlTreeNode);
|
||||||
// called by Delete
|
// called by Delete, before disconnecting from tree
|
||||||
// Node.Left=nil or Node.Right=nil
|
// Node.Left=nil or Node.Right=nil
|
||||||
begin
|
begin
|
||||||
// for descendants to override
|
// for user overrides
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TAvgLvlTree.BalanceAfterInsert(ANode: TAvgLvlTreeNode);
|
procedure TAvgLvlTree.BalanceAfterInsert(ANode: TAvgLvlTreeNode);
|
||||||
@ -1192,7 +1205,7 @@ procedure TAvgLvlTree.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;
|
||||||
ANode.Free;
|
DisposeNode(ANode);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// Clear
|
// Clear
|
||||||
@ -1260,7 +1273,7 @@ begin
|
|||||||
fRoot:=Child;
|
fRoot:=Child;
|
||||||
end;
|
end;
|
||||||
dec(FCount);
|
dec(FCount);
|
||||||
ANode.Free;
|
DisposeNode(ANode);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TAvgLvlTree.Remove(Data: Pointer): boolean;
|
function TAvgLvlTree.Remove(Data: Pointer): boolean;
|
||||||
@ -1558,7 +1571,7 @@ procedure TAvgLvlTree.FreeAndClear;
|
|||||||
if ANode=nil then exit;
|
if ANode=nil then exit;
|
||||||
FreeNodeData(ANode.Left);
|
FreeNodeData(ANode.Left);
|
||||||
FreeNodeData(ANode.Right);
|
FreeNodeData(ANode.Right);
|
||||||
if ANode.Data<>nil then TObject(ANode.Data).Free;
|
TObject(ANode.Data).Free;
|
||||||
ANode.Data:=nil;
|
ANode.Data:=nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1573,10 +1586,14 @@ end;
|
|||||||
procedure TAvgLvlTree.FreeAndDelete(ANode: TAvgLvlTreeNode);
|
procedure TAvgLvlTree.FreeAndDelete(ANode: TAvgLvlTreeNode);
|
||||||
var OldData: TObject;
|
var OldData: TObject;
|
||||||
begin
|
begin
|
||||||
|
if OwnsObjects then
|
||||||
|
Delete(ANode)
|
||||||
|
else begin
|
||||||
OldData:=TObject(ANode.Data);
|
OldData:=TObject(ANode.Data);
|
||||||
Delete(ANode);
|
Delete(ANode);
|
||||||
OldData.Free;
|
OldData.Free;
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TAvgLvlTree.Equals(Obj: TObject): boolean;
|
function TAvgLvlTree.Equals(Obj: TObject): boolean;
|
||||||
begin
|
begin
|
||||||
|
@ -1001,6 +1001,8 @@
|
|||||||
LastNode:=Tree.AddAscendingSequence(TItem.Create(i),LastNode,Successor);
|
LastNode:=Tree.AddAscendingSequence(TItem.Create(i),LastNode,Successor);
|
||||||
</descr>
|
</descr>
|
||||||
</element>
|
</element>
|
||||||
|
<element name="TAvgLvlTree.OwnsObjects"><short>Enable to treat Node.Data as TObject and free on delete</short>
|
||||||
|
</element>
|
||||||
</module>
|
</module>
|
||||||
<!-- AvgLvlTree -->
|
<!-- AvgLvlTree -->
|
||||||
</package>
|
</package>
|
||||||
|
Loading…
Reference in New Issue
Block a user