Sha256: ebf46431f0d5ff5f54a58ae2a01cdaee36bbd6ca1c0023ef16c254861f66be6e

Contents?: true

Size: 1.41 KB

Versions: 122

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 OverWrite(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 OverWrite(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>.OverWrite(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

122 entries across 122 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.179 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.178 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.177 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.176 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.175 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.174 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.173 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.172 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.171 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.170 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.169 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.167 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.166 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.165 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.164 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.163 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.162 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.161 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas
trackler-2.2.1.160 tracks/delphi/exercises/circular-buffer/uCircularBufferExample.pas