-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathframe.go
102 lines (92 loc) · 1.76 KB
/
frame.go
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
package main
type Frame struct {
buffer []float64
cap int
begin int
end int
empty bool
}
func NewFrame(n int) *Frame {
return &Frame{
buffer: make([]float64, n, n),
cap: n,
begin: 0,
end: 0,
empty: true,
}
}
func (f *Frame) Reset() {
f.begin = 0
f.end = 0
f.empty = true
}
func (f *Frame) Resize(n int) *Frame {
if n == f.cap {
return f
}
newF := NewFrame(n)
oldValues := f.Values()
nOldValues := len(oldValues)
minCap := nOldValues
if n < nOldValues {
minCap = n
}
for i := 0; i < minCap; i++ {
newF.InsertForward(oldValues[i])
}
return newF
}
func (f *Frame) index(n int) int {
result := n % f.cap
if result >= 0 {
return result
}
return result + f.cap
}
func (f *Frame) InsertForward(value float64) {
f.buffer[f.end] = value
/* Before update end, move forward begin when buffer is full */
if f.Len() >= f.cap {
f.begin = f.index(f.begin + 1)
}
f.end = f.index(f.end + 1)
f.empty = false
}
func (f *Frame) InsertBackward(value float64) {
begin := f.index(f.begin - 1)
f.buffer[begin] = value
/* Before update begi, move backward begin when buffer is full */
if f.Len() >= f.cap {
f.end = f.index(f.end - 1)
}
f.begin = begin
f.empty = false
}
func (f *Frame) Len() int {
if f.begin == f.end {
if f.empty {
return 0
}
return f.cap
}
if f.begin < f.end {
return f.end - f.begin
}
return f.cap - f.begin + f.end
}
func (f *Frame) Cap() int {
return f.cap
}
func (f *Frame) Values() []float64 {
if f.empty {
return []float64{}
}
if f.begin < f.end {
return append([]float64{}, f.buffer[f.begin:f.end]...)
}
if f.begin == f.end && f.begin == 0 {
return append([]float64{}, f.buffer...)
}
values := append([]float64{}, f.buffer[f.begin:]...)
return append(values, f.buffer[:f.end]...)
}