Files
bds.mr.dpg/src.rtl/dpgrtl.tokenqueue.pas
T
2026-01-03 18:32:50 +01:00

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.