github.com/decred/dcrlnd@v0.7.6/queue/priority_queue.go (about)

     1  package queue
     2  
     3  import (
     4  	"container/heap"
     5  )
     6  
     7  // PriorityQueueItem is an interface that represents items in a PriorityQueue.
     8  // Users of PriorityQueue will need to define a Less function such that
     9  // PriorityQueue will be able to use that to build and restore an underlying
    10  // heap.
    11  type PriorityQueueItem interface {
    12  	// Less must return true if this item is ordered before other and false
    13  	// otherwise.
    14  	Less(other PriorityQueueItem) bool
    15  }
    16  
    17  type priorityQueue []PriorityQueueItem
    18  
    19  // Len returns the length of the priorityQueue.
    20  func (pq priorityQueue) Len() int { return len(pq) }
    21  
    22  // Less is used to order PriorityQueueItem items in the queue.
    23  func (pq priorityQueue) Less(i, j int) bool {
    24  	return pq[i].Less(pq[j])
    25  }
    26  
    27  // Swap swaps two items in the priorityQueue. Swap is used by heap.Interface.
    28  func (pq priorityQueue) Swap(i, j int) {
    29  	pq[i], pq[j] = pq[j], pq[i]
    30  }
    31  
    32  // Push adds a new item the the priorityQueue.
    33  func (pq *priorityQueue) Push(x interface{}) {
    34  	item := x.(PriorityQueueItem)
    35  	*pq = append(*pq, item)
    36  }
    37  
    38  // Pop removes the top item from the priorityQueue.
    39  func (pq *priorityQueue) Pop() interface{} {
    40  	old := *pq
    41  	n := len(old)
    42  	item := old[n-1]
    43  	old[n-1] = nil
    44  	*pq = old[0 : n-1]
    45  	return item
    46  }
    47  
    48  // PriorityQueue wraps a standard heap into a self contained class.
    49  type PriorityQueue struct {
    50  	queue priorityQueue
    51  }
    52  
    53  // Len returns the length of the queue.
    54  func (pq *PriorityQueue) Len() int {
    55  	return len(pq.queue)
    56  }
    57  
    58  // Empty returns true if the queue is empty.
    59  func (pq *PriorityQueue) Empty() bool {
    60  	return len(pq.queue) == 0
    61  }
    62  
    63  // Push adds an item to the priority queue.
    64  func (pq *PriorityQueue) Push(item PriorityQueueItem) {
    65  	heap.Push(&pq.queue, item)
    66  }
    67  
    68  // Pop removes the top most item from the queue.
    69  func (pq *PriorityQueue) Pop() PriorityQueueItem {
    70  	return heap.Pop(&pq.queue).(PriorityQueueItem)
    71  }
    72  
    73  // Top returns the top most item from the queue without removing it.
    74  func (pq *PriorityQueue) Top() PriorityQueueItem {
    75  	return pq.queue[0]
    76  }