112 lines
1.8 KiB
Go
112 lines
1.8 KiB
Go
package pktque
|
|
|
|
import (
|
|
"github.com/nareix/av"
|
|
"time"
|
|
)
|
|
|
|
// time
|
|
// -------------------->
|
|
//
|
|
// V-A-V-V-A-V-V-A-V-V
|
|
// | |
|
|
// head tail
|
|
// pop push
|
|
|
|
type Queue struct {
|
|
buf []av.Packet
|
|
head int
|
|
tail int
|
|
n int
|
|
size int
|
|
}
|
|
|
|
func (self *Queue) Push(pkt av.Packet) {
|
|
if self.size == self.n {
|
|
newsize := 0
|
|
if self.size == 0 {
|
|
newsize = 8
|
|
} else {
|
|
newsize = self.size*2
|
|
}
|
|
newbuf := make([]av.Packet, newsize)
|
|
for i := 0; i < self.n; i++ {
|
|
j := (self.head+i)%self.size
|
|
newbuf[i] = self.buf[j]
|
|
}
|
|
newbuf[self.n] = pkt
|
|
self.n++
|
|
self.buf = newbuf
|
|
self.size = newsize
|
|
self.head = 0
|
|
self.tail = self.n
|
|
} else {
|
|
self.buf[self.tail] = pkt
|
|
self.tail = (self.tail+1)%self.size
|
|
self.n++
|
|
}
|
|
}
|
|
|
|
func (self *Queue) Pop() (pkt av.Packet) {
|
|
if self.n == 0 {
|
|
return
|
|
}
|
|
pkt = self.buf[self.head]
|
|
self.head = (self.head+1)%self.size
|
|
self.n--
|
|
return
|
|
}
|
|
|
|
func (self *Queue) Head() (pkt av.Packet) {
|
|
return self.buf[self.head]
|
|
}
|
|
|
|
func (self *Queue) Tail() (pkt av.Packet) {
|
|
return self.buf[(self.tail-1+self.size)%self.size]
|
|
}
|
|
|
|
func (self *Queue) HeadIdx(diff int) (pkt av.Packet) {
|
|
i := (self.head+diff)%self.size
|
|
return self.buf[i]
|
|
}
|
|
|
|
func (self *Queue) TailIdx(diff int) (pkt av.Packet) {
|
|
i := (self.tail-1-diff+self.size)%self.size
|
|
return self.buf[i]
|
|
}
|
|
|
|
func (self *Queue) Count() int {
|
|
return self.n
|
|
}
|
|
|
|
type Queues []Queue
|
|
|
|
func (self Queues) MinTimeIdx() (minidx int) {
|
|
mintm := time.Duration(0)
|
|
minidx = -1
|
|
for i, que := range self {
|
|
if que.Count() > 0 {
|
|
headtm := que.Head().Time
|
|
if minidx == -1 || headtm < mintm {
|
|
minidx = i
|
|
mintm = headtm
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (self Queues) RemoveBeforeTime(tm time.Duration) {
|
|
for i := range self {
|
|
que := &self[i]
|
|
for que.Count() > 0 {
|
|
if que.Head().Time < tm {
|
|
que.Pop()
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|