mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-15 06:59:21 +02:00
LCL: TTextStrings: optimized AddStrings
git-svn-id: trunk@42031 -
This commit is contained in:
parent
a4c14f88b5
commit
4d29b334e5
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user