go-common/app/service/live/broadcast-proxy/dispatch/min_heap.go

80 lines
1.3 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package dispatch
import (
"container/heap"
"errors"
)
type HeapData []*HeapDataItem
type HeapDataItem struct {
value interface{}
weight float64
}
func (d HeapData) Len() int {
return len(d)
}
func (d HeapData) Swap(i, j int) {
d[i], d[j] = d[j], d[i]
}
func (d *HeapData) Push(x interface{}) {
item := x.(*HeapDataItem)
*d = append(*d, item)
}
func (d *HeapData) Pop() interface{} {
old := *d
n := len(old)
item := old[n-1]
*d = old[0 : n-1]
return item
}
type MinHeapData struct {
HeapData
}
func (d MinHeapData) Less(i, j int) bool {
return d.HeapData[i].weight < d.HeapData[j].weight
}
type MinHeap struct {
data MinHeapData
}
func NewMinHeap() *MinHeap {
h := new(MinHeap)
heap.Init(&h.data)
return h
}
func (h *MinHeap) HeapPush(value interface{}, weight float64) {
heap.Push(&h.data, &HeapDataItem{
value: value,
weight: weight,
})
}
func (h *MinHeap) HeapPop() (interface{}, float64, error) {
if h.data.Len() == 0 {
return nil, 0, errors.New("heap is empty")
}
item := heap.Pop(&h.data).(*HeapDataItem)
return item.value, item.weight, nil
}
func (h *MinHeap) HeapTop() (interface{}, float64, error) {
if h.data.Len() == 0 {
return nil, 0, errors.New("heap is empty")
}
item := h.data.HeapData[0]
return item.value, item.weight, nil
}
func (h *MinHeap) HeapLength() int {
return h.data.Len()
}