Ignore:
Timestamp:
Apr 3, 2012, 7:35:26 AM (12 years ago)
Author:
chronos
Message:
  • Added: Update locking support for TGList.
  • Modified: Enhanced TGStream methods.
Location:
Generics/TemplateGenerics/Generic
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Generics/TemplateGenerics/Generic/GenericList.inc

    r312 r342  
    2424    FItems: array of TGListItem;
    2525    FCount: TGListIndex;
     26    FUpdateCount: NativeInt;
     27    FOnUpdate: TNotifyEvent;
    2628    function Get(Index: TGListIndex): TGListItem;
    2729    function GetCapacity: TGListIndex;
     
    7274    procedure Sort(Compare: TGListSortCompare);
    7375    procedure SetArray(Values: array of TGListItem);
     76    procedure BeginUpdate;
     77    procedure EndUpdate;
     78    procedure Update;
    7479    property Count: TGListIndex read FCount write SetCount;
    7580    property Capacity: TGListIndex read GetCapacity write SetCapacity;
     
    107112    I := I + 1;
    108113  end;
     114  Update;
    109115end;
    110116
     
    118124    I := I + 1;
    119125  end;
     126  Update;
    120127end;
    121128
     
    130137    I := I + 1;
    131138  end;
     139  Update;
    132140end;
    133141
     
    248256    I := I + 1;
    249257  end;
     258  Update;
    250259end;
    251260
     
    294303  InsertCount(Index, 1);
    295304  FItems[Index] := Item;
     305  Update;
    296306end;
    297307
     
    319329  if Index < FCount then
    320330    System.Move(FItems[Index], FItems[Index + ACount], (FCount - ACount - Index) * SizeOf(TGListItem));
     331  Update;
    321332end;
    322333
     
    409420  //Delete(CurIndex);
    410421  //Insert(NewIndex, Temp);
     422  Update;
    411423end;
    412424
     
    434446    end;
    435447  end;
     448  Update;
    436449end;
    437450
     
    469482    I := I + 1;
    470483  end;
     484  Update;
    471485end;
    472486
     
    475489  if FCount > 1 then
    476490    QuickSort(0, FCount - 1, Compare);
     491  Update;
    477492end;
    478493
     
    486501    I := I + 1;
    487502  end;
     503  Update;
    488504end;
    489505
     
    498514    I := I + 1;
    499515  end;
     516end;
     517
     518procedure TGList.BeginUpdate;
     519begin
     520  Inc(FUpdateCount);
     521end;
     522
     523procedure TGList.EndUpdate;
     524begin
     525  Dec(FUpdateCount);
     526  Update;
     527end;
     528
     529procedure TGList.Update;
     530begin
     531  if Assigned(FOnUpdate) and (FUpdateCount = 0) then FOnUpdate(Self);
    500532end;
    501533
     
    530562  Result := FCount - 1;
    531563  FItems[Result] := Item;
     564  Update;
    532565end;
    533566
     
    545578    J := J + 1;
    546579  end;
     580  Update;
    547581end;
    548582
     
    560594    J := J + 1;
    561595  end;
     596  Update;
    562597end;
    563598
     
    575610  System.Move(FItems[Index + 1], FItems[Index], (FCount - Index) * SizeOf(TGListItem));
    576611  SetCapacityOptimized(Capacity - 1);
     612  Update;
    577613end;
    578614
     
    586622    I := I + 1;
    587623  end;
     624  Update;
    588625end;
    589626
     
    597634    I := I + 1;
    598635  end;
     636  Update;
    599637end;
    600638
     
    610648  FItems[Index1] := FItems[Index2];
    611649  FItems[Index2] := Temp;
     650  Update;
    612651end;
    613652
  • Generics/TemplateGenerics/Generic/GenericRectangle.inc

    r333 r342  
    1111  function GetTopRight: TGRectanglePoint;
    1212  function GetWidth: TGRectangleDimension;
     13  function GetEmpty: Boolean;
    1314  procedure SetBottom(const AValue: TGRectangleDimension);
    1415  procedure SetBottomLeft(const AValue: TGRectanglePoint);
     
    2122  procedure SetTopLeft(const AValue: TGRectanglePoint);
    2223  procedure SetTopRight(const AValue: TGRectanglePoint);
    23 
    2424  procedure SetWidth(const AValue: TGRectangleDimension);
     25  procedure SetEmpty(const AValue: Boolean);
    2526public
    2627  FLeft: TGRectangleDimension;
     
    5253
    5354  property Size: TGRectanglePoint read GetSize write SetSize;
     55  property Empty: Boolean read GetEmpty write SetEmpty;
    5456end;
    5557
     
    199201procedure TGRectangle.Intersect(Rect1, Rect2: TGRectangle);
    200202begin
    201   Left := Max(Rect1.Left, Rect2.Left);
    202   Top := Max(Rect1.Top, Rect2.Top);
    203   Right := Min(Rect1.Right, Rect2.Right);
    204   Bottom := Min(Rect1.Bottom, Rect2.Bottom);
     203  if Rect1.Empty or Rect2.Empty then Empty := True
     204  else begin
     205    Left := Max(Rect1.Left, Rect2.Left);
     206    Top := Max(Rect1.Top, Rect2.Top);
     207    Right := Min(Rect1.Right, Rect2.Right);
     208    Bottom := Min(Rect1.Bottom, Rect2.Bottom);
     209  end;
    205210end;
    206211
    207212procedure TGRectangle.IntersectWith(Rect: TGRectangle);
    208213begin
    209   Left := Max(Left, Rect.Left);
    210   Top := Max(Top, Rect.Top);
    211   Right := Min(Right, Rect.Right);
    212   Bottom := Min(Bottom, Rect.Bottom);
     214  if Empty or Rect.Empty then Empty := True
     215  else begin
     216    Left := Max(Left, Rect.Left);
     217    Top := Max(Top, Rect.Top);
     218    Right := Min(Right, Rect.Right);
     219    Bottom := Min(Bottom, Rect.Bottom);
     220  end;
    213221end;
    214222
    215223procedure TGRectangle.Union(Rect1, Rect2: TGRectangle);
    216224begin
    217   Left := Min(Rect1.Left, Rect2.Left);
    218   Top := Min(Rect1.Top, Rect2.Top);
    219   Right := Max(Rect1.Right, Rect2.Right);
    220   Bottom := Max(Rect1.Bottom, Rect2.Bottom);
     225  if Rect1.Empty then Assign(Rect2)
     226  else
     227  if Rect2.Empty then Assign(Rect1)
     228  else begin
     229    Left := Min(Rect1.Left, Rect2.Left);
     230    Top := Min(Rect1.Top, Rect2.Top);
     231    Right := Max(Rect1.Right, Rect2.Right);
     232    Bottom := Max(Rect1.Bottom, Rect2.Bottom);
     233  end;
    221234end;
    222235
    223236procedure TGRectangle.UnionWith(Rect: TGRectangle);
    224237begin
    225   Left := Min(Left, Rect.Left);
    226   Top := Min(Top, Rect.Top);
    227   Right := Max(Right, Rect.Right);
    228   Bottom := Max(Bottom, Rect.Bottom);
     238  if Empty then Assign(Rect)
     239  else
     240  if not Rect.Empty then begin
     241    Left := Min(Left, Rect.Left);
     242    Top := Min(Top, Rect.Top);
     243    Right := Max(Right, Rect.Right);
     244    Bottom := Max(Bottom, Rect.Bottom);
     245  end;
     246end;
     247
     248function TGRectangle.GetEmpty: Boolean;
     249begin
     250  Result := (Bottom <= Top) or (Right <= Left);
     251end;
     252
     253procedure TGRectangle.SetEmpty(const AValue: Boolean);
     254begin
     255  Top := 0;
     256  Bottom := 0;
     257  Left := 0;
     258  Right := 0;
    229259end;
    230260
  • Generics/TemplateGenerics/Generic/GenericStream.inc

    r312 r342  
    1313  procedure Write(Item: TGStreamItem); virtual; abstract;
    1414  procedure WriteArray(Item: array of TGStreamItem); virtual; abstract;
     15  procedure WriteStream(Stream: TGStream; Count: TGStreamIndex); virtual; abstract;
    1516  function Read: TGStreamItem; virtual; abstract;
    1617  function ReadArray(Count: TGStreamIndex): TGStreamItemArray; virtual; abstract;
     18  function ReadStream(Stream: TGStream; Count: TGStreamIndex): TGStreamIndex; virtual; abstract;
    1719  function Insert(Count: TGStreamIndex): TGStreamIndex; virtual; abstract;
    1820  function Remove(Count: TGStreamIndex): TGStreamIndex; virtual; abstract;
Note: See TracChangeset for help on using the changeset viewer.