Ignore:
Timestamp:
Sep 7, 2012, 6:45:53 AM (12 years ago)
Author:
chronos
Message:
  • Upraveno: Aktualizace balíčku TemplateGenerics na novější verzi. Se starou nešel projekt správně přeložit.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Packages/TemplateGenerics/Generic/GenericList.inc

    r84 r90  
    11{$IFDEF INTERFACE}
     2
     3  // TGList implemented using templates
     4  // - item operations (Add, Insert, ReplaceArray, Get, Set, IndexOf,
     5  //   Extract, Delete, Exchange)
     6  // - item range operations (DeleteItems, InsertItems, ReplaceItems,
     7  //   Move, Fill)
     8  // - other TGList operations (AddList, InsertList,
     9  //   ReplaceList, GetList, IndexOfList)
     10  // - dynamic array operations (AddArray, InsertArray,
     11  //   ReplaceArray, GetArray, IndexOfArray)
     12  // - all items operations (Clear, Reverse, Sort)
    213
    314  TGList = class;
     
    1324    FItems: array of TGListItem;
    1425    FCount: TGListIndex;
     26    FUpdateCount: Integer;
     27    FOnUpdate: TNotifyEvent;
    1528    function Get(Index: TGListIndex): TGListItem;
    1629    function GetCapacity: TGListIndex;
     
    2134    procedure SetLast(AValue: TGListItem);
    2235    procedure SetFirst(AValue: TGListItem);
     36    procedure QuickSort(L, R : TGListIndex; Compare: TGListSortCompare);
     37  protected
    2338    procedure Put(Index: TGListIndex; const AValue: TGListItem); virtual;
    2439    procedure SetCount(const AValue: TGListIndex); virtual;
    25     procedure QuickSort(L, R : TGListIndex; Compare: TGListSortCompare);
    2640  public
     41    type
     42      PItem = ^TGListItem;
    2743    function CompareMem(P1, P2: Pointer; Length: cardinal): Boolean; inline;
    2844    function Add(Item: TGListItem): TGListIndex;
     
    4157    property First: TGListItem read GetFirst write SetFirst;
    4258    procedure Fill(Start, Count: TGListIndex; Value: TGListItem);
    43     function GetArray: TGListItemArray;
     59    function GetArray(Index, ACount: TGListIndex): TGListItemArray;
     60    procedure GetList(List: TGList; Index, ACount: TGListIndex);
     61    procedure GetBuffer(Index: TGListIndex; var Buffer; Count: TGListIndex);
    4462    function Implode(Separator: string; Converter: TGListToStringConverter): string;
    4563    function IndexOf(Item: TGListItem; Start: TGListIndex = 0): TGListIndex; virtual;
    4664    function IndexOfList(List: TGList; Start: TGListIndex = 0): TGListIndex;
     65    function IndexOfArray(Values: array of TGListItem; Start: TGListIndex = 0): TGListIndex;
    4766    procedure Insert(Index: TGListIndex; Item: TGListItem);
    4867    procedure InsertList(Index: TGListIndex; List: TGList);
    4968    procedure InsertArray(Index: TGListIndex; Values: array of TGListItem);
     69    procedure InsertCount(Index: TGListIndex; ACount: TGListIndex);
    5070    procedure Move(CurIndex, NewIndex: TGListIndex);
    5171    procedure MoveItems(CurIndex, NewIndex, Count: TGListIndex);
    5272    function Remove(Item: TGListItem): TGListIndex;
    5373    procedure Reverse;
     74    procedure ReplaceArray(Index: TGListIndex; Values: array of TGListItem);
    5475    procedure ReplaceList(Index: TGListIndex; Source: TGList);
    5576    procedure ReplaceListPart(Index: TGListIndex; Source: TGList;
    5677      SourceIndex, SourceCount: TGListIndex);
     78    procedure ReplaceBuffer(Index: TGListIndex; var Buffer; Count: TGListIndex);
    5779    procedure Sort(Compare: TGListSortCompare);
    5880    procedure SetArray(Values: array of TGListItem);
     81    procedure BeginUpdate;
     82    procedure EndUpdate;
     83    procedure Update;
    5984    property Count: TGListIndex read FCount write SetCount;
    6085    property Capacity: TGListIndex read GetCapacity write SetCapacity;
    6186    property Items[Index: TGListIndex]: TGListItem read Get write Put; default;
    6287    property Last: TGListItem read GetLast write SetLast;
     88    property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate;
    6389  end;
    6490 
     
    83109end;
    84110
     111procedure TGList.GetBuffer(Index: TGListIndex; var Buffer; Count: TGListIndex);
     112var
     113  P: PItem;
     114  I: TGListIndex;
     115begin
     116  if (Index + Count) > FCount then
     117    raise EListError.CreateFmt(SListIndexError, [Index + Count]);
     118  P := PItem(@Buffer);
     119  I := 0;
     120  while I < Count do begin
     121    P^ := Items[Index + I];
     122    Inc(P, 1);
     123    I := I + 1;
     124  end;
     125end;
     126
     127procedure TGList.ReplaceBuffer(Index: TGListIndex; var Buffer; Count: TGListIndex);
     128var
     129  P: PItem;
     130  I: TGListIndex;
     131begin
     132  if (Index + Count) > FCount then
     133    raise EListError.CreateFmt(SListIndexError, [Index + Count]);
     134  P := PItem(@Buffer);
     135  I := 0;
     136  while I < Count do begin
     137    Items[Index + I] := P^;
     138    Inc(P, 1);
     139    I := I + 1;
     140  end;
     141end;
     142
     143procedure TGList.ReplaceArray(Index: TGListIndex; Values: array of TGListItem);
     144var
     145  I: TGListIndex;
     146begin
     147  I := 0;
     148  while I < Length(Values) do begin
     149    Items[Index + I] := Values[I];
     150    I := I + 1;
     151  end;
     152  Update;
     153end;
     154
    85155procedure TGList.ReplaceList(Index: TGListIndex; Source: TGList);
    86156var
     
    92162    I := I + 1;
    93163  end;
     164  Update;
    94165end;
    95166
     
    104175    I := I + 1;
    105176  end;
     177  Update;
    106178end;
    107179
     
    165237end;
    166238
    167 function TGList.GetArray: TGListItemArray;
     239function TGList.GetArray(Index, ACount: TGListIndex): TGListItemArray;
    168240var
    169241  I: Integer;
    170242begin
    171   SetLength(Result, Count);
    172   I := 0;
    173   while I < Count do begin
    174     Result[I] := FItems[I];
    175     I := I + 1;
    176   end;
     243  SetLength(Result, ACount);
     244  I := 0;
     245  while I < Count do begin
     246    Result[I] := FItems[Index + I];
     247    I := I + 1;
     248  end;
     249end;
     250
     251procedure TGList.GetList(List: TGList; Index, ACount: TGListIndex);
     252begin
     253  List.Clear;
     254  List.AddListPart(Self, Index, ACount);
    177255end;
    178256
     
    216294    I := I + 1;
    217295  end;
     296  Update;
    218297end;
    219298
     
    250329  Result := Start;
    251330  while (Result < FCount) and
    252   not CompareMem(@FItems[Result], @Item, SizeOf(TGListItem)) do
    253 //  not (CompareByte(FItems[Result], Item, SizeOf(TGListItem)) = 0) do
     331//  not CompareMem(@FItems[Result], @Item, SizeOf(TGListItem)) do
     332  not (CompareByte(FItems[Result], Item, SizeOf(TGListItem)) = 0) do
    254333    Result := Result + 1;
    255334  if Result = FCount then Result := -1;
     
    258337procedure TGList.Insert(Index: TGListIndex; Item: TGListItem);
    259338begin
    260   if (Index < 0) or (Index > FCount ) then
     339  if (Index < 0) or (Index > FCount) then
    261340    raise EListError.CreateFmt(SListIndexError, [Index]);
    262   if FCount = Capacity then SetCapacityOptimized(Capacity + 1);
     341  InsertCount(Index, 1);
     342  FItems[Index] := Item;
     343  Update;
     344end;
     345
     346procedure TGList.InsertList(Index: TGListIndex; List: TGList);
     347begin
     348  if (Index < 0) or (Index > FCount) then
     349    raise EListError.CreateFmt(SListIndexError, [Index]);
     350  InsertCount(Index, List.Count);
     351  ReplaceList(Index, List);
     352end;
     353
     354procedure TGList.InsertArray(Index: TGListIndex; Values: array of TGListItem);
     355begin
     356  if (Index < 0) or (Index > FCount) then
     357    raise EListError.CreateFmt(SListIndexError, [Index]);
     358  InsertCount(Index, Length(Values));
     359  ReplaceArray(Index, Values);
     360end;
     361
     362procedure TGList.InsertCount(Index: TGListIndex; ACount: TGListIndex);
     363begin
     364  if (Index < 0) or (Index > FCount) then
     365    raise EListError.CreateFmt(SListIndexError, [Index]);
     366  Count := Count + ACount;
    263367  if Index < FCount then
    264     System.Move(FItems[Index], FItems[Index + 1], (FCount - Index) * SizeOf(TGListItem));
    265   FItems[Index] := Item;
    266   FCount := FCount + 1;
    267 end;
    268 
    269 procedure TGList.InsertList(Index: TGListIndex; List: TGList);
    270 var
    271   I: TGListIndex;
    272 begin
    273   I := 0;
    274   while (I < List.Count) do begin
    275     Insert(Index + I, List[I]);
    276     I := I + 1;
    277   end;
     368    System.Move(FItems[Index], FItems[Index + ACount], (FCount - ACount - Index) * SizeOf(TGListItem));
     369  Update;
    278370end;
    279371
     
    297389end;
    298390
     391function TGList.IndexOfArray(Values: array of TGListItem; Start: TGListIndex): TGListIndex;
     392var
     393  I: TGListIndex;
     394begin
     395  if Length(Values) > 0 then begin
     396    Result := IndexOf(Values[0], Start);
     397    if Result <> -1 then begin
     398      I := 1;
     399      while I < Length(Values) do begin
     400        if not CompareMem(Addr(FItems[Result + I]), Addr(Values[I]), SizeOf(TGListItem)) then begin
     401          Result := -1;
     402          Break;
     403        end;
     404        I := I + 1;
     405      end;
     406    end;
     407  end else Result := -1;
     408end;
     409
    299410function TGList.GetLast: TGListItem;
    300411begin
     
    347458  //Delete(CurIndex);
    348459  //Insert(NewIndex, Temp);
     460  Update;
    349461end;
    350462
     
    372484    end;
    373485  end;
     486  Update;
    374487end;
    375488
     
    378491  Result := IndexOf(Item);
    379492  if Result <> -1 then
    380     Delete(Result);
     493    Delete(Result)
     494    else raise Exception.CreateFmt(SItemNotFound, [0]);
    381495end;
    382496
     
    407521    I := I + 1;
    408522  end;
     523  Update;
    409524end;
    410525
     
    413528  if FCount > 1 then
    414529    QuickSort(0, FCount - 1, Compare);
     530  Update;
    415531end;
    416532
     
    424540    I := I + 1;
    425541  end;
     542  Update;
    426543end;
    427544
     
    438555end;
    439556
    440 procedure TGList.InsertArray(Index: TGListIndex; Values: array of TGListItem);
    441 var
    442   I: TGListIndex;
    443 begin
    444   I := 0;
    445   while I <= High(Values) do begin
    446     Insert(Index + I, Values[I]);
    447     I := I + 1;
    448   end;
     557procedure TGList.BeginUpdate;
     558begin
     559  Inc(FUpdateCount);
     560end;
     561
     562procedure TGList.EndUpdate;
     563begin
     564  Dec(FUpdateCount);
     565  Update;
     566end;
     567
     568procedure TGList.Update;
     569begin
     570  if Assigned(FOnUpdate) and (FUpdateCount = 0) then FOnUpdate(Self);
    449571end;
    450572
     
    479601  Result := FCount - 1;
    480602  FItems[Result] := Item;
     603  Update;
    481604end;
    482605
     
    494617    J := J + 1;
    495618  end;
     619  Update;
    496620end;
    497621
     
    509633    J := J + 1;
    510634  end;
     635  Update;
    511636end;
    512637
     
    524649  System.Move(FItems[Index + 1], FItems[Index], (FCount - Index) * SizeOf(TGListItem));
    525650  SetCapacityOptimized(Capacity - 1);
     651  Update;
    526652end;
    527653
     
    535661    I := I + 1;
    536662  end;
     663  Update;
    537664end;
    538665
     
    546673    I := I + 1;
    547674  end;
     675  Update;
    548676end;
    549677
     
    559687  FItems[Index1] := FItems[Index2];
    560688  FItems[Index2] := Temp;
     689  Update;
    561690end;
    562691
Note: See TracChangeset for help on using the changeset viewer.