github.com/Mericusta/go-stp@v0.6.8/map.go (about) 1 package stp 2 3 import "fmt" 4 5 func Key[K comparable, V any](tm map[K]V) []K { 6 ks, i := make([]K, len(tm)), 0 7 for k := range tm { 8 ks[i] = k 9 i++ 10 } 11 return ks 12 } 13 14 type Map[K comparable, V any] struct { 15 m map[K]V 16 l int 17 c int 18 } 19 20 func NewMap[K comparable, V any]() *Map[K, V] { 21 return &Map[K, V]{m: make(map[K]V)} 22 } 23 24 func (m *Map[K, V]) Set(k K, v V) { 25 if _, has := m.m[k]; !has { 26 m.l++ 27 m.c++ 28 } 29 m.m[k] = v 30 } 31 32 func (m *Map[K, V]) Del(k K) { 33 if _, has := m.m[k]; has { 34 m.l-- 35 if (float64(m.l) * 6.5) < float64(m.c) { 36 nm := make(map[K]V, len(m.m)-1) 37 for k, v := range m.m { 38 nm[k] = v 39 } 40 m.m = nm 41 m.c = m.l 42 fmt.Printf("reload\n") 43 } 44 } 45 delete(m.m, k) 46 } 47 48 func (m Map[K, V]) Get(k K) (V, bool) { 49 v, has := m.m[k] 50 return v, has 51 } 52 53 func (m Map[K, V]) Key() []K { 54 return Key(m.m) 55 } 56 57 func (m Map[K, V]) Range(f func(K, V) bool) { 58 if f != nil { 59 for k, v := range m.m { 60 if !f(k, v) { 61 return 62 } 63 } 64 } 65 } 66 67 func (m Map[K, V]) Len() int { 68 return m.l 69 }