101
TStringToStringTreeItem = record
66
{ TMTAVLTreeNodeMemManager }
68
TMTAVLTreeNodeMemManager = class(TAVLTreeNodeMemManager)
70
procedure DisposeNode(ANode: TAVLTreeNode); override;
71
function NewNode: TAVLTreeNode; override;
74
{ TMTAVLTree - TAVLTree with a multithreaded node manager }
76
TMTAVLTree = class(TAVLTree)
78
fNodeManager: TAVLTreeNodeMemManager;
80
constructor Create(OnCompareMethod: TListSortCompare);
81
destructor Destroy; override;
86
TStringMapItem = record
105
PStringToStringTreeItem = ^TStringToStringTreeItem;
107
{ TStringToStringTree }
109
TStringToStringTree = class
89
PStringMapItem = ^TStringMapItem;
91
{ TStringMapEnumerator }
93
TStringMapEnumerator = class
96
FCurrent: TAVLTreeNode;
98
constructor Create(Tree: TAVLTree);
99
function MoveNext: boolean;
100
// "Current" is implemented by the descendant classes
111
107
FCompareKeyItemFunc: TListSortCompare;
112
FTree: TAVLTree;// tree of PStringToStringTreeItem
108
FTree: TAVLTree;// tree of PStringMapItem
113
109
FCaseSensitive: boolean;
114
110
function GetCompareItemsFunc: TListSortCompare;
115
function GetStrings(const s: string): string;
116
procedure SetStrings(const s: string; const AValue: string);
117
function FindNode(const s: string): TAVLTreeNode;
112
procedure DisposeItem(p: PStringMapItem); virtual;
113
function ItemsAreEqual(p1, p2: PStringMapItem): boolean; virtual;
114
function CreateCopy(Src: PStringMapItem): PStringMapItem; virtual;
119
116
constructor Create(TheCaseSensitive: boolean);
120
117
destructor Destroy; override;
118
procedure Clear; virtual;
122
119
function Contains(const s: string): boolean;
123
function GetString(const Name: string; out Value: string): boolean;
124
procedure Add(const Name, Value: string);
120
function ContainsIdentifier(P: PChar): boolean;
121
function FindNodeWithIdentifierAsPrefix(P: PChar): TAVLTreeNode;
125
122
procedure GetNames(List: TStrings);
126
procedure Remove(const Name: string);
127
property Strings[const s: string]: string read GetStrings write SetStrings; default;
123
procedure Remove(const Name: string); virtual;
128
124
property CaseSensitive: boolean read FCaseSensitive;
129
property Tree: TAVLTree read FTree;
130
function AsText: string;
131
function Equals(OtherTree: TStringToStringTree): boolean; reintroduce;
132
procedure Assign(Source: TStringToStringTree);
133
procedure WriteDebugReport;
134
function CalcMemSize: PtrUint;
125
property Tree: TAVLTree read FTree; // tree of PStringMapItem
126
function Count: integer;
127
function FindNode(const s: string): TAVLTreeNode;
128
function Equals(OtherTree: TStringMap): boolean; reintroduce;
129
procedure Assign(Source: TStringMap); virtual;
130
procedure WriteDebugReport; virtual;
131
function CalcMemSize: PtrUint; virtual;
135
132
property CompareItemsFunc: TListSortCompare read GetCompareItemsFunc;
136
133
property CompareKeyItemFunc: TListSortCompare read FCompareKeyItemFunc;
137
134
procedure SetCompareFuncs(
138
135
const NewCompareItemsFunc, NewCompareKeyItemFunc: TListSortCompare);
138
TStringToStringTreeItem = record
142
PStringToStringTreeItem = ^TStringToStringTreeItem;
144
TStringToStringTree = class;
146
{ TStringToStringTreeEnumerator }
148
TStringToStringTreeEnumerator = class(TStringMapEnumerator)
150
function GetCurrent: PStringToStringTreeItem;
152
property Current: PStringToStringTreeItem read GetCurrent;
155
{ TStringToStringTree }
157
TStringToStringTree = class(TStringMap)
159
function GetStrings(const s: string): string;
160
procedure SetStrings(const s: string; const AValue: string);
162
procedure DisposeItem(p: PStringMapItem); override;
163
function ItemsAreEqual(p1, p2: PStringMapItem): boolean; override;
164
function CreateCopy(Src: PStringMapItem): PStringMapItem; override;
166
function GetString(const Name: string; out Value: string): boolean;
167
procedure Add(const Name, Value: string); virtual;
168
property Strings[const s: string]: string read GetStrings write SetStrings; default;
169
function AsText: string;
170
procedure WriteDebugReport; override;
171
function CalcMemSize: PtrUint; override;
172
function GetEnumerator: TStringToStringTreeEnumerator;
175
TStringToPointerTree = class;
177
TStringToPointerTreeItem = record
181
PStringToPointerTreeItem = ^TStringToPointerTreeItem;
183
{ TStringToPointerTreeEnumerator }
185
TStringToPointerTreeEnumerator = class(TStringMapEnumerator)
187
function GetCurrent: PStringToPointerTreeItem;
189
property Current: PStringToPointerTreeItem read GetCurrent;
192
{ TStringToPointerTree }
194
TStringToPointerTree = class(TStringMap)
196
FFreeValues: boolean;
197
function GetItems(const s: string): Pointer;
198
procedure SetItems(const s: string; AValue: Pointer);
200
procedure DisposeItem(p: PStringMapItem); override;
201
function ItemsAreEqual(p1, p2: PStringMapItem): boolean; override;
202
function CreateCopy(Src: PStringMapItem): PStringMapItem; override;
204
function GetItem(const Name: string; out Value: Pointer): boolean;
205
procedure Add(const Name: string; const Value: Pointer); virtual;
206
property Items[const s: string]: Pointer read GetItems write SetItems; default;
207
procedure Assign(Source: TStringMap); override;
208
function GetEnumerator: TStringToPointerTreeEnumerator;
209
property FreeValues: boolean read FFreeValues write FFreeValues;
141
212
{ TFilenameToStringTree }
143
214
TFilenameToStringTree = class(TStringToStringTree)
145
constructor Create(CaseInsensitive: boolean);
216
constructor Create(CaseInsensitive: boolean); // false = system default
219
{ TFilenameToPointerTree }
221
TFilenameToPointerTree = class(TStringToPointerTree)
223
constructor Create(CaseInsensitive: boolean); // false = system default
228
{ TStringTreeEnumerator }
230
TStringTreeEnumerator = class
233
FCurrent: TAVLTreeNode;
234
function GetCurrent: string;
236
constructor Create(Tree: TStringTree);
237
function MoveNext: boolean;
238
property Current: string read GetCurrent;
215
321
Result:=CompareStr(String(Key),PStringToStringTreeItem(Data)^.Name);
324
function CompareIdentifierAndStringToStringTreeItem(Identifier, Data: Pointer
327
Id: PChar absolute Identifier;
328
Item: PStringToStringTreeItem absolute Data;
332
Result:=-CompareIdentifiersCaseSensitive(Id,PChar(Item^.Name));
333
if Result=0 then begin
334
IdLen:=GetIdentLen(Id);
335
ItemLen:=length(Item^.Name);
336
if IdLen=Itemlen then
338
else if IdLen>ItemLen then
345
function CompareIdentifierPrefixAndStringToStringTreeItem(Identifier,
346
Data: Pointer): integer;
348
Id: PChar absolute Identifier;
349
Item: PStringToStringTreeItem absolute Data;
351
Result:=-CompareIdentifiersCaseSensitive(Id,PChar(Item^.Name));
218
354
function CompareStringAndStringToStringTreeItemI(Key, Data: Pointer): integer;
220
356
Result:=CompareText(String(Key),PStringToStringTreeItem(Data)^.Name);
359
function CompareIdentifierAndStringToStringTreeItemI(Identifier, Data: Pointer
362
Id: PChar absolute Identifier;
363
Item: PStringToStringTreeItem absolute Data;
367
Result:=-CompareIdentifiers(Id,PChar(Item^.Name));
368
if Result=0 then begin
369
IdLen:=GetIdentLen(Id);
370
ItemLen:=length(Item^.Name);
371
if IdLen=Itemlen then
373
else if IdLen>ItemLen then
380
function CompareIdentifierPrefixAndStringToStringTreeItemI(Identifier,
381
Data: Pointer): integer;
383
Id: PChar absolute Identifier;
384
Item: PStringToStringTreeItem absolute Data;
386
Result:=-CompareIdentifiers(Id,PChar(Item^.Name));
223
389
function CompareFilenameAndFilenameToStringTreeItem(Key, Data: Pointer
244
410
Result:=CompareStr(AnsiString(Data1),AnsiString(Data2));
249
function TCodeXYPositions.GetItems(Index: integer): PCodeXYPosition;
251
Result:=PCodeXYPosition(FItems[Index]);
254
function TCodeXYPositions.GetCaretsXY(Index: integer): TPoint;
256
Item: PCodeXYPosition;
259
Result:=Point(Item^.X,Item^.Y);
262
function TCodeXYPositions.GetCodes(Index: integer): TCodeBuffer;
264
Item: PCodeXYPosition;
270
procedure TCodeXYPositions.SetCaretsXY(Index: integer; const AValue: TPoint);
272
Item: PCodeXYPosition;
279
procedure TCodeXYPositions.SetCodes(Index: integer; const AValue: TCodeBuffer);
281
Item: PCodeXYPosition;
287
procedure TCodeXYPositions.SetItems(Index: integer;
288
const AValue: PCodeXYPosition);
290
FItems[Index]:=AValue;
293
constructor TCodeXYPositions.Create;
298
destructor TCodeXYPositions.Destroy;
413
function AVLFindPointer(Tree: TAVLTree; Data: Pointer): TAVLTreeNode;
415
{$IFDEF EnableAVLFindPointerFix}
416
Result:=Tree.FindLeftMost(Data);
417
while (Result<>nil) do begin
418
if Result.Data=Data then break;
419
Result:=Tree.FindSuccessor(Result);
420
if Result=nil then exit;
421
if Tree.OnCompare(Data,Result.Data)<>0 then exit(nil);
424
Result:=Tree.FindPointer(Data);
428
procedure AVLRemovePointer(Tree: TAVLTree; Data: Pointer);
429
{$IFDEF EnableAVLFindPointerFix}
434
{$IFDEF EnableAVLFindPointerFix}
435
Node:=AVLFindPointer(Tree,Data);
439
Tree.RemovePointer(Data);
445
constructor TMTAVLTree.Create(OnCompareMethod: TListSortCompare);
447
inherited Create(OnCompareMethod);
448
fNodeManager:=TMTAVLTreeNodeMemManager.Create;
449
SetNodeManager(fNodeManager);
452
destructor TMTAVLTree.Destroy;
303
454
inherited Destroy;
306
procedure TCodeXYPositions.Clear;
309
Item: PCodeXYPosition;
311
if FItems<>nil then begin
312
for i:=0 to FItems.Count-1 do begin
455
FreeAndNil(fNodeManager);
458
{ TMTAVLTreeNodeMemManager }
460
procedure TMTAVLTreeNodeMemManager.DisposeNode(ANode: TAVLTreeNode);
465
function TMTAVLTreeNodeMemManager.NewNode: TAVLTreeNode;
467
Result:=TAVLTreeNode.Create;
470
{ TFilenameToPointerTree }
472
constructor TFilenameToPointerTree.Create(CaseInsensitive: boolean);
474
inherited Create(true);
475
if CaseInsensitive then
476
SetCompareFuncs(@CompareFilenameToStringItemsI,
477
@CompareFilenameAndFilenameToStringTreeItemI)
479
SetCompareFuncs(@CompareFilenameToStringItems,
480
@CompareFilenameAndFilenameToStringTreeItem);
483
{ TStringToPointerTree }
485
function TStringToPointerTree.GetItems(const s: string): Pointer;
491
Result:=PStringToPointerTreeItem(Node.Data)^.Value
496
procedure TStringToPointerTree.SetItems(const s: string; AValue: Pointer);
499
NewItem: PStringToPointerTreeItem;
502
if Node<>nil then begin
503
NewItem:=PStringToPointerTreeItem(Node.Data);
505
TObject(NewItem^.Value).Free;
506
NewItem^.Value:=AValue;
510
NewItem^.Value:=AValue;
320
function TCodeXYPositions.Add(const Position: TCodeXYPosition): integer;
322
NewItem: PCodeXYPosition;
515
procedure TStringToPointerTree.DisposeItem(p: PStringMapItem);
517
Item: PStringToPointerTreeItem absolute p;
520
TObject(Item^.Value).Free;
524
function TStringToPointerTree.ItemsAreEqual(p1, p2: PStringMapItem): boolean;
526
Item1: PStringToPointerTreeItem absolute p1;
527
Item2: PStringToPointerTreeItem absolute p2;
529
Result:=(Item1^.Name=Item2^.Name)
530
and (Item1^.Value=Item2^.Value);
533
function TStringToPointerTree.CreateCopy(Src: PStringMapItem): PStringMapItem;
535
SrcItem: PStringToPointerTreeItem absolute Src;
536
NewItem: PStringToPointerTreeItem;
326
if FItems=nil then FItems:=TFPList.Create;
327
Result:=FItems.Add(NewItem);
330
function TCodeXYPositions.Add(X, Y: integer; Code: TCodeBuffer): integer;
332
NewItem: TCodeXYPosition;
337
Result:=Add(NewItem);
340
procedure TCodeXYPositions.Assign(Source: TCodeXYPositions);
344
if IsEqual(Source) then exit;
346
for i:=0 to Source.Count-1 do
350
function TCodeXYPositions.IsEqual(Source: TCodeXYPositions): boolean;
352
SrcItem: TCodeXYPosition;
353
CurItem: TCodeXYPosition;
358
else if (Source=nil) or (Source.Count<>Count) then
361
for i:=0 to Count-1 do begin
364
if (SrcItem.X<>CurItem.X)
365
or (SrcItem.Y<>CurItem.Y)
366
or (SrcItem.Code<>CurItem.Code)
539
NewItem^.Name:=SrcItem^.Name;
540
NewItem^.Value:=SrcItem^.Value;
541
Result:=PStringMapItem(NewItem);
544
function TStringToPointerTree.GetItem(const Name: string; out Value: Pointer
549
Node:=FindNode(Name);
550
if Node<>nil then begin
551
Value:=PStringToPointerTreeItem(Node.Data)^.Value;
376
function TCodeXYPositions.Count: integer;
384
procedure TCodeXYPositions.Delete(Index: integer);
386
Item: PCodeXYPosition;
390
FItems.Delete(Index);
393
function TCodeXYPositions.CreateCopy: TCodeXYPositions;
395
Result:=TCodeXYPositions.Create;
399
function TCodeXYPositions.CalcMemSize: PtrUint;
401
Result:=PtrUInt(InstanceSize);
403
inc(Result,PtrUInt(FItems.InstanceSize)
404
+PtrUInt(FItems.Capacity)*SizeOf(TCodeXYPosition));
407
{ TStringToStringTree }
409
function TStringToStringTree.GetStrings(const s: string): string;
558
procedure TStringToPointerTree.Add(const Name: string; const Value: Pointer);
563
procedure TStringToPointerTree.Assign(Source: TStringMap);
411
565
Node: TAVLTreeNode;
415
Result:=PStringToStringTreeItem(Node.Data)^.Value
566
Item: PStringToPointerTreeItem;
568
if (Source=nil) or (Source.ClassType<>ClassType) then
569
raise Exception.Create('invalid class');
571
Node:=Source.Tree.FindLowest;
572
while Node<>nil do begin
573
Item:=PStringToPointerTreeItem(Node.Data);
574
Items[Item^.Name]:=Item^.Value;
575
Node:=Source.Tree.FindSuccessor(Node);
579
function TStringToPointerTree.GetEnumerator: TStringToPointerTreeEnumerator;
581
Result:=TStringToPointerTreeEnumerator.Create(FTree);
584
{ TStringMapEnumerator }
586
constructor TStringMapEnumerator.Create(Tree: TAVLTree);
591
function TStringMapEnumerator.MoveNext: boolean;
594
FCurrent:=FTree.FindLowest
420
function TStringToStringTree.GetCompareItemsFunc: TListSortCompare;
596
FCurrent:=FTree.FindSuccessor(FCurrent);
597
Result:=FCurrent<>nil;
600
{ TStringToPointerTreeEnumerator }
602
function TStringToPointerTreeEnumerator.GetCurrent: PStringToPointerTreeItem;
604
Result:=PStringToPointerTreeItem(FCurrent.Data);
609
function TStringMap.GetCompareItemsFunc: TListSortCompare;
422
611
Result:=Tree.OnCompare;
425
procedure TStringToStringTree.SetStrings(const s: string; const AValue: string);
428
NewItem: PStringToStringTreeItem;
431
if Node<>nil then begin
432
PStringToStringTreeItem(Node.Data)^.Value:=AValue;
436
NewItem^.Value:=AValue;
441
function TStringToStringTree.FindNode(const s: string): TAVLTreeNode;
443
Result:=FTree.FindKey(Pointer(s),FCompareKeyItemFunc)
446
constructor TStringToStringTree.Create(TheCaseSensitive: boolean);
614
function TStringMap.FindNode(const s: string): TAVLTreeNode;
616
Result:=FTree.FindKey(Pointer(s),FCompareKeyItemFunc);
619
procedure TStringMap.DisposeItem(p: PStringMapItem);
624
function TStringMap.ItemsAreEqual(p1, p2: PStringMapItem): boolean;
626
Result:=p1^.Name=p2^.Name;
629
function TStringMap.CreateCopy(Src: PStringMapItem): PStringMapItem;
632
Result^.Name:=Src^.Name;
635
constructor TStringMap.Create(TheCaseSensitive: boolean);
448
637
FCaseSensitive:=TheCaseSensitive;
449
638
if CaseSensitive then begin
450
639
FCompareKeyItemFunc:=@CompareStringAndStringToStringTreeItem;
451
FTree:=TAVLTree.Create(@CompareStringToStringItems);
640
FTree:=TMTAVLTree.Create(@CompareStringToStringItems);
453
642
FCompareKeyItemFunc:=@CompareStringAndStringToStringTreeItemI;
454
FTree:=TAVLTree.Create(@CompareStringToStringItemsI);
643
FTree:=TMTAVLTree.Create(@CompareStringToStringItemsI);
458
destructor TStringToStringTree.Destroy;
647
destructor TStringMap.Destroy;
463
652
inherited Destroy;
466
procedure TStringToStringTree.Clear;
655
procedure TStringMap.Clear;
468
657
Node: TAVLTreeNode;
469
Item: PStringToStringTreeItem;
471
659
Node:=FTree.FindLowest;
472
660
while Node<>nil do begin
473
Item:=PStringToStringTreeItem(Node.Data);
661
DisposeItem(PStringMapItem(Node.Data));
475
662
Node:=FTree.FindSuccessor(Node);
480
function TStringToStringTree.Contains(const s: string): boolean;
667
function TStringMap.Contains(const s: string): boolean;
482
669
Result:=FindNode(s)<>nil;
485
function TStringToStringTree.GetString(const Name: string; out Value: string
490
Node:=FindNode(Name);
491
if Node<>nil then begin
492
Value:=PStringToStringTreeItem(Node.Data)^.Value;
499
procedure TStringToStringTree.Add(const Name, Value: string);
501
Strings[Name]:=Value;
504
procedure TStringToStringTree.GetNames(List: TStrings);
507
Item: PStringToStringTreeItem;
672
function TStringMap.ContainsIdentifier(P: PChar): boolean;
674
if CaseSensitive then
675
Result:=FTree.FindKey(p,@CompareIdentifierAndStringToStringTreeItem)<>nil
677
Result:=FTree.FindKey(p,@CompareIdentifierAndStringToStringTreeItemI)<>nil;
680
function TStringMap.FindNodeWithIdentifierAsPrefix(P: PChar): TAVLTreeNode;
682
if CaseSensitive then
683
Result:=FTree.FindKey(p,@CompareIdentifierPrefixAndStringToStringTreeItem)
685
Result:=FTree.FindKey(p,@CompareIdentifierPrefixAndStringToStringTreeItemI);
688
procedure TStringMap.GetNames(List: TStrings);
691
Item: PStringMapItem;
509
693
Node:=Tree.FindLowest;
510
694
while Node<>nil do begin
511
Item:=PStringToStringTreeItem(Node.Data);
695
Item:=PStringMapItem(Node.Data);
512
696
List.Add(Item^.Name);
513
697
Node:=Tree.FindSuccessor(Node);
517
procedure TStringToStringTree.Remove(const Name: string);
701
procedure TStringMap.Remove(const Name: string);
519
703
Node: TAVLTreeNode;
520
Item: PStringToStringTreeItem;
704
Item: PStringMapItem;
522
706
Node:=FindNode(Name);
523
707
if Node<>nil then begin
524
Item:=PStringToStringTreeItem(Node.Data);
708
Item:=PStringMapItem(Node.Data);
525
709
FTree.Delete(Node);
530
function TStringToStringTree.AsText: string;
533
Item: PStringToStringTreeItem;
714
function TStringMap.Count: integer;
536
Node:=Tree.FindLowest;
537
while Node<>nil do begin
538
Item:=PStringToStringTreeItem(Node.Data);
539
Result:=Result+Item^.Name+'='+Item^.Value+LineEnding;
540
Node:=Tree.FindSuccessor(Node);
544
function TStringToStringTree.Equals(OtherTree: TStringToStringTree): boolean;
719
function TStringMap.Equals(OtherTree: TStringMap): boolean;
546
721
Node: TAVLTreeNode;
547
722
OtherNode: TAVLTreeNode;
548
OtherItem: PStringToStringTreeItem;
549
Item: PStringToStringTreeItem;
723
OtherItem: PStringMapItem;
724
Item: PStringMapItem;
552
if OtherTree=nil then exit;
727
if (OtherTree=nil) or (OtherTree.ClassType<>ClassType) then exit;
553
728
if Tree.Count<>OtherTree.Tree.Count then exit;
554
729
Node:=Tree.FindLowest;
555
730
OtherNode:=OtherTree.Tree.FindLowest;
556
731
while Node<>nil do begin
557
732
if OtherNode=nil then exit;
558
Item:=PStringToStringTreeItem(Node.Data);
559
OtherItem:=PStringToStringTreeItem(OtherNode.Data);
560
if (Item^.Name<>OtherItem^.Name)
561
or (Item^.Value<>OtherItem^.Value) then exit;
733
Item:=PStringMapItem(Node.Data);
734
OtherItem:=PStringMapItem(OtherNode.Data);
735
if not ItemsAreEqual(Item,OtherItem) then exit;
562
736
OtherNode:=OtherTree.Tree.FindSuccessor(OtherNode);
563
737
Node:=Tree.FindSuccessor(Node);
569
procedure TStringToStringTree.Assign(Source: TStringToStringTree);
743
procedure TStringMap.Assign(Source: TStringMap);
745
SrcNode: TAVLTreeNode;
746
SrcItem: PStringMapItem;
748
if (Source=nil) or (Source.ClassType<>ClassType) then
749
raise Exception.Create('invalid class');
751
SrcNode:=Source.Tree.FindLowest;
752
while SrcNode<>nil do begin
753
SrcItem:=PStringMapItem(SrcNode.Data);
754
Tree.Add(CreateCopy(SrcItem));
755
SrcNode:=Source.Tree.FindSuccessor(SrcNode);
759
procedure TStringMap.WriteDebugReport;
762
Item: PStringMapItem;
764
DebugLn(['TStringMap.WriteDebugReport ',Tree.Count]);
765
Node:=Tree.FindLowest;
766
while Node<>nil do begin
767
Item:=PStringMapItem(Node.Data);
768
DebugLn([Item^.Name]);
769
Node:=Tree.FindSuccessor(Node);
773
function TStringMap.CalcMemSize: PtrUint;
776
Item: PStringMapItem;
778
Result:=PtrUInt(InstanceSize)
779
+PtrUInt(FTree.InstanceSize)
780
+PtrUint(FTree.Count)*SizeOf(TAVLTreeNode);
781
Node:=FTree.FindLowest;
782
while Node<>nil do begin
783
Item:=PStringMapItem(Node.Data);
784
inc(Result,MemSizeString(Item^.Name)
785
+SizeOf(TStringMapItem));
786
Node:=FTree.FindSuccessor(Node);
790
procedure TStringMap.SetCompareFuncs(const NewCompareItemsFunc,
791
NewCompareKeyItemFunc: TListSortCompare);
793
FCompareKeyItemFunc:=NewCompareKeyItemFunc;
794
Tree.OnCompare:=NewCompareItemsFunc;
797
{ TStringToStringTreeEnumerator }
799
function TStringToStringTreeEnumerator.GetCurrent: PStringToStringTreeItem;
801
Result:=PStringToStringTreeItem(FCurrent.Data);
804
{ TStringTreeEnumerator }
806
function TStringTreeEnumerator.GetCurrent: string;
808
Result:=AnsiString(FCurrent.Data);
811
constructor TStringTreeEnumerator.Create(Tree: TStringTree);
816
function TStringTreeEnumerator.MoveNext: boolean;
819
FCurrent:=FTree.Tree.FindLowest
821
FCurrent:=FTree.Tree.FindSuccessor(FCurrent);
822
Result:=FCurrent<>nil;
825
{ TStringToStringTree }
827
function TStringToStringTree.GetStrings(const s: string): string;
833
Result:=PStringToStringTreeItem(Node.Data)^.Value
838
procedure TStringToStringTree.SetStrings(const s: string; const AValue: string);
841
NewItem: PStringToStringTreeItem;
844
if Node<>nil then begin
845
PStringToStringTreeItem(Node.Data)^.Value:=AValue;
849
NewItem^.Value:=AValue;
854
procedure TStringToStringTree.DisposeItem(p: PStringMapItem);
856
Item: PStringToStringTreeItem absolute p;
861
function TStringToStringTree.ItemsAreEqual(p1, p2: PStringMapItem): boolean;
863
Item1: PStringToStringTreeItem absolute p1;
864
Item2: PStringToStringTreeItem absolute p2;
866
Result:=(Item1^.Name=Item2^.Name)
867
and (Item1^.Value=Item2^.Value);
870
function TStringToStringTree.CreateCopy(Src: PStringMapItem): PStringMapItem;
872
SrcItem: PStringToStringTreeItem absolute Src;
873
NewItem: PStringToStringTreeItem;
876
NewItem^.Name:=SrcItem^.Name;
877
NewItem^.Value:=SrcItem^.Value;
878
Result:=PStringMapItem(NewItem);
881
function TStringToStringTree.GetString(const Name: string; out Value: string
886
Node:=FindNode(Name);
887
if Node<>nil then begin
888
Value:=PStringToStringTreeItem(Node.Data)^.Value;
895
procedure TStringToStringTree.Add(const Name, Value: string);
897
Strings[Name]:=Value;
900
function TStringToStringTree.AsText: string;
571
902
Node: TAVLTreeNode;
572
903
Item: PStringToStringTreeItem;
575
Node:=Source.Tree.FindLowest;
906
Node:=Tree.FindLowest;
576
907
while Node<>nil do begin
577
908
Item:=PStringToStringTreeItem(Node.Data);
578
Strings[Item^.Name]:=Item^.Value;
579
Node:=Source.Tree.FindSuccessor(Node);
909
Result:=Result+Item^.Name+'='+Item^.Value+LineEnding;
910
Node:=Tree.FindSuccessor(Node);