diff --git a/common/heap.go b/common/heap.go new file mode 100644 index 00000000..dd2497b7 --- /dev/null +++ b/common/heap.go @@ -0,0 +1,87 @@ +package common + +import ( + "container/heap" +) + +type Heap struct { + pq priorityQueue +} + +func NewHeap() *Heap { + return &Heap{pq:make([]*pqItem, 0)} +} + +func (h *Heap) Len() int { + return len(h.pq) +} + +func (h *Heap) Push(value interface{}, priority int) { + heap.Push(&h.pq, &pqItem{value:value, priority:priority}) +} + +func (h *Heap) Pop() interface{} { + item := heap.Pop(&h.pq).(*pqItem) + return item.value +} + +/* +func main() { + h := NewHeap() + + h.Push(String("msg1"), 1) + h.Push(String("msg3"), 3) + h.Push(String("msg2"), 2) + + fmt.Println(h.Pop()) + fmt.Println(h.Pop()) + fmt.Println(h.Pop()) +} +*/ + +/////////////////////// +// From: http://golang.org/pkg/container/heap/#example__priorityQueue + +type pqItem struct { + value interface{} + priority int + index int +} + +type priorityQueue []*pqItem + +func (pq priorityQueue) Len() int { return len(pq) } + +func (pq priorityQueue) Less(i, j int) bool { + return pq[i].priority < pq[j].priority +} + +func (pq priorityQueue) Swap(i, j int) { + pq[i], pq[j] = pq[j], pq[i] + pq[i].index = i + pq[j].index = j +} + +func (pq *priorityQueue) Push(x interface{}) { + n := len(*pq) + item := x.(*pqItem) + item.index = n + *pq = append(*pq, item) +} + +func (pq *priorityQueue) Pop() interface{} { + old := *pq + n := len(old) + item := old[n-1] + item.index = -1 // for safety + *pq = old[0 : n-1] + return item +} + +func (pq *priorityQueue) Update(item *pqItem, value ByteSlice, priority int) { + heap.Remove(pq, item.index) + item.value = value + item.priority = priority + heap.Push(pq, item) +} + diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..56dcea0a --- /dev/null +++ b/docs/README.md @@ -0,0 +1,3 @@ +## Reading list + +* https://cryptonote.org/whitepaper.pdf