Sha256: 82896d4fe48961864c2e2aa5f1827f7105e252751318c97579c6a800ce24dc9b

Contents?: true

Size: 1.41 KB

Versions: 224

Compression:

Stored size: 1.41 KB

Contents

unit uCircularBuffer;

interface
uses System.SysUtils, System.Generics.Collections;

type
  ICircularBuffer<T> = interface(IInvokable)
  ['{E3531870-DA5D-451A-9E7A-86B1C46B4D29}']
    function Read: T;
    procedure Write(aValue: T);
    procedure ForceWrite(aValue: T);
    procedure Clear;
  end;

  TCircularBuffer<T> = class(TInterfacedObject, ICircularBuffer<T>)
  private
    FSize: integer;
    FBuffer: TQueue<T>;
  public
    constructor create(aSize: integer);
    destructor destroy;
    function Read: T;
    procedure Write(aValue: T);
    procedure ForceWrite(aValue: T);
    procedure Clear;
  end;

implementation

constructor TCircularBuffer<T>.Create(aSize: integer);
begin
  inherited create;
  FSize := aSize;
  FBuffer := TQueue<T>.Create;
end;

destructor TCircularBuffer<T>.Destroy;
begin
  FBuffer.Clear;
  FBuffer.Free;
  inherited;
end;

function TCircularBuffer<T>.Read: T;
begin
  if FBuffer.Count = 0 then
    raise EInvalidOpException.Create('Cannot read from empty buffer');

  result := FBuffer.Dequeue;
end;

procedure TCircularBuffer<T>.Write(aValue: T);
begin
  if FBuffer.Count = FSize then
    raise EInvalidOpException.Create('Cannot write to full buffer');

  FBuffer.Enqueue(aValue);
end;

procedure TCircularBuffer<T>.ForceWrite(aValue: T);
begin
  if FBuffer.Count = FSize then
    FBuffer.Dequeue;
  FBuffer.Enqueue(aValue);
end;

procedure TCircularBuffer<T>.Clear;
begin
  FBuffer.Clear;
end;

end.

Version data entries

224 entries across 224 versions & 1 rubygems

Version Path
trackler-2.2.1.56 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.55 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.54 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.53 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.52 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.51 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.50 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.49 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.48 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.47 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.46 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.45 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.44 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.43 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.42 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.41 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.40 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.39 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.38 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.37 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas