lazutils: TAvgLvlTree.OwnsObjects

git-svn-id: trunk@53968 -
This commit is contained in:
mattias 2017-01-18 11:59:00 +00:00
parent de4b901bdd
commit 6059715450
2 changed files with 28 additions and 9 deletions

View File

@ -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,9 +1586,13 @@ end;
procedure TAvgLvlTree.FreeAndDelete(ANode: TAvgLvlTreeNode); procedure TAvgLvlTree.FreeAndDelete(ANode: TAvgLvlTreeNode);
var OldData: TObject; var OldData: TObject;
begin begin
OldData:=TObject(ANode.Data); if OwnsObjects then
Delete(ANode); Delete(ANode)
OldData.Free; else begin
OldData:=TObject(ANode.Data);
Delete(ANode);
OldData.Free;
end;
end; end;
function TAvgLvlTree.Equals(Obj: TObject): boolean; function TAvgLvlTree.Equals(Obj: TObject): boolean;

View File

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