107 lines
2.4 KiB
ObjectPascal
107 lines
2.4 KiB
ObjectPascal
{ Copyright (c) 2024 Xiaomi Corporation }
|
|
program circular_buffer;
|
|
{
|
|
This file shows how to use the CircularBuffer API of sherpa-onnx
|
|
}
|
|
|
|
{$mode objfpc}
|
|
{$ASSERTIONS ON}
|
|
|
|
uses
|
|
sherpa_onnx;
|
|
|
|
var
|
|
Buffer: TSherpaOnnxCircularBuffer;
|
|
Samples: TSherpaOnnxSamplesArray;
|
|
begin
|
|
{The initial capacity is 5. It will be resized automatically if needed.}
|
|
Buffer := TSherpaOnnxCircularBuffer.Create(5);
|
|
Assert(Buffer.Size = 0);
|
|
Assert(Buffer.Head = 0);
|
|
Buffer.Push([0, 10, 20]);
|
|
|
|
{Push() changes Size. Head is not changed.}
|
|
Assert(Buffer.Size = 3);
|
|
Assert(Buffer.Head = 0);
|
|
|
|
Samples := Buffer.Get(0, 1);
|
|
Assert(Length(Samples) = 1);
|
|
Assert(Samples[0] = 0);
|
|
|
|
{ Get() does not change Size or Head}
|
|
Assert(Buffer.Size = 3);
|
|
Assert(Buffer.Head = 0);
|
|
|
|
Samples := Buffer.Get(0, 2);
|
|
Assert(Length(Samples) = 2);
|
|
Assert(Samples[0] = 0);
|
|
Assert(Samples[1] = 10);
|
|
|
|
{ The buffer will be resized since its initial capacity is 5 but we have
|
|
pushed 7 elements into it.
|
|
|
|
No data is lost during the resize.
|
|
}
|
|
Buffer.Push([30, 40, 50, 60]);
|
|
|
|
Assert(Buffer.Size = 7); {There are now 7 elements}
|
|
Assert(Buffer.Head = 0);
|
|
|
|
{Remove the first 4 elements}
|
|
Buffer.Pop(4);
|
|
|
|
Assert(Buffer.Size = 3); {There are only 3 elements left}
|
|
Assert(Buffer.Head = 4);
|
|
|
|
Samples := Buffer.Get(Buffer.Head, 2);
|
|
Assert(Length(Samples) = 2);
|
|
Assert(Samples[0] = 40);
|
|
Assert(Samples[1] = 50);
|
|
|
|
Buffer.Pop(1);
|
|
|
|
Assert(Buffer.Size = 2); {There are only 2 elements left}
|
|
Assert(Buffer.Head = 5);
|
|
|
|
Samples := Buffer.Get(Buffer.Head, 2);
|
|
Assert(Length(Samples) = 2);
|
|
Assert(Samples[0] = 50);
|
|
Assert(Samples[1] = 60);
|
|
|
|
Buffer.Pop(2);
|
|
Assert(Buffer.Size = 0); {There are no elements left}
|
|
Assert(Buffer.Head = 7);
|
|
|
|
Buffer.Push([100, 200, 300, 400, 500]);
|
|
Assert(Buffer.Size = 5);
|
|
Assert(Buffer.Head = 7);
|
|
|
|
Buffer.Pop(4);
|
|
Assert(Buffer.Size = 1);
|
|
|
|
{Head can be larger than the Capacity!
|
|
This is what circular means. It points to Buffer.Head / Capacity.
|
|
}
|
|
Assert(Buffer.Head = 11);
|
|
Buffer.Push([600, 700]);
|
|
|
|
Assert(Buffer.Size = 3);
|
|
Assert(Buffer.Head = 11);
|
|
|
|
Samples := Buffer.Get(Buffer.Head, 3);
|
|
Assert(Length(Samples) = 3);
|
|
Assert(Samples[0] = 500);
|
|
Assert(Samples[1] = 600);
|
|
Assert(Samples[2] = 700);
|
|
|
|
Buffer.Pop(3);
|
|
Assert(Buffer.Size = 0);
|
|
Assert(Buffer.Head = 14);
|
|
|
|
Buffer.Reset();
|
|
|
|
Assert(Buffer.Size = 0);
|
|
Assert(Buffer.Head = 0);
|
|
end.
|
|
|