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

Legend:

Unmodified
Added
Removed
  • Generics/NativeGenerics/Demo/Demo.lpi

    r321 r322  
    4343        <IsPartOfProject Value="True"/>
    4444        <UnitName Value="Demo"/>
    45         <EditorIndex Value="7"/>
     45        <EditorIndex Value="9"/>
    4646        <WindowIndex Value="0"/>
    4747        <TopLine Value="1"/>
     
    5757        <ResourceBaseClass Value="Form"/>
    5858        <UnitName Value="UMainForm"/>
     59        <IsVisibleTab Value="True"/>
    5960        <EditorIndex Value="0"/>
    6061        <WindowIndex Value="0"/>
    61         <TopLine Value="85"/>
    62         <CursorPos X="11" Y="98"/>
     62        <TopLine Value="191"/>
     63        <CursorPos X="1" Y="205"/>
    6364        <UsageCount Value="233"/>
    6465        <Bookmarks Count="1">
    65           <Item0 X="65" Y="277" ID="2"/>
     66          <Item0 X="65" Y="276" ID="2"/>
    6667        </Bookmarks>
    6768        <Loaded Value="True"/>
     
    8384        <TopLine Value="1"/>
    8485        <CursorPos X="25" Y="13"/>
    85         <UsageCount Value="0"/>
     86        <UsageCount Value="10"/>
    8687        <DefaultSyntaxHighlighter Value="None"/>
    8788      </Unit3>
     
    439440        <Filename Value="../Units/GenericList.pas"/>
    440441        <UnitName Value="GenericList"/>
    441         <IsVisibleTab Value="True"/>
    442         <EditorIndex Value="1"/>
    443         <WindowIndex Value="0"/>
    444         <TopLine Value="449"/>
    445         <CursorPos X="92" Y="462"/>
    446         <UsageCount Value="35"/>
     442        <EditorIndex Value="3"/>
     443        <WindowIndex Value="0"/>
     444        <TopLine Value="516"/>
     445        <CursorPos X="1" Y="528"/>
     446        <UsageCount Value="37"/>
    447447        <Loaded Value="True"/>
    448448      </Unit46>
     
    450450        <Filename Value="../Units/GenericMatrix.pas"/>
    451451        <UnitName Value="GenericMatrix"/>
    452         <EditorIndex Value="6"/>
     452        <EditorIndex Value="8"/>
    453453        <WindowIndex Value="0"/>
    454454        <TopLine Value="77"/>
    455455        <CursorPos X="1" Y="85"/>
    456         <UsageCount Value="13"/>
     456        <UsageCount Value="15"/>
    457457        <Loaded Value="True"/>
    458458      </Unit47>
     
    460460        <Filename Value="../Units/GenericStream.pas"/>
    461461        <UnitName Value="GenericStream"/>
    462         <WindowIndex Value="0"/>
    463         <TopLine Value="59"/>
    464         <CursorPos X="26" Y="65"/>
     462        <EditorIndex Value="1"/>
     463        <WindowIndex Value="0"/>
     464        <TopLine Value="148"/>
     465        <CursorPos X="3" Y="150"/>
    465466        <UsageCount Value="15"/>
     467        <Loaded Value="True"/>
    466468      </Unit48>
    467469      <Unit49>
     
    476478        <Filename Value="../Units/GenericDictionary.pas"/>
    477479        <UnitName Value="GenericDictionary"/>
    478         <EditorIndex Value="5"/>
     480        <EditorIndex Value="7"/>
    479481        <WindowIndex Value="0"/>
    480482        <TopLine Value="1"/>
    481483        <CursorPos X="1" Y="1"/>
    482         <UsageCount Value="14"/>
     484        <UsageCount Value="16"/>
    483485        <Loaded Value="True"/>
    484486      </Unit50>
    485487      <Unit51>
    486488        <Filename Value="../../../../../Lazarus/0.9.31_2.6.0/fpc/2.6.0/source/rtl/objpas/sysutils/sysunih.inc"/>
    487         <EditorIndex Value="4"/>
     489        <EditorIndex Value="6"/>
    488490        <WindowIndex Value="0"/>
    489491        <TopLine Value="9"/>
    490492        <CursorPos X="10" Y="22"/>
    491         <UsageCount Value="14"/>
     493        <UsageCount Value="16"/>
    492494        <Loaded Value="True"/>
    493495        <DefaultSyntaxHighlighter Value="Delphi"/>
     
    496498        <Filename Value="../Units/SpecializedList.pas"/>
    497499        <UnitName Value="SpecializedList"/>
    498         <EditorIndex Value="8"/>
     500        <EditorIndex Value="10"/>
    499501        <WindowIndex Value="0"/>
    500502        <TopLine Value="1"/>
    501503        <CursorPos X="23" Y="11"/>
    502         <UsageCount Value="14"/>
     504        <UsageCount Value="16"/>
    503505        <Loaded Value="True"/>
    504506      </Unit52>
    505507      <Unit53>
    506508        <Filename Value="../../../../../Lazarus/0.9.31_2.7.1/fpc/2.7.1/source/rtl/objpas/classes/classesh.inc"/>
    507         <WindowIndex Value="0"/>
    508         <TopLine Value="127"/>
    509         <CursorPos X="3" Y="140"/>
     509        <EditorIndex Value="2"/>
     510        <WindowIndex Value="0"/>
     511        <TopLine Value="257"/>
     512        <CursorPos X="3" Y="270"/>
    510513        <UsageCount Value="13"/>
     514        <Loaded Value="True"/>
    511515      </Unit53>
    512516      <Unit54>
     
    529533        <Filename Value="../Units/GenericRange.pas"/>
    530534        <UnitName Value="GenericRange"/>
    531         <EditorIndex Value="2"/>
     535        <EditorIndex Value="4"/>
    532536        <WindowIndex Value="0"/>
    533537        <TopLine Value="4"/>
    534538        <CursorPos X="33" Y="8"/>
    535         <UsageCount Value="14"/>
     539        <UsageCount Value="16"/>
    536540        <Loaded Value="True"/>
    537541      </Unit56>
     
    546550        <Filename Value="../Units/GenericTree.pas"/>
    547551        <UnitName Value="GenericTree"/>
    548         <EditorIndex Value="3"/>
     552        <EditorIndex Value="5"/>
    549553        <WindowIndex Value="0"/>
    550554        <TopLine Value="1"/>
    551555        <CursorPos X="33" Y="8"/>
    552         <UsageCount Value="13"/>
     556        <UsageCount Value="16"/>
    553557        <Loaded Value="True"/>
    554558      </Unit58>
    555559    </Units>
    556     <JumpHistory Count="30" HistoryIndex="29">
     560    <JumpHistory Count="30" HistoryIndex="28">
    557561      <Position1>
    558562        <Filename Value="UMainForm.pas"/>
    559         <Caret Line="93" Column="29" TopLine="77"/>
     563        <Caret Line="23" Column="22" TopLine="10"/>
    560564      </Position1>
    561565      <Position2>
    562566        <Filename Value="UMainForm.pas"/>
    563         <Caret Line="98" Column="11" TopLine="85"/>
     567        <Caret Line="669" Column="21" TopLine="656"/>
    564568      </Position2>
    565569      <Position3>
    566         <Filename Value="../Units/GenericList.pas"/>
    567         <Caret Line="67" Column="35" TopLine="51"/>
     570        <Filename Value="UMainForm.pas"/>
     571        <Caret Line="185" Column="19" TopLine="179"/>
    568572      </Position3>
    569573      <Position4>
    570         <Filename Value="../Units/GenericList.pas"/>
    571         <Caret Line="14" Column="36" TopLine="1"/>
     574        <Filename Value="UMainForm.pas"/>
     575        <Caret Line="49" Column="14" TopLine="36"/>
    572576      </Position4>
    573577      <Position5>
    574         <Filename Value="../Units/GenericList.pas"/>
    575         <Caret Line="434" Column="1" TopLine="419"/>
     578        <Filename Value="../Units/GenericStream.pas"/>
     579        <Caret Line="45" Column="48" TopLine="27"/>
    576580      </Position5>
    577581      <Position6>
    578         <Filename Value="../Units/GenericList.pas"/>
    579         <Caret Line="16" Column="3" TopLine="15"/>
     582        <Filename Value="UMainForm.pas"/>
     583        <Caret Line="198" Column="25" TopLine="185"/>
    580584      </Position6>
    581585      <Position7>
    582         <Filename Value="../Units/GenericList.pas"/>
    583         <Caret Line="32" Column="1" TopLine="15"/>
     586        <Filename Value="UMainForm.pas"/>
     587        <Caret Line="669" Column="21" TopLine="656"/>
    584588      </Position7>
    585589      <Position8>
    586         <Filename Value="../Units/GenericList.pas"/>
    587         <Caret Line="147" Column="3" TopLine="145"/>
     590        <Filename Value="UMainForm.pas"/>
     591        <Caret Line="164" Column="1" TopLine="151"/>
    588592      </Position8>
    589593      <Position9>
    590         <Filename Value="../Units/GenericList.pas"/>
    591         <Caret Line="27" Column="1" TopLine="24"/>
     594        <Filename Value="UMainForm.pas"/>
     595        <Caret Line="442" Column="1" TopLine="429"/>
    592596      </Position9>
    593597      <Position10>
    594         <Filename Value="../Units/GenericList.pas"/>
    595         <Caret Line="30" Column="1" TopLine="21"/>
     598        <Filename Value="UMainForm.pas"/>
     599        <Caret Line="443" Column="1" TopLine="429"/>
    596600      </Position10>
    597601      <Position11>
    598         <Filename Value="../Units/GenericList.pas"/>
    599         <Caret Line="35" Column="1" TopLine="22"/>
     602        <Filename Value="UMainForm.pas"/>
     603        <Caret Line="442" Column="3" TopLine="429"/>
    600604      </Position11>
    601605      <Position12>
    602         <Filename Value="../Units/GenericList.pas"/>
    603         <Caret Line="77" Column="31" TopLine="53"/>
     606        <Filename Value="UMainForm.pas"/>
     607        <Caret Line="656" Column="20" TopLine="643"/>
    604608      </Position12>
    605609      <Position13>
    606         <Filename Value="../Units/GenericList.pas"/>
    607         <Caret Line="15" Column="1" TopLine="14"/>
     610        <Filename Value="UMainForm.pas"/>
     611        <Caret Line="189" Column="3" TopLine="182"/>
    608612      </Position13>
    609613      <Position14>
    610         <Filename Value="../Units/GenericList.pas"/>
    611         <Caret Line="26" Column="1" TopLine="22"/>
     614        <Filename Value="../Units/GenericStream.pas"/>
     615        <Caret Line="43" Column="15" TopLine="30"/>
    612616      </Position14>
    613617      <Position15>
    614         <Filename Value="../Units/GenericList.pas"/>
    615         <Caret Line="77" Column="33" TopLine="53"/>
     618        <Filename Value="UMainForm.pas"/>
     619        <Caret Line="191" Column="1" TopLine="182"/>
    616620      </Position15>
    617621      <Position16>
    618         <Filename Value="../Units/GenericList.pas"/>
    619         <Caret Line="45" Column="1" TopLine="32"/>
     622        <Filename Value="UMainForm.pas"/>
     623        <Caret Line="192" Column="1" TopLine="182"/>
    620624      </Position16>
    621625      <Position17>
    622         <Filename Value="../Units/GenericList.pas"/>
    623         <Caret Line="25" Column="1" TopLine="13"/>
     626        <Filename Value="UMainForm.pas"/>
     627        <Caret Line="193" Column="1" TopLine="182"/>
    624628      </Position17>
    625629      <Position18>
    626         <Filename Value="../Units/GenericList.pas"/>
    627         <Caret Line="26" Column="1" TopLine="13"/>
     630        <Filename Value="UMainForm.pas"/>
     631        <Caret Line="194" Column="1" TopLine="182"/>
    628632      </Position18>
    629633      <Position19>
    630         <Filename Value="../Units/GenericList.pas"/>
    631         <Caret Line="27" Column="1" TopLine="14"/>
     634        <Filename Value="UMainForm.pas"/>
     635        <Caret Line="195" Column="1" TopLine="182"/>
    632636      </Position19>
    633637      <Position20>
    634         <Filename Value="../Units/GenericList.pas"/>
    635         <Caret Line="28" Column="1" TopLine="15"/>
     638        <Filename Value="UMainForm.pas"/>
     639        <Caret Line="196" Column="1" TopLine="182"/>
    636640      </Position20>
    637641      <Position21>
    638         <Filename Value="../Units/GenericList.pas"/>
    639         <Caret Line="31" Column="1" TopLine="18"/>
     642        <Filename Value="UMainForm.pas"/>
     643        <Caret Line="197" Column="1" TopLine="182"/>
    640644      </Position21>
    641645      <Position22>
    642         <Filename Value="../Units/GenericList.pas"/>
    643         <Caret Line="35" Column="1" TopLine="22"/>
     646        <Filename Value="UMainForm.pas"/>
     647        <Caret Line="198" Column="1" TopLine="182"/>
    644648      </Position22>
    645649      <Position23>
    646         <Filename Value="../Units/GenericList.pas"/>
    647         <Caret Line="29" Column="1" TopLine="22"/>
     650        <Filename Value="UMainForm.pas"/>
     651        <Caret Line="199" Column="1" TopLine="182"/>
    648652      </Position23>
    649653      <Position24>
    650         <Filename Value="../Units/GenericList.pas"/>
    651         <Caret Line="35" Column="1" TopLine="22"/>
     654        <Filename Value="UMainForm.pas"/>
     655        <Caret Line="200" Column="1" TopLine="182"/>
    652656      </Position24>
    653657      <Position25>
    654         <Filename Value="../Units/GenericList.pas"/>
    655         <Caret Line="31" Column="30" TopLine="22"/>
     658        <Filename Value="UMainForm.pas"/>
     659        <Caret Line="201" Column="1" TopLine="182"/>
    656660      </Position25>
    657661      <Position26>
    658         <Filename Value="../Units/GenericList.pas"/>
    659         <Caret Line="64" Column="1" TopLine="48"/>
     662        <Filename Value="UMainForm.pas"/>
     663        <Caret Line="202" Column="1" TopLine="191"/>
    660664      </Position26>
    661665      <Position27>
    662         <Filename Value="../Units/GenericList.pas"/>
    663         <Caret Line="407" Column="77" TopLine="389"/>
     666        <Filename Value="UMainForm.pas"/>
     667        <Caret Line="203" Column="1" TopLine="191"/>
    664668      </Position27>
    665669      <Position28>
    666         <Filename Value="../Units/GenericList.pas"/>
    667         <Caret Line="62" Column="20" TopLine="55"/>
     670        <Filename Value="UMainForm.pas"/>
     671        <Caret Line="204" Column="1" TopLine="191"/>
    668672      </Position28>
    669673      <Position29>
    670         <Filename Value="../Units/GenericList.pas"/>
    671         <Caret Line="385" Column="21" TopLine="380"/>
     674        <Filename Value="UMainForm.pas"/>
     675        <Caret Line="205" Column="1" TopLine="191"/>
    672676      </Position29>
    673677      <Position30>
    674         <Filename Value="../Units/GenericList.pas"/>
    675         <Caret Line="64" Column="39" TopLine="51"/>
     678        <Filename Value="../Units/GenericStream.pas"/>
     679        <Caret Line="150" Column="3" TopLine="148"/>
    676680      </Position30>
    677681    </JumpHistory>
     
    722726  </CompilerOptions>
    723727  <Debugging>
     728    <BreakPoints Count="1">
     729      <Item1>
     730        <Kind Value="bpkSource"/>
     731        <WatchScope Value="wpsLocal"/>
     732        <WatchKind Value="wpkWrite"/>
     733        <Source Value="UMainForm.pas"/>
     734        <Line Value="205"/>
     735      </Item1>
     736    </BreakPoints>
    724737    <Exceptions Count="3">
    725738      <Item1>
  • Generics/NativeGenerics/Demo/UMainForm.pas

    r321 r322  
    77uses
    88  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
    9   ComCtrls, GenericList, GenericDictionary, GenericQueue,
     9  ComCtrls, GenericList, GenericDictionary, GenericQueue, GenericStream,
    1010  DateUtils, SpecializedList;
    1111
     
    162162var
    163163  Queue: TGQueue<Integer>;
    164   I: Integer;
    165164begin
    166165  ListViewOutput.Clear;
     
    183182procedure TMainForm.ButtonStreamByteClick(Sender: TObject);
    184183var
    185   Stream: TMemoryStreamByte;
     184  Stream: TGMemoryStream<Byte>;
    186185  I: Integer;
    187186  ByteArray: array of Byte;
     
    190189  ListViewOutput.Clear;
    191190  LabelTestName.Caption := 'TStreamByte test';
    192   Stream := TMemoryStreamByte.Create;
     191  Stream := TGMemoryStream<Byte>.Create;
    193192  with Stream do try
    194193    WriteOutput('Size := ', IntToStr(Stream.Size));
  • 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.