joy4/pktque/queue.go
2016-06-22 19:25:45 +08:00

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
}
}
}
}