mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-29 08:03:48 +00:00
* port changes from #1013 * port changes from #1068 * go.mod tidy * fix compile error * fix goimports * fix log * address review comments * upgrade golang.org/x/net to 0.23.0 * port changes from #1018 * fix tests and linter errors * address review comments
90 lines
1.7 KiB
Go
90 lines
1.7 KiB
Go
package common
|
|
|
|
type HeapMap[K comparable, T Comparable[T]] struct {
|
|
h *Heap[T]
|
|
m *ShrinkingMap[K, *HeapElement[T]]
|
|
keyFromElement func(T) K
|
|
}
|
|
|
|
func NewHeapMap[K comparable, T Comparable[T]](keyFromElement func(T) K) *HeapMap[K, T] {
|
|
return &HeapMap[K, T]{
|
|
h: NewHeap[T](),
|
|
m: NewShrinkingMap[K, *HeapElement[T]](1000),
|
|
keyFromElement: keyFromElement,
|
|
}
|
|
}
|
|
|
|
func (hm *HeapMap[K, T]) Len() int {
|
|
return hm.h.Len()
|
|
}
|
|
|
|
func (hm *HeapMap[K, T]) Push(element T) bool {
|
|
k := hm.keyFromElement(element)
|
|
|
|
if hm.m.Has(k) {
|
|
return false
|
|
}
|
|
|
|
heapElement := hm.h.Push(element)
|
|
hm.m.Set(k, heapElement)
|
|
|
|
return true
|
|
}
|
|
|
|
func (hm *HeapMap[K, T]) Pop() T {
|
|
element := hm.h.Pop()
|
|
k := hm.keyFromElement(element.Value())
|
|
hm.m.Delete(k)
|
|
|
|
return element.Value()
|
|
}
|
|
|
|
func (hm *HeapMap[K, T]) Peek() T {
|
|
return hm.h.Peek().Value()
|
|
}
|
|
|
|
func (hm *HeapMap[K, T]) RemoveByElement(element T) bool {
|
|
key := hm.keyFromElement(element)
|
|
heapElement, exists := hm.m.Get(key)
|
|
if !exists {
|
|
return false
|
|
}
|
|
|
|
hm.h.Remove(heapElement)
|
|
hm.m.Delete(key)
|
|
|
|
return true
|
|
}
|
|
|
|
func (hm *HeapMap[K, T]) RemoveByKey(key K) bool {
|
|
heapElement, exists := hm.m.Get(key)
|
|
if !exists {
|
|
return false
|
|
}
|
|
|
|
hm.h.Remove(heapElement)
|
|
hm.m.Delete(key)
|
|
|
|
return true
|
|
}
|
|
|
|
func (hm *HeapMap[K, T]) Clear() {
|
|
hm.h.Clear()
|
|
hm.m = NewShrinkingMap[K, *HeapElement[T]](1000)
|
|
}
|
|
|
|
func (hm *HeapMap[K, T]) Keys() []K {
|
|
return hm.m.Keys()
|
|
}
|
|
|
|
func (hm *HeapMap[K, T]) Elements() []T {
|
|
var elements []T
|
|
for _, element := range hm.m.Values() {
|
|
elements = append(elements, element.Value())
|
|
}
|
|
return elements
|
|
}
|
|
|
|
func (hm *HeapMap[K, T]) Has(element T) bool {
|
|
return hm.m.Has(hm.keyFromElement(element))
|
|
}
|