* SAX cleanup: removed {$ifdef UseDynArrays}, left variant without dynarrays, they don't provide any significant advantage.

* Changed TList to TFPList, removed redundant FLength field.

git-svn-id: trunk@20879 -
This commit is contained in:
sergei 2012-04-14 22:44:45 +00:00
parent f0b7ce8afe
commit 86f0a4177d

View File

@ -77,27 +77,18 @@ type
AttrType: String;
end;
{$IFNDEF UseDynArrays}
PSAXAttributeData = ^TSAXAttributeData;
{$ENDIF}
TSAXAttributes = class
protected
FLength: Integer;
{$IFDEF UseDynArrays}
Data: array of TSAXAttributeData;
{$ELSE}
FData: TList;
FData: TFPList;
function GetData(Index: Integer): PSAXAttributeData;
property Data[Index:Integer]: PSAXAttributeData read GetData;
{$ENDIF}
procedure BadIndex(Index: Integer);
public
constructor Create; overload;
constructor Create(Atts: TSAXAttributes); overload;
{$IFNDEF UseDynArrays}
destructor Destroy; override;
{$ENDIF}
function GetIndex(const QName: SAXString): Integer; overload;
function GetIndex(const URI, LocalPart: SAXString): Integer; overload;
@ -313,33 +304,27 @@ end;
constructor TSAXAttributes.Create;
begin
inherited Create;
{$IFNDEF UseDynArrays}
FData := TList.Create;
{$ENDIF}
FData := TFPList.Create;
end;
constructor TSAXAttributes.Create(Atts: TSAXAttributes);
begin
inherited Create;
{$IFNDEF UseDynArrays}
FData := TList.Create;
{$ENDIF}
FData := TFPList.Create;
SetAttributes(Atts);
end;
{$IFNDEF UseDynArrays}
destructor TSAXAttributes.Destroy;
begin
Clear;
FData.Free;
inherited Destroy;
end;
{$ENDIF}
function TSAXAttributes.GetIndex(const QName: SAXString): Integer;
begin
Result := 0;
while Result < FLength do
while Result < FData.Count do
begin
if Data[Result]^.QName = QName then
exit;
@ -351,7 +336,7 @@ end;
function TSAXAttributes.GetIndex(const URI, LocalPart: SAXString): Integer;
begin
Result := 0;
while Result < FLength do
while Result < FData.Count do
begin
if (Data[Result]^.URI = URI) and (Data[Result]^.LocalName = LocalPart) then
exit;
@ -362,12 +347,12 @@ end;
function TSAXAttributes.GetLength: Integer;
begin
Result := FLength;
Result := FData.Count;
end;
function TSAXAttributes.GetLocalName(Index: Integer): SAXString;
begin
if (Index >= 0) and (Index < FLength) then
if (Index >= 0) and (Index < FData.Count) then
Result := Data[Index]^.LocalName
else
SetLength(Result, 0);
@ -375,7 +360,7 @@ end;
function TSAXAttributes.GetQName(Index: Integer): SAXString;
begin
if (Index >= 0) and (Index < FLength) then
if (Index >= 0) and (Index < FData.Count) then
Result := Data[Index]^.QName
else
SetLength(Result, 0);
@ -383,7 +368,7 @@ end;
function TSAXAttributes.GetType(Index: Integer): String;
begin
if (Index >= 0) and (Index < FLength) then
if (Index >= 0) and (Index < FData.Count) then
Result := Data[Index]^.AttrType
else
SetLength(Result, 0);
@ -393,7 +378,7 @@ function TSAXAttributes.GetType(const QName: SAXString): String;
var
i: Integer;
begin
for i := 0 to FLength - 1 do
for i := 0 to FData.Count - 1 do
if Data[i]^.QName = QName then
begin
Result := Data[i]^.AttrType;
@ -406,7 +391,7 @@ function TSAXAttributes.GetType(const URI, LocalName: SAXString): String;
var
i: Integer;
begin
for i := 0 to FLength - 1 do
for i := 0 to FData.Count - 1 do
if (Data[i]^.URI = URI) and (Data[i]^.LocalName = LocalName) then
begin
Result := Data[i]^.AttrType;
@ -417,15 +402,15 @@ end;
function TSAXAttributes.GetURI(Index: Integer): SAXString;
begin
if (Index >= 0) and (Index < FLength) then
Result := Data[Index * 5]^.URI
if (Index >= 0) and (Index < FData.Count) then
Result := Data[Index]^.URI
else
SetLength(Result, 0);
end;
function TSAXAttributes.GetValue(Index: Integer): SAXString;
begin
if (Index >= 0) and (Index < FLength) then
if (Index >= 0) and (Index < FData.Count) then
Result := Data[Index]^.Value
else
SetLength(Result, 0);
@ -435,7 +420,7 @@ function TSAXAttributes.GetValue(const QName: SAXString): SAXString;
var
i: Integer;
begin
for i := 0 to FLength - 1 do
for i := 0 to FData.Count - 1 do
if Data[i]^.QName = QName then
begin
Result := Data[i]^.Value;
@ -448,7 +433,7 @@ function TSAXAttributes.GetValue(const URI, LocalName: SAXString): SAXString;
var
i: Integer;
begin
for i := 0 to FLength - 1 do
for i := 0 to FData.Count - 1 do
if (Data[i]^.URI = URI) and (Data[i]^.LocalName = LocalName) then
begin
Result := Data[i]^.Value;
@ -458,39 +443,20 @@ begin
end;
procedure TSAXAttributes.Clear;
{$IFDEF UseDynArrays}
begin
SetLength(Data, 0);
end;
{$ELSE}
var
i: Integer;
p: PSAXAttributeData;
begin
for i := 0 to FData.Count - 1 do
begin
p := PSAXAttributeData(FData[i]);
Dispose(p);
end;
Dispose(PSAXAttributeData(FData[i]));
end;
{$ENDIF}
procedure TSAXAttributes.SetAttributes(Atts: TSAXAttributes);
var
i: Integer;
begin
FLength := Atts.Length;
{$IFDEF UseDynArrays}
SetLength(Data, FLength);
{$ELSE}
FData.Count := FLength;
{$ENDIF}
for i := 0 to FLength - 1 do
{$IFDEF UseDynArrays}
with Data[i] do
{$ELSE}
FData.Count := Atts.Length;
for i := 0 to FData.Count - 1 do
with Data[i]^ do
{$ENDIF}
begin
URI := Atts.URIs[i];
LocalName := Atts.LocalNames[i];
@ -502,42 +468,24 @@ end;
procedure TSAXAttributes.AddAttribute(const AURI, ALocalName, AQName: SAXString;
const AType: String; const AValue: SAXString);
{$IFNDEF UseDynArrays}
var
p: PSAXAttributeData;
{$ENDIF}
begin
Inc(FLength);
{$IFDEF UseDynArrays}
SetLength(Data, FLength);
{$ELSE}
New(p);
FData.Add(p);
{$ENDIF}
{$IFDEF UseDynArrays}
with Data[FLength - 1] do
{$ELSE}
with Data[FLength - 1]^ do
{$ENDIF}
begin
URI := AURI;
LocalName := ALocalName;
QName := AQName;
AttrType := AType;
Value := AValue;
end;
p^.URI := AURI;
p^.LocalName := ALocalName;
p^.QName := AQName;
p^.AttrType := AType;
p^.Value := AValue;
end;
procedure TSAXAttributes.SetAttribute(Index: Integer;
const AURI, ALocalName, AQName: SAXString; const AType: String;
const AValue: SAXString);
begin
if (Index >= 0) and (Index < FLength) then
{$IFDEF UseDynArrays}
with Data[Index] do
{$ELSE}
if (Index >= 0) and (Index < FData.Count) then
with Data[Index]^ do
{$ENDIF}
begin
URI := AURI;
LocalName := ALocalName;
@ -550,29 +498,17 @@ begin
end;
procedure TSAXAttributes.RemoveAttribute(Index: Integer);
{$IFDEF UseDynArrays}
var
i: Integer;
{$ENDIF}
begin
if (Index >= 0) and (Index < FLength) then
if (Index >= 0) and (Index < FData.Count) then
begin
{$IFDEF UseDynArrays}
for i := Index to FLength - 1 do
Data[i] := Data[i + 1];
Dec(FLength);
SetLength(Data, FLength);
{$ELSE}
FData.Delete(Index);
Dec(FLength);
{$ENDIF}
end else
BadIndex(Index);
end;
procedure TSAXAttributes.SetURI(Index: Integer; const AURI: SAXString);
begin
if (Index >= 0) and (Index < FLength) then
if (Index >= 0) and (Index < FData.Count) then
Data[Index]^.URI := AURI
else
BadIndex(Index);
@ -581,7 +517,7 @@ end;
procedure TSAXAttributes.SetLocalName(Index: Integer;
const ALocalName: SAXString);
begin
if (Index >= 0) and (Index < FLength) then
if (Index >= 0) and (Index < FData.Count) then
Data[Index]^.LocalName := ALocalName
else
BadIndex(Index);
@ -589,7 +525,7 @@ end;
procedure TSAXAttributes.SetQName(Index: Integer; const AQName: SAXString);
begin
if (Index >= 0) and (Index < FLength) then
if (Index >= 0) and (Index < FData.Count) then
Data[Index]^.QName := AQName
else
BadIndex(Index);
@ -597,7 +533,7 @@ end;
procedure TSAXAttributes.SetType(Index: Integer; const AType: String);
begin
if (Index >= 0) and (Index < FLength) then
if (Index >= 0) and (Index < FData.Count) then
Data[Index]^.AttrType := AType
else
BadIndex(Index);
@ -605,18 +541,16 @@ end;
procedure TSAXAttributes.SetValue(Index: Integer; const AValue: SAXString);
begin
if (Index >= 0) and (Index < FLength) then
if (Index >= 0) and (Index < FData.Count) then
Data[Index]^.Value := AValue
else
BadIndex(Index);
end;
{$IFNDEF UseDynArrays}
function TSAXAttributes.GetData(Index: Integer): PSAXAttributeData;
begin
Result := PSAXAttributeData(FData[Index]);
end;
{$ENDIF}
procedure TSAXAttributes.BadIndex(Index: Integer);
begin