anchor.diff:      procedure Clear; override;
       function Contains(const Value: Variant): Boolean; override;
       function Delete(Index: Integer): Variant; override;
  +    procedure DeleteRange(Index, Count: Integer); override;
       procedure Exchange(Index1, Index2: Integer); override;
       function IndexOf(const Value: Variant): Integer; override;
       procedure Insert(Index: Integer; const Value: Variant); override;
  
positive.code:     procedure Clear; virtual; abstract;
      function Contains(const Value: Variant): Boolean; virtual; abstract;
      function Delete(Index: Integer): Variant; virtual; abstract;
      procedure Exchange(Index1, Index2: Integer); virtual; abstract;
      function GetEnumerator: IListEnumerator; virtual;
      function IndexOf(const Value: Variant): Integer; virtual; abstract;
  
negative.code:   SetLength(FList, FCapacity);
  end;
  
  procedure TArrayList.UnShift(Index, N: Integer);
  var
    I: Integer;
  begin
    Dec(FCount, N);
    for I := Index to Index + N - 1 do VarClear(FList[I]);
    if Index < FCount then begin
      System.Move(FList[Index + N], FList[Index],
        (FCount - Index) * SizeOf(Variant));
      FillChar(FList[FCount], N * SizeOf(Variant), 0);
    end;
  end;
  
  function TArrayList.Delete(Index: Integer): Variant;
  begin
    if (Index >= 0) and (Index < FCount) then begin
      Result := FList[Index];
      UnShift(Index, 1);
    end;
  end;
  
  procedure TArrayList.DeleteRange(Index, Count: Integer);
  begin
    if (Index >= 0) and (Index < FCount) then begin
      if Count > FCount - Index then Count := Fcount - Index;
      UnShift(Index, Count);
    end;
  end;
  
  