Ignore:
Timestamp:
Feb 8, 2012, 9:47:54 AM (14 years ago)
Author:
chronos
Message:
  • Added: TGMemoryStream implementation.
  • Added: Additional methods to TGList.
Location:
Generics/NativeGenerics/Units
Files:
2 edited

Legend:

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

    r321 r322  
    3838    procedure AddArray(Values: array of TItem);
    3939    procedure AddList(List: TGList<TItem>);
     40    procedure AddListPart(List: TGList<TItem>; ItemIndex, ItemCount: TIndex);
    4041    procedure Assign(Source: TGList<TItem>); virtual;
    4142    procedure Clear; virtual;
     
    4849    property First: TItem read GetFirst write SetFirst;
    4950    procedure Fill(Start, Count: TIndex; Value: TItem);
    50     function GetArray: TItemArray;
     51    function GetArray(Index, ACount: TIndex): TItemArray;
     52    procedure GetList(List: TGList<TItem>; Index, ACount: TIndex);
    5153    function Implode(Separator: string; Converter: TToStringConverter): string;
    5254    function IndexOf(Item: TItem; Start: TIndex = 0): TIndex;
     
    161163end;
    162164
    163 function TGList<TItem>.GetArray: TItemArray;
     165function TGList<TItem>.GetArray(Index, ACount: TIndex): TItemArray;
    164166var
    165167  I: Integer;
    166168begin
    167   SetLength(Result, Count);
     169  SetLength(Result, ACount);
    168170  I := 0;
    169171  while I < Count do begin
    170     Result[I] := FItems[I];
    171     I := I + 1;
    172   end;
     172    Result[I] := FItems[Index + I];
     173    I := I + 1;
     174  end;
     175end;
     176
     177procedure TGList<TItem>.GetList(List: TGList; Index, ACount: TIndex);
     178begin
     179 List.Clear;
     180 List.AddListPart(Self, Index, ACount);
    173181end;
    174182
     
    506514end;
    507515
     516procedure TGList<TItem>.AddListPart(List: TGList; ItemIndex, ItemCount: TIndex);
     517var
     518  I: TIndex;
     519  J: TIndex;
     520begin
     521  I := Count;
     522  J := ItemIndex;
     523  Count := Count + ItemCount;
     524  while I < Count do begin
     525    Items[I] := List[J];
     526    I := I + 1;
     527    J := J + 1;
     528  end;
     529end;
     530
    508531procedure TGList<TItem>.Clear;
    509532begin
  • Generics/NativeGenerics/Units/GenericStream.pas

    r320 r322  
    2424    procedure Write(Item: TItem); virtual; abstract;
    2525    procedure WriteArray(Item: array of TItem); virtual; abstract;
     26    procedure WriteList(List: TGList<TItem>); virtual; abstract;
    2627    function Read: TItem; virtual; abstract;
    2728    function ReadArray(Count: TIndex): TItemArray; virtual; abstract;
     
    3536  end;
    3637
     38  TGMemoryStream<TItem> = class(TGStream<TItem>)
     39  private
     40    FList: TGList<TItem>;
     41    FPosition: TIndex;
     42  public
     43    procedure Assign(Source: TGStream<TItem>); override;
     44    procedure Write(Item: TItem); override;
     45    procedure WriteArray(Values: array of TItem); override;
     46    procedure WriteList(List: TGList<TItem>); override;
     47    function Read: TItem; override;
     48    function ReadArray(Count: TIndex): TItemArray; override;
     49    function ReadList(List: TGList<TItem>; Count: TIndex): TIndex;
     50    function Insert(Count: TIndex): Integer; override;
     51    function Remove(Count: TIndex): Integer; override;
     52    function Seek(Offset: TIndex; Origin: TSeekOrigin = soCurrent): TIndex; override;
     53    constructor Create; override;
     54    destructor Destroy; override;
     55    property List: TGList<TItem> read FList;
     56  end;
     57
    3758
    3859implementation
    3960
     61
     62{ TGStream }
    4063
    4164procedure TGStream<TItem>.Assign(Source: TGStream<TItem>);
     
    85108end;
    86109
     110{ TMemoryStreamByte }
     111
     112procedure TGMemoryStream<TItem>.Assign(Source: TGStream<TItem>);
     113begin
     114  inherited;
     115  if Source is TGMemoryStream<TItem> then begin
     116    FList.Assign(TGMemoryStream<TItem>(Source).FList);
     117    FPosition := TGMemoryStream<TItem>(Source).FPosition;
     118  end;
     119end;
     120
     121procedure TGMemoryStream<TItem>.Write(Item: TItem);
     122begin
     123  if FList.Count < (FPosition + 1) then
     124    FList.Count := FPosition + 1;
     125  FList[FPosition] := Item;
     126  Inc(FPosition);
     127end;
     128
     129procedure TGMemoryStream<TItem>.WriteArray(Values: array of TItem);
     130begin
     131  if FList.Count < (FPosition + Length(Values)) then
     132    FList.Count := FPosition + Length(Values);
     133  FList.ReplaceArray(FPosition, Values);
     134  Inc(FPosition, Length(Values));
     135end;
     136
     137procedure TGMemoryStream<TItem>.WriteList(List: TGList<TItem>);
     138begin
     139  FList.ReplaceList(FPosition, List);
     140end;
     141
     142function TGMemoryStream<TItem>.Read: TItem;
     143begin
     144  Result := FList[FPosition];
     145  Inc(FPosition);
     146end;
     147
     148function TGMemoryStream<TItem>.ReadArray(Count: TIndex): TItemArray;
     149begin
     150  Result := FList.GetArray(FPosition, Count);
     151end;
     152
     153function TGMemoryStream<TItem>.ReadList(List: TGList<TItem>; Count: TIndex): TIndex;
     154begin
     155  if (FPosition + Count) > FList.Count then
     156    Count := FList.Count - FPosition;
     157  FList.GetList(List, FPosition, Count);
     158  Result := Count;
     159end;
     160
     161function TGMemoryStream<TItem>.Insert(Count: TIndex): TIndex;
     162begin
     163  FList.InsertCount(FPosition, Count);
     164  Result := Count;
     165end;
     166
     167function TGMemoryStream<TItem>.Remove(Count: TIndex): TIndex;
     168begin
     169  Result := FList.Count - FPosition;
     170  if Count < Result then Result := Count;
     171  FList.DeleteItems(FPosition, Count);
     172end;
     173
     174function TGMemoryStream<TItem>.Seek(Offset: TIndex; Origin: TSeekOrigin): TIndex;
     175begin
     176  case Origin of
     177    soBeginning: FPosition := Offset;
     178    soCurrent: FPosition := FPosition + Offset;
     179    soEnd: FPosition := FList.Count + Offset;
     180  end;
     181  if FPosition > FList.Count then FPosition := FList.Count;
     182  if FPosition < 0 then FPosition := 0;
     183  Result := FPosition;
     184end;
     185
     186constructor TGMemoryStream<TItem>.Create;
     187begin
     188  inherited;
     189  FList := TGList<TItem>.Create;
     190end;
     191
     192destructor TGMemoryStream<TItem>.Destroy;
     193begin
     194  FList.Free;
     195  inherited Destroy;
     196end;
     197
     198
    87199end.
Note: See TracChangeset for help on using the changeset viewer.