/
buf.go
83 lines (69 loc) · 1.41 KB
/
buf.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
package pktque
import (
"../av"
)
// Buf struct
type Buf struct {
Head, Tail BufPos
pkts []av.Packet
Size int
Count int
}
// NewBuf NewBuf
func NewBuf() *Buf {
return &Buf{
pkts: make([]av.Packet, 64),
}
}
// Pop Pop
func (inst *Buf) Pop() av.Packet {
if inst.Count == 0 {
panic("pktque.Buf: Pop() when count == 0")
}
i := int(inst.Head) & (len(inst.pkts) - 1)
pkt := inst.pkts[i]
inst.pkts[i] = av.Packet{}
inst.Size -= len(pkt.Data)
inst.Head++
inst.Count--
return pkt
}
func (inst *Buf) grow() {
newpkts := make([]av.Packet, len(inst.pkts)*2)
for i := inst.Head; i.LT(inst.Tail); i++ {
newpkts[int(i)&(len(newpkts)-1)] = inst.pkts[int(i)&(len(inst.pkts)-1)]
}
inst.pkts = newpkts
}
// Push func
func (inst *Buf) Push(pkt av.Packet) {
if inst.Count == len(inst.pkts) {
inst.grow()
}
inst.pkts[int(inst.Tail)&(len(inst.pkts)-1)] = pkt
inst.Tail++
inst.Count++
inst.Size += len(pkt.Data)
}
// Get packet
func (inst *Buf) Get(pos BufPos) av.Packet {
return inst.pkts[int(pos)&(len(inst.pkts)-1)]
}
// IsValidPos IsValidPos
func (inst *Buf) IsValidPos(pos BufPos) bool {
return pos.GE(inst.Head) && pos.LT(inst.Tail)
}
// BufPos type
type BufPos int
// LT check
func (inst BufPos) LT(pos BufPos) bool {
return inst-pos < 0
}
// GE check
func (inst BufPos) GE(pos BufPos) bool {
return inst-pos >= 0
}
// GT check
func (inst BufPos) GT(pos BufPos) bool {
return inst-pos > 0
}