mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 20:39:09 +02:00
lazutils: TPointerToPointerTree enumerators
git-svn-id: trunk@42200 -
This commit is contained in:
parent
9f276db94e
commit
d88afd8de1
@ -62,7 +62,7 @@ type
|
|||||||
FTree: TAvgLvlTree;
|
FTree: TAvgLvlTree;
|
||||||
public
|
public
|
||||||
constructor Create(Tree: TAvgLvlTree; aLowToHigh: boolean = true);
|
constructor Create(Tree: TAvgLvlTree; aLowToHigh: boolean = true);
|
||||||
function GetEnumerator: TAvgLvlTreeNodeEnumerator;
|
function GetEnumerator: TAvgLvlTreeNodeEnumerator; inline;
|
||||||
function MoveNext: Boolean;
|
function MoveNext: Boolean;
|
||||||
property Current: TAvgLvlTreeNode read FCurrent;
|
property Current: TAvgLvlTreeNode read FCurrent;
|
||||||
property LowToHigh: boolean read FLowToHigh;
|
property LowToHigh: boolean read FLowToHigh;
|
||||||
@ -186,6 +186,22 @@ type
|
|||||||
end;
|
end;
|
||||||
PPointerToPointerItem = ^TPointerToPointerItem;
|
PPointerToPointerItem = ^TPointerToPointerItem;
|
||||||
|
|
||||||
|
{ TPointerToPointerEnumerator }
|
||||||
|
|
||||||
|
TPointerToPointerEnumerator = class
|
||||||
|
protected
|
||||||
|
FHighToLow: boolean;
|
||||||
|
FTree: TAvgLvlTree;
|
||||||
|
FCurrent: TAvgLvlTreeNode;
|
||||||
|
function GetCurrent: PPointerToPointerItem; inline;
|
||||||
|
public
|
||||||
|
constructor Create(Tree: TAvgLvlTree);
|
||||||
|
function GetEnumerator: TPointerToPointerEnumerator; inline;
|
||||||
|
function MoveNext: Boolean;
|
||||||
|
property Current: PPointerToPointerItem read GetCurrent;
|
||||||
|
property HighToLow: boolean read FHighToLow;
|
||||||
|
end;
|
||||||
|
|
||||||
TPointerToPointerTree = class
|
TPointerToPointerTree = class
|
||||||
private
|
private
|
||||||
FItems: TAvgLvlTree;
|
FItems: TAvgLvlTree;
|
||||||
@ -208,6 +224,10 @@ type
|
|||||||
property Count: SizeInt read GetCount;
|
property Count: SizeInt read GetCount;
|
||||||
property Values[const Key: Pointer]: Pointer read GetValues write SetValues; default;
|
property Values[const Key: Pointer]: Pointer read GetValues write SetValues; default;
|
||||||
property Tree: TAvgLvlTree read FItems; // tree of PPointerToPointerItem
|
property Tree: TAvgLvlTree read FItems; // tree of PPointerToPointerItem
|
||||||
|
|
||||||
|
// enumerators
|
||||||
|
function GetEnumerator: TPointerToPointerEnumerator;
|
||||||
|
function GetEnumeratorHighToLow: TPointerToPointerEnumerator;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -307,44 +327,6 @@ type
|
|||||||
property Current: PStringToStringItem read GetCurrent;
|
property Current: PStringToStringItem read GetCurrent;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$IFDEF DisableNewStringToStringTree}
|
|
||||||
{ TOldStringToStringTree }
|
|
||||||
|
|
||||||
TOldStringToStringTree = class
|
|
||||||
private
|
|
||||||
FCompareItems: TListSortCompare;
|
|
||||||
FCompareNameWithItem: TListSortCompare;
|
|
||||||
FItems: TAvgLvlTree;
|
|
||||||
function GetCount: Integer;
|
|
||||||
function GetValues(const Name: string): string;
|
|
||||||
procedure SetValues(const Name: string; const AValue: string);
|
|
||||||
function FindNode(const Name: string): TAvgLvlTreeNode;
|
|
||||||
function GetNode(Node: TAvgLvlTreeNode; out Name, Value: string): Boolean;
|
|
||||||
public
|
|
||||||
constructor Create(CaseSensitive: boolean);
|
|
||||||
constructor Create(const ACompareItems, ACompareNameWithItem: TListSortCompare);
|
|
||||||
destructor Destroy; override;
|
|
||||||
procedure Clear;
|
|
||||||
procedure Assign(Src: TOldStringToStringTree);
|
|
||||||
function Contains(const Name: string): Boolean;
|
|
||||||
procedure Delete(const Name: string);
|
|
||||||
procedure Add(const Name, Value, Delimiter: string);
|
|
||||||
procedure AddNameValues(List: TStrings);
|
|
||||||
procedure AddValues(List: TStrings); inline; deprecated;
|
|
||||||
procedure AddNames(List: TStrings);
|
|
||||||
function GetFirst(out Name, Value: string): Boolean;
|
|
||||||
function GetLast(out Name, Value: string): Boolean;
|
|
||||||
function GetNext(const Name: string; out NextName, NextValue: string): Boolean;
|
|
||||||
function GetPrev(const Name: string; out PrevName, PrevValue: string): Boolean;
|
|
||||||
property Count: Integer read GetCount;
|
|
||||||
property Values[const Name: string]: string read GetValues write SetValues; default;
|
|
||||||
property Tree: TAvgLvlTree read FItems;
|
|
||||||
property CompareItems: TListSortCompare read FCompareItems;
|
|
||||||
property CompareNameWithItem: TListSortCompare read FCompareNameWithItem;
|
|
||||||
end;
|
|
||||||
TStringToStringTree = TOldStringToStringTree;
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
{ TStringToStringTree }
|
{ TStringToStringTree }
|
||||||
|
|
||||||
TStringToStringTree = class(TCustomStringMap)
|
TStringToStringTree = class(TCustomStringMap)
|
||||||
@ -458,6 +440,39 @@ begin
|
|||||||
Result:=CompareText(AnsiString(Key),PStringMapItem(Data)^.Name);
|
Result:=CompareText(AnsiString(Key),PStringMapItem(Data)^.Name);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TPointerToPointerEnumerator }
|
||||||
|
|
||||||
|
function TPointerToPointerEnumerator.GetCurrent: PPointerToPointerItem;
|
||||||
|
begin
|
||||||
|
Result:=PPointerToPointerItem(FCurrent.Data);
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TPointerToPointerEnumerator.Create(Tree: TAvgLvlTree);
|
||||||
|
begin
|
||||||
|
FTree:=Tree;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TPointerToPointerEnumerator.GetEnumerator: TPointerToPointerEnumerator;
|
||||||
|
begin
|
||||||
|
Result:=Self;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TPointerToPointerEnumerator.MoveNext: Boolean;
|
||||||
|
begin
|
||||||
|
if FHighToLow then begin
|
||||||
|
if FCurrent<>nil then
|
||||||
|
FCurrent:=FCurrent.Precessor
|
||||||
|
else
|
||||||
|
FCurrent:=FTree.FindHighest;
|
||||||
|
end else begin
|
||||||
|
if FCurrent<>nil then
|
||||||
|
FCurrent:=FCurrent.Successor
|
||||||
|
else
|
||||||
|
FCurrent:=FTree.FindLowest;
|
||||||
|
end;
|
||||||
|
Result:=FCurrent<>nil;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TAvgLvlTreeNodeEnumerator }
|
{ TAvgLvlTreeNodeEnumerator }
|
||||||
|
|
||||||
constructor TAvgLvlTreeNodeEnumerator.Create(Tree: TAvgLvlTree;
|
constructor TAvgLvlTreeNodeEnumerator.Create(Tree: TAvgLvlTree;
|
||||||
@ -488,6 +503,8 @@ begin
|
|||||||
Result:=FCurrent<>nil;
|
Result:=FCurrent<>nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TStringToPointerTree }
|
||||||
|
|
||||||
function TStringToPointerTree.GetValues(const s: string): Pointer;
|
function TStringToPointerTree.GetValues(const s: string): Pointer;
|
||||||
var
|
var
|
||||||
Node: TAvgLvlTreeNode;
|
Node: TAvgLvlTreeNode;
|
||||||
@ -2044,197 +2061,6 @@ begin
|
|||||||
Result:=inherited NodeToReportStr(aNode)+' LeftCount='+IntToStr(TIndexedAVLTreeNode(aNode).LeftCount);
|
Result:=inherited NodeToReportStr(aNode)+' LeftCount='+IntToStr(TIndexedAVLTreeNode(aNode).LeftCount);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$IFDEF DisableNewStringToStringTree}
|
|
||||||
{ TOldStringToStringTree }
|
|
||||||
|
|
||||||
function TOldStringToStringTree.GetCount: Integer;
|
|
||||||
begin
|
|
||||||
Result:=FItems.Count;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TOldStringToStringTree.GetValues(const Name: string): string;
|
|
||||||
var
|
|
||||||
Node: TAvgLvlTreeNode;
|
|
||||||
begin
|
|
||||||
Node:=FindNode(Name);
|
|
||||||
if Node<>nil then
|
|
||||||
Result:=PStringToStringItem(Node.Data)^.Value
|
|
||||||
else
|
|
||||||
Result:='';
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TOldStringToStringTree.SetValues(const Name: string; const AValue: string);
|
|
||||||
var
|
|
||||||
NewItem: PStringToStringItem;
|
|
||||||
Node: TAvgLvlTreeNode;
|
|
||||||
begin
|
|
||||||
Node:=FindNode(Name);
|
|
||||||
if (Node<>nil) then
|
|
||||||
PStringToStringItem(Node.Data)^.Value:=AValue
|
|
||||||
else begin
|
|
||||||
New(NewItem);
|
|
||||||
NewItem^.Name:=Name;
|
|
||||||
NewItem^.Value:=AValue;
|
|
||||||
FItems.Add(NewItem);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TOldStringToStringTree.FindNode(const Name: string): TAvgLvlTreeNode;
|
|
||||||
begin
|
|
||||||
Result:=FItems.FindKey(Pointer(Name),FCompareNameWithItem);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TOldStringToStringTree.GetNode(Node: TAvgLvlTreeNode;
|
|
||||||
out Name, Value: string): Boolean;
|
|
||||||
var
|
|
||||||
Item: PStringToStringItem;
|
|
||||||
begin
|
|
||||||
if Node<>nil then begin
|
|
||||||
Item:=PStringToStringItem(Node.Data);
|
|
||||||
Name:=Item^.Name;
|
|
||||||
Value:=Item^.Value;
|
|
||||||
Result:=true;
|
|
||||||
end else begin
|
|
||||||
Name:='';
|
|
||||||
Value:='';
|
|
||||||
Result:=false;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor TOldStringToStringTree.Create(CaseSensitive: boolean);
|
|
||||||
begin
|
|
||||||
if CaseSensitive then
|
|
||||||
Create(@CompareStringToStringItems,@CompareAnsiStringWithStrToStrItem)
|
|
||||||
else
|
|
||||||
Create(@CompareStringToStringItemsI,@CompareAnsiStringWithStrToStrItemI);
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor TOldStringToStringTree.Create(const ACompareItems,
|
|
||||||
ACompareNameWithItem: TListSortCompare);
|
|
||||||
begin
|
|
||||||
FCompareItems:=ACompareItems;
|
|
||||||
FCompareNameWithItem:=ACompareNameWithItem;
|
|
||||||
FItems:=TAvgLvlTree.Create(FCompareItems);
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TOldStringToStringTree.Destroy;
|
|
||||||
begin
|
|
||||||
Clear;
|
|
||||||
FItems.Free;
|
|
||||||
inherited Destroy;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TOldStringToStringTree.Clear;
|
|
||||||
var
|
|
||||||
Node: TAvgLvlTreeNode;
|
|
||||||
Item: PStringToStringItem;
|
|
||||||
begin
|
|
||||||
Node:=FItems.FindLowest;
|
|
||||||
while Node<>nil do begin
|
|
||||||
Item:=PStringToStringItem(Node.Data);
|
|
||||||
Dispose(Item);
|
|
||||||
Node:=Node.FindSuccessor;
|
|
||||||
end;
|
|
||||||
FItems.Clear;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TOldStringToStringTree.Assign(Src: TOldStringToStringTree);
|
|
||||||
var
|
|
||||||
Node: TAvgLvlTreeNode;
|
|
||||||
Item: PStringToStringItem;
|
|
||||||
begin
|
|
||||||
Clear;
|
|
||||||
if Src=nil then exit;
|
|
||||||
Node:=Src.Tree.FindLowest;
|
|
||||||
while Node<>nil do begin
|
|
||||||
Item:=PStringToStringItem(Node.Data);
|
|
||||||
Values[Item^.Name]:=Item^.Value;
|
|
||||||
Node:=Node.FindSuccessor;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TOldStringToStringTree.Contains(const Name: string): Boolean;
|
|
||||||
begin
|
|
||||||
Result:=FindNode(Name)<>nil;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TOldStringToStringTree.Delete(const Name: string);
|
|
||||||
var
|
|
||||||
Node: TAvgLvlTreeNode;
|
|
||||||
Item: PStringToStringItem;
|
|
||||||
begin
|
|
||||||
Node:=FindNode(Name);
|
|
||||||
if Node=nil then exit;
|
|
||||||
Item:=PStringToStringItem(Node.Data);
|
|
||||||
FItems.Delete(Node);
|
|
||||||
Dispose(Item);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TOldStringToStringTree.Add(const Name, Value, Delimiter: string);
|
|
||||||
var
|
|
||||||
OldValue: string;
|
|
||||||
begin
|
|
||||||
OldValue:=Values[Name];
|
|
||||||
if OldValue<>'' then
|
|
||||||
OldValue:=OldValue+Delimiter;
|
|
||||||
OldValue:=OldValue+Value;
|
|
||||||
Values[Name]:=OldValue;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TOldStringToStringTree.AddNameValues(List: TStrings);
|
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
begin
|
|
||||||
for i:=0 to List.Count-1 do
|
|
||||||
Values[List.Names[i]]:=List.ValueFromIndex[i];
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TOldStringToStringTree.AddValues(List: TStrings);
|
|
||||||
begin
|
|
||||||
AddNames(List);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TOldStringToStringTree.AddNames(List: TStrings);
|
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
begin
|
|
||||||
for i:=0 to List.Count-1 do
|
|
||||||
Values[List[i]]:='';
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TOldStringToStringTree.GetFirst(out Name, Value: string): Boolean;
|
|
||||||
begin
|
|
||||||
Result:=GetNode(Tree.FindLowest,Name,Value);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TOldStringToStringTree.GetLast(out Name, Value: string): Boolean;
|
|
||||||
begin
|
|
||||||
Result:=GetNode(Tree.FindHighest,Name,Value);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TOldStringToStringTree.GetNext(const Name: string; out NextName,
|
|
||||||
NextValue: string): Boolean;
|
|
||||||
var
|
|
||||||
Node: TAvgLvlTreeNode;
|
|
||||||
begin
|
|
||||||
Node:=FindNode(Name);
|
|
||||||
if Node<>nil then
|
|
||||||
Node:=Node.FindSuccessor;
|
|
||||||
Result:=GetNode(Node,NextName,NextValue);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TOldStringToStringTree.GetPrev(const Name: string; out PrevName,
|
|
||||||
PrevValue: string): Boolean;
|
|
||||||
var
|
|
||||||
Node: TAvgLvlTreeNode;
|
|
||||||
begin
|
|
||||||
Node:=FindNode(Name);
|
|
||||||
if Node<>nil then
|
|
||||||
Node:=Node.FindPrecessor;
|
|
||||||
Result:=GetNode(Node,PrevName,PrevValue);
|
|
||||||
end;
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
{ TPointerToPointerTree }
|
{ TPointerToPointerTree }
|
||||||
|
|
||||||
function TPointerToPointerTree.GetCount: SizeInt;
|
function TPointerToPointerTree.GetCount: SizeInt;
|
||||||
@ -2382,6 +2208,18 @@ begin
|
|||||||
Result:=GetNode(Node,PrevKey,PrevValue);
|
Result:=GetNode(Node,PrevKey,PrevValue);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TPointerToPointerTree.GetEnumerator: TPointerToPointerEnumerator;
|
||||||
|
begin
|
||||||
|
Result:=TPointerToPointerEnumerator.Create(Tree);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TPointerToPointerTree.
|
||||||
|
GetEnumeratorHighToLow: TPointerToPointerEnumerator;
|
||||||
|
begin
|
||||||
|
Result:=TPointerToPointerEnumerator.Create(Tree);
|
||||||
|
Result.fHighToLow:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TCustomStringMapEnumerator }
|
{ TCustomStringMapEnumerator }
|
||||||
|
|
||||||
constructor TCustomStringMapEnumerator.Create(Tree: TAvgLvlTree);
|
constructor TCustomStringMapEnumerator.Create(Tree: TAvgLvlTree);
|
||||||
|
Loading…
Reference in New Issue
Block a user