+ introduced TFPList.IndexOfItem and TFPObjectList.IndexOfItem, which are like

IndexOf, but can also search backwards. The same method already exists in
  FPC's classes unit.

git-svn-id: trunk@48984 -
This commit is contained in:
nickysn 2021-03-15 18:06:44 +00:00
parent 43753442c0
commit f7dd8755cc

View File

@ -77,6 +77,7 @@ type
TListCallback = procedure(data,arg:pointer) of object;
TListStaticCallback = procedure(data,arg:pointer);
TDynStringArray = Array Of String;
TDirection = (FromBeginning,FromEnd);
TFPList = class(TObject)
private
FList: PPointerList;
@ -100,6 +101,7 @@ type
function Extract(item: Pointer): Pointer;
function First: Pointer;
function IndexOf(Item: Pointer): Integer;
function IndexOfItem(Item: Pointer; Direction: TDirection): Integer;
procedure Insert(Index: Integer; Item: Pointer);
function Last: Pointer;
procedure Move(CurIndex, NewIndex: Integer);
@ -145,6 +147,7 @@ type
function Extract(Item: TObject): TObject; {$ifdef CCLASSESINLINE}inline;{$endif}
function Remove(AObject: TObject): Integer;
function IndexOf(AObject: TObject): Integer; {$ifdef CCLASSESINLINE}inline;{$endif}
function IndexOfItem(AObject: TObject; Direction: TDirection): Integer; {$ifdef CCLASSESINLINE}inline;{$endif}
function FindInstanceOf(AClass: TClass; AExact: Boolean; AStartAt: Integer): Integer;
procedure Insert(Index: Integer; AObject: TObject); {$ifdef CCLASSESINLINE}inline;{$endif}
function First: TObject; {$ifdef CCLASSESINLINE}inline;{$endif}
@ -872,6 +875,29 @@ begin
end;
end;
function TFPList.IndexOfItem(Item: Pointer; Direction: TDirection): Integer;
var
psrc : PPointer;
Index : Integer;
begin
if Direction=FromBeginning then
Result:=IndexOf(Item)
else
begin
Result:=-1;
psrc:=@FList^[FCount-1];
For Index:=FCount-1 downto 0 Do
begin
if psrc^=Item then
begin
Result:=Index;
exit;
end;
dec(psrc);
end;
end;
end;
procedure TFPList.Insert(Index: Integer; Item: Pointer);
begin
if (Index < 0) or (Index > FCount )then
@ -1058,6 +1084,11 @@ begin
Result := FList.IndexOf(Pointer(AObject));
end;
function TFPObjectList.IndexOfItem(AObject: TObject; Direction: TDirection): Integer; {$ifdef CCLASSESINLINE}inline;{$endif}
begin
Result := FList.IndexOfItem(Pointer(AObject),Direction);
end;
function TFPObjectList.GetCount: integer;
begin
Result := FList.Count;