LCL: TTextStrings: optimized AddStrings

git-svn-id: trunk@42031 -
This commit is contained in:
mattias 2013-07-08 20:56:10 +00:00
parent a4c14f88b5
commit 4d29b334e5

View File

@ -35,6 +35,7 @@ type
Line: string; // cached line as string Line: string; // cached line as string
TheObject: TObject; // user data TheObject: TObject; // user data
end; end;
PTextLineRange = ^TTextLineRange;
TTextStrings = class(TStrings) TTextStrings = class(TStrings)
private private
@ -44,7 +45,7 @@ type
FArraysValid: boolean; FArraysValid: boolean;
FLineCount: integer; FLineCount: integer;
FLineCapacity: integer; FLineCapacity: integer;
FLineRanges: ^TTextLineRange;// array of TTextLineRange FLineRanges: PTextLineRange;// array of TTextLineRange
FText: string; FText: string;
FUpdateCount: integer; FUpdateCount: integer;
FChangedWhileUpdate: boolean; FChangedWhileUpdate: boolean;
@ -61,7 +62,6 @@ type
procedure PutObject(Index: Integer; AnObject: TObject); override; procedure PutObject(Index: Integer; AnObject: TObject); override;
function GetLineLen(Index: integer; IncludeNewLineChars: boolean): integer; inline; function GetLineLen(Index: integer; IncludeNewLineChars: boolean): integer; inline;
function GetLineEnd(Index: integer; IncludeNewLineChars: boolean): integer; function GetLineEnd(Index: integer; IncludeNewLineChars: boolean): integer;
function HasObjects: boolean;
function CountLineEndings(const s: string): integer; function CountLineEndings(const s: string): integer;
public public
constructor Create; constructor Create;
@ -169,16 +169,18 @@ begin
end; end;
function TTextStrings.Get(Index: Integer): string; function TTextStrings.Get(Index: Integer): string;
var
Line: PTextLineRange;
begin begin
if not FArraysValid then BuildArrays; if not FArraysValid then BuildArrays;
if (Index<0) or (Index>=FLineCount) then if (Index<0) or (Index>=FLineCount) then
Error(rsListIndexExceedsBounds, Index); Error(rsListIndexExceedsBounds, Index);
if (FLineRanges[Index].Line='') Line:=@FLineRanges[Index];
and (FLineRanges[Index].StartPos<FLineRanges[Index].EndPos) then begin if (Line^.Line='')
FLineRanges[Index].Line:=copy(FText,FLineRanges[Index].StartPos, and (Line^.StartPos<Line^.EndPos) then begin
FLineRanges[Index].EndPos-FLineRanges[Index].StartPos); Line^.Line:=copy(FText,Line^.StartPos,Line^.EndPos-Line^.StartPos);
end; end;
Result:=FLineRanges[Index].Line; Result:=Line^.Line;
end; end;
procedure TTextStrings.ClearArrays; procedure TTextStrings.ClearArrays;
@ -275,17 +277,6 @@ begin
Result:=FLineRanges[Index+1].StartPos; Result:=FLineRanges[Index+1].StartPos;
end; end;
function TTextStrings.HasObjects: boolean;
var
i: Integer;
begin
if FArraysValid then
for i:=0 to FLineCount-1 do
if FLineRanges[i].TheObject<>nil then
exit(true);
Result:=false;
end;
function TTextStrings.CountLineEndings(const s: string): integer; function TTextStrings.CountLineEndings(const s: string): integer;
var var
p: Integer; p: Integer;
@ -691,40 +682,22 @@ begin
end; end;
procedure TTextStrings.AddStrings(TheStrings: TStrings); procedure TTextStrings.AddStrings(TheStrings: TStrings);
function MustAddObjects: boolean;
var
i: Integer;
begin
if HasObjects then exit(true);
if TheStrings is TTextStrings then
Result:=TTextStrings(TheStrings).HasObjects
else
begin
for i:=0 to TheStrings.Count-1 do
if TheStrings.Objects[i]<>nil then
exit(true);
Result:=false;
end;
end;
var var
s: String; s: String;
i: Integer; i: Integer;
OldCount: Integer;
begin begin
if TheStrings.Count=0 then exit; if TheStrings.Count=0 then exit;
if MustAddObjects then OldCount:=Count;
begin if (FText<>'') and (not (FText[length(FText)] in [#10,#13])) then
for i:=0 to TheStrings.Count-1 do s:=LineEnding
AddObject(TheStrings[i],TheStrings.Objects[i]); else
end else begin s:='';
if (FText<>'') and (not (FText[length(FText)] in [#10,#13])) then FArraysValid:=false;
s:=LineEnding FText:=FText+s+TheStrings.Text;
else BuildArrays;
s:=''; for i:=0 to TheStrings.Count-1 do
FArraysValid:=false; FLineRanges[i+OldCount].TheObject:=TheStrings.Objects[i];
FText:=FText+s+TheStrings.Text;
end;
end; end;
end. end.