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  }