Ignore:
Timestamp:
Feb 7, 2012, 3:35:32 PM (13 years ago)
Author:
chronos
Message:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Generics/NativeGenerics/Units/GenericList.pas

    r320 r321  
    99
    1010type
     11
     12  { TGList }
     13
    1114  TGList<TItem> = class
    12   private
     15  public
    1316  type
    1417    TIndex = NativeInt;
     
    1720    TFromStringConverter = function(Text: string): TItem;
    1821    TItemArray = array of TItem;
    19   var
     22  private
     23    FCount: TIndex;
    2024    FItems: array of TItem;
    21     FCount: TIndex;
    2225    function Get(Index: TIndex): TItem;
    2326    function GetCapacity: TIndex;
     27    function GetFirst: TItem;
    2428    function GetLast: TItem;
    25     function GetFirst: TItem;
    2629    procedure SetCapacity(const AValue: TIndex);
    2730    procedure SetCapacityOptimized(const NewCapacity: TIndex);
     31    procedure SetCount(const AValue: TIndex);
     32    procedure SetFirst(AValue: TItem);
    2833    procedure SetLast(AValue: TItem);
    29     procedure SetFirst(AValue: TItem);
    3034    procedure Put(Index: TIndex; const AValue: TItem); virtual;
    31     procedure SetCount(const AValue: TIndex); virtual;
    3235    procedure QuickSort(L, R : TIndex; Compare: TSortCompare);
    3336  public
     
    5255    procedure InsertList(Index: TIndex; List: TGList<TItem>);
    5356    procedure InsertArray(Index: TIndex; Values: array of TItem);
     57    procedure InsertCount(Index: TIndex; ACount: TIndex);
    5458    procedure Move(CurIndex, NewIndex: TIndex);
    5559    procedure MoveItems(CurIndex, NewIndex, Count: TIndex);
    5660    function Remove(Item: TItem): TIndex;
    5761    procedure Reverse;
     62    procedure ReplaceArray(Index: TIndex; Values: array of TItem);
     63    procedure ReplaceList(Index: TIndex; Source: TGList<TItem>);
     64    procedure ReplaceListPart(Index: TIndex; Source: TGList<TItem>;
     65      SourceIndex, SourceCount: TIndex);
    5866    procedure Sort(Compare: TSortCompare);
    5967    procedure SetArray(Values: array of TItem);
     
    8492    constructor Create;
    8593    destructor Destroy; override;
    86 
    8794  end;
    8895
     
    230237procedure TGList<TItem>.Insert(Index: TIndex; Item: TItem);
    231238begin
    232   if (Index < 0) or (Index > FCount ) then
     239  if (Index < 0) or (Index > FCount) then
    233240    raise EListError.CreateFmt(SListIndexError, [Index]);
    234   if FCount = Capacity then SetCapacityOptimized(Capacity + 1);
    235   if Index < FCount then
    236     System.Move(FItems[Index], FItems[Index + 1], (FCount - Index) * SizeOf(TItem));
     241  InsertCount(Index, 1);
    237242  FItems[Index] := Item;
    238   FCount := FCount + 1;
    239243end;
    240244
    241245procedure TGList<TItem>.InsertList(Index: TIndex; List: TGList<TItem>);
    242 var
    243   I: TIndex;
    244 begin
    245   I := 0;
    246   while (I < List.Count) do begin
    247     Insert(Index + I, List[I]);
    248     I := I + 1;
    249   end;
     246begin
     247  if (Index < 0) or (Index > FCount) then
     248    raise EListError.CreateFmt(SListIndexError, [Index]);
     249  InsertCount(Index, List.Count);
     250  ReplaceList(Index, List);
    250251end;
    251252
     
    381382end;
    382383
     384procedure TGList<TItem>.ReplaceArray(Index: TIndex;
     385  Values: array of TItem);
     386var
     387  I: TIndex;
     388begin
     389  I := 0;
     390  while I < Length(Values) do begin
     391    Items[Index + I] := Values[I];
     392    I := I + 1;
     393  end;
     394end;
     395
     396procedure TGList<TItem>.ReplaceList(Index: TIndex; Source: TGList<TItem>);
     397var
     398  I: TIndex;
     399begin
     400  I := 0;
     401  while I < Source.Count do begin
     402    Items[Index + I] := Source[I];
     403    I := I + 1;
     404  end;
     405end;
     406
     407procedure TGList<TItem>.ReplaceListPart(Index: TIndex; Source: TGList<TItem>;
     408  SourceIndex, SourceCount: TIndex);
     409var
     410  I: TIndex;
     411begin
     412  I := 0;
     413  while I < SourceCount do begin
     414    Items[Index + I] := Source[SourceIndex + I];
     415    I := I + 1;
     416  end;
     417end;
     418
    383419procedure TGList<TItem>.Sort(Compare: TSortCompare);
    384420begin
     
    411447
    412448procedure TGList<TItem>.InsertArray(Index: TIndex; Values: array of TItem);
    413 var
    414   I: TIndex;
    415 begin
    416   I := 0;
    417   while I <= High(Values) do begin
    418     Insert(Index + I, Values[I]);
    419     I := I + 1;
    420   end;
     449begin
     450  if (Index < 0) or (Index > FCount) then
     451    raise EListError.CreateFmt(SListIndexError, [Index]);
     452  InsertCount(Index, Length(Values));
     453  ReplaceArray(Index, Values);
     454end;
     455
     456procedure TGList<TItem>.InsertCount(Index: TIndex; ACount: TIndex);
     457begin
     458  if (Index < 0) or (Index > FCount) then
     459    raise EListError.CreateFmt(SListIndexError, [Index]);
     460  Count := Count + ACount;
     461  if Index < FCount then
     462    System.Move(FItems[Index], FItems[Index + ACount], (FCount - ACount - Index) * SizeOf(TItem));
    421463end;
    422464
Note: See TracChangeset for help on using the changeset viewer.