unit dpgrtl.tokenqueue; interface uses System.Classes, dpgrtl.types; type TTokenQueue = class( TInterfacedObject) private fItems : TInterfaceList; private function GetCount : integer; function GetItem(i:integer): IToken; procedure SetItem(i:integer;value:IToken); public procedure Clear; procedure Add( Item: IToken); procedure Remove( Num: integer=1); public procedure AfterConstruction; override; procedure BeforeDestruction; override; public property Count : integer read GetCount; property Items[i:integer] : IToken read GetItem write SetItem; end; implementation uses System.SysUtils; { TTokenQueue } // @@@: Construction/destruction ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Construction/destruction // // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ================================================================================================ // After Construction // ================================================================================================ procedure TTokenQueue.AfterConstruction; begin inherited; fItems := TInterfaceList.Create; end; // ================================================================================================ // Before Destruction // ================================================================================================ procedure TTokenQueue.BeforeDestruction; begin FreeAndNil(fItems); inherited; end; // @@@: Interface +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Interface // // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ================================================================================================ // Clear // ================================================================================================ procedure TTokenQueue.Clear; begin fItems.Clear; end; // ================================================================================================ // Add // ================================================================================================ procedure TTokenQueue.Add(Item: IToken); begin if Assigned(Item) then fItems.Add(Item) end; // ================================================================================================ // Remove // ================================================================================================ procedure TTokenQueue.Remove(Num: integer); var i: integer; begin if Num > 0 then begin if Num >= fItems.Count then fItems.Clear else for i:=0 to Num -1 do fItems.Delete(0) end end; // @@@: Property Handlers +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Property Handlers // // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ================================================================================================ // Get Count // ================================================================================================ function TTokenQueue.GetCount: integer; begin result := fItems.Count end; // ================================================================================================ // Get Item // ================================================================================================ function TTokenQueue.GetItem(i: integer): IToken; begin // ------------------------------------------------------------------------- // Check for valid index value. // ------------------------------------------------------------------------- if i > fItems.Count then raise ERangeError.CreateFmt( 'Index "%d" is too big', [i]); if i < 0 then raise ERangeError.CreateFmt( 'Index is less than 0', []); result := fItems[i] as IToken end; // ================================================================================================ // Set Item // ================================================================================================ procedure TTokenQueue.SetItem(i: integer; value: IToken); begin if i > fItems.Count then raise ERangeError.CreateFmt( 'Index "%d" is too big', [i]); if i < 0 then raise ERangeError.CreateFmt( 'Index is less than 0', []); fItems.Items[i] := value end; end.