158 lines
5.8 KiB
ObjectPascal
158 lines
5.8 KiB
ObjectPascal
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.
|