diff options
| author | 2025-01-14 14:23:28 +0000 | |
|---|---|---|
| committer | 2025-01-14 14:23:28 +0000 | |
| commit | b8ef9fc4bcccc6c024edaa8e9c91a6bf87f83dd9 (patch) | |
| tree | 68eaf966c80237e18993e887c8583355f0943ca7 /vendor/github.com/uptrace/bun/internal/ordered | |
| parent | [chore] better dns validation (#3644) (diff) | |
| download | gotosocial-b8ef9fc4bcccc6c024edaa8e9c91a6bf87f83dd9.tar.xz | |
bump uptrace/bun dependencies from 1.2.6 to 1.2.8 (#3645)
Diffstat (limited to 'vendor/github.com/uptrace/bun/internal/ordered')
| -rw-r--r-- | vendor/github.com/uptrace/bun/internal/ordered/map.go | 125 | 
1 files changed, 125 insertions, 0 deletions
diff --git a/vendor/github.com/uptrace/bun/internal/ordered/map.go b/vendor/github.com/uptrace/bun/internal/ordered/map.go new file mode 100644 index 000000000..d5e4f7d9d --- /dev/null +++ b/vendor/github.com/uptrace/bun/internal/ordered/map.go @@ -0,0 +1,125 @@ +package ordered + +// Pair represents a key-value pair in the ordered map. +type Pair[K comparable, V any] struct { +	Key   K +	Value V + +	next, prev *Pair[K, V] // Pointers to the next and previous pairs in the linked list. +} + +// Map represents an ordered map. +type Map[K comparable, V any] struct { +	root *Pair[K, V] // Sentinel node for the circular doubly linked list. +	zero V           // Zero value for the value type. + +	pairs map[K]*Pair[K, V] // Map from keys to pairs. +} + +// NewMap creates a new ordered map with optional initial data. +func NewMap[K comparable, V any](initialData ...Pair[K, V]) *Map[K, V] { +	m := &Map[K, V]{} +	m.Clear() +	for _, pair := range initialData { +		m.Store(pair.Key, pair.Value) +	} +	return m +} + +// Clear removes all pairs from the map. +func (m *Map[K, V]) Clear() { +	if m.root != nil { +		m.root.next, m.root.prev = nil, nil // avoid memory leaks +	} +	for _, pair := range m.pairs { +		pair.next, pair.prev = nil, nil // avoid memory leaks +	} +	m.root = &Pair[K, V]{} +	m.root.next, m.root.prev = m.root, m.root +	m.pairs = make(map[K]*Pair[K, V]) +} + +// Len returns the number of pairs in the map. +func (m *Map[K, V]) Len() int { +	return len(m.pairs) +} + +// Load returns the value associated with the key, and a boolean indicating if the key was found. +func (m *Map[K, V]) Load(key K) (V, bool) { +	if pair, present := m.pairs[key]; present { +		return pair.Value, true +	} +	return m.zero, false +} + +// Value returns the value associated with the key, or the zero value if the key is not found. +func (m *Map[K, V]) Value(key K) V { +	if pair, present := m.pairs[key]; present { +		return pair.Value +	} +	return m.zero +} + +// Store adds or updates a key-value pair in the map. +func (m *Map[K, V]) Store(key K, value V) { +	if pair, present := m.pairs[key]; present { +		pair.Value = value +		return +	} + +	pair := &Pair[K, V]{Key: key, Value: value} +	pair.prev = m.root.prev +	m.root.prev.next = pair +	m.root.prev = pair +	pair.next = m.root +	m.pairs[key] = pair +} + +// Delete removes a key-value pair from the map. +func (m *Map[K, V]) Delete(key K) { +	if pair, present := m.pairs[key]; present { +		pair.prev.next = pair.next +		pair.next.prev = pair.prev +		pair.next, pair.prev = nil, nil // avoid memory leaks +		delete(m.pairs, key) +	} +} + +// Range calls the given function for each key-value pair in the map in order. +func (m *Map[K, V]) Range(yield func(key K, value V) bool) { +	for pair := m.root.next; pair != m.root; pair = pair.next { +		if !yield(pair.Key, pair.Value) { +			break +		} +	} +} + +// Keys returns a slice of all keys in the map in order. +func (m *Map[K, V]) Keys() []K { +	keys := make([]K, 0, len(m.pairs)) +	m.Range(func(key K, _ V) bool { +		keys = append(keys, key) +		return true +	}) +	return keys +} + +// Values returns a slice of all values in the map in order. +func (m *Map[K, V]) Values() []V { +	values := make([]V, 0, len(m.pairs)) +	m.Range(func(_ K, value V) bool { +		values = append(values, value) +		return true +	}) +	return values +} + +// Pairs returns a slice of all key-value pairs in the map in order. +func (m *Map[K, V]) Pairs() []Pair[K, V] { +	pairs := make([]Pair[K, V], 0, len(m.pairs)) +	m.Range(func(key K, value V) bool { +		pairs = append(pairs, Pair[K, V]{Key: key, Value: value}) +		return true +	}) +	return pairs +}  | 
