summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-maps/ordered.go
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2025-03-09 17:47:56 +0100
committerLibravatar Terin Stock <terinjokes@gmail.com>2025-03-10 01:59:49 +0100
commit3ac1ee16f377d31a0fb80c8dae28b6239ac4229e (patch)
treef61faa581feaaeaba2542b9f2b8234a590684413 /vendor/codeberg.org/gruf/go-maps/ordered.go
parent[chore] update URLs to forked source (diff)
downloadgotosocial-3ac1ee16f377d31a0fb80c8dae28b6239ac4229e.tar.xz
[chore] remove vendor
Diffstat (limited to 'vendor/codeberg.org/gruf/go-maps/ordered.go')
-rw-r--r--vendor/codeberg.org/gruf/go-maps/ordered.go159
1 files changed, 0 insertions, 159 deletions
diff --git a/vendor/codeberg.org/gruf/go-maps/ordered.go b/vendor/codeberg.org/gruf/go-maps/ordered.go
deleted file mode 100644
index ca8ebe8a0..000000000
--- a/vendor/codeberg.org/gruf/go-maps/ordered.go
+++ /dev/null
@@ -1,159 +0,0 @@
-package maps
-
-import (
- "fmt"
- "reflect"
-)
-
-// OrderedMap provides a hashmap implementation that tracks the order in which keys are added.
-type OrderedMap[K comparable, V any] struct {
- ordered[K, V]
-}
-
-// NewOrdered returns a new instance of LRUMap with given initializing length and maximum capacity.
-func NewOrdered[K comparable, V any](len int) *OrderedMap[K, V] {
- m := new(OrderedMap[K, V])
- m.Init(len)
- return m
-}
-
-// Init will initialize this map with initial length.
-func (m *OrderedMap[K, V]) Init(len int) {
- if m.pool != nil {
- panic("ordered map already initialized")
- }
- m.ordered.hmap = make(map[K]*elem[K, V], len)
- m.ordered.pool = allocElems[K, V](len)
-}
-
-// Get will fetch value for given key from map. Returns false if not found.
-func (m *OrderedMap[K, V]) Get(key K) (V, bool) {
- if elem, ok := m.hmap[key]; ok {
- return elem.V, true
- }
- var z V // zero value
- return z, false
-}
-
-// Add will add the given key-value pair to the map, returns false if already exists.
-func (m *OrderedMap[K, V]) Add(key K, value V) bool {
- // Ensure safe
- m.write_check()
-
- // Look for existing elem
- elem, ok := m.hmap[key]
- if ok {
- return false
- }
-
- // Allocate elem
- elem = m.alloc()
- elem.K = key
- elem.V = value
-
- // Add element map entry
- m.hmap[key] = elem
-
- // Push to back of list
- m.list.PushBack(elem)
- return true
-}
-
-// Set will ensure that given key-value pair exists in the map, by either adding new or updating existing.
-func (m *OrderedMap[K, V]) Set(key K, value V) {
- // Ensure safe
- m.write_check()
-
- // Look for existing elem
- elem, ok := m.hmap[key]
-
- if ok {
- // Update existing
- elem.V = value
- } else {
- // Allocate elem
- elem = m.alloc()
- elem.K = key
- elem.V = value
-
- // Add element map entry
- m.hmap[key] = elem
-
- // Push to back of list
- m.list.PushBack(elem)
- }
-}
-
-// Index returns the key-value pair at index from map. Returns false if index out of range.
-func (m *OrderedMap[K, V]) Index(idx int) (K, V, bool) {
- if idx < 0 || idx >= m.list.len {
- var (
- zk K
- zv V
- ) // zero values
- return zk, zv, false
- }
- elem := m.list.Index(idx)
- return elem.K, elem.V, true
-}
-
-// Push will insert the given key-value pair at index in the map. Panics if index out of range.
-func (m *OrderedMap[K, V]) Push(idx int, key K, value V) {
- // Check index within bounds of map
- if idx < 0 || idx >= m.list.len {
- panic("index out of bounds")
- }
-
- // Ensure safe
- m.write_check()
-
- // Get element at index
- next := m.list.Index(idx)
-
- // Allocate new elem
- elem := m.alloc()
- elem.K = key
- elem.V = value
-
- // Add element map entry
- m.hmap[key] = elem
-
- // Move next forward
- elem.next = next
- elem.prev = next.prev
-
- // Link up elem in chain
- next.prev.next = elem
- next.prev = elem
-}
-
-// Pop will remove and return the key-value pair at index in the map. Panics if index out of range.
-func (m *OrderedMap[K, V]) Pop(idx int) (K, V) {
- // Check index within bounds of map
- if idx < 0 || idx >= m.list.len {
- panic("index out of bounds")
- }
-
- // Ensure safe
- m.write_check()
-
- // Get element at index
- elem := m.list.Index(idx)
-
- // Unlink elem from list
- m.list.Unlink(elem)
-
- // Get elem values
- k := elem.K
- v := elem.V
-
- // Release to pool
- m.free(elem)
-
- return k, v
-}
-
-// Format implements fmt.Formatter, allowing performant string formatting of map.
-func (m *OrderedMap[K, V]) Format(state fmt.State, verb rune) {
- m.format(reflect.TypeOf(m), state, verb)
-}