circular_buffer.pas
2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
{ 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.