mirror of
https://github.com/charlienet/go-mixed.git
synced 2025-07-18 08:32:40 +08:00
iter
This commit is contained in:
@ -49,6 +49,17 @@ func (m *ConcurrnetMap[K, V]) Exist(key K) bool {
|
||||
return mm.Exist(key)
|
||||
}
|
||||
|
||||
func (m *ConcurrnetMap[K, V]) Iter() <-chan *Entry[K, V] {
|
||||
num := int(m.numOfBuckets)
|
||||
ch := make(chan *Entry[K, V], m.Count())
|
||||
for i := 0; i < num; i++ {
|
||||
c := m.buckets[i].Iter()
|
||||
ch <- <-c
|
||||
}
|
||||
|
||||
return ch
|
||||
}
|
||||
|
||||
func (m *ConcurrnetMap[K, V]) ForEach(f func(K, V)) {
|
||||
var wg sync.WaitGroup
|
||||
|
||||
|
@ -34,6 +34,22 @@ func (m *hashMap[K, V]) Exist(key K) bool {
|
||||
return ok
|
||||
}
|
||||
|
||||
func (m *hashMap[K, V]) Iter() <-chan *Entry[K, V] {
|
||||
ch := make(chan *Entry[K, V], m.Count())
|
||||
go func() {
|
||||
for k, v := range m.m {
|
||||
ch <- &Entry[K, V]{
|
||||
Key: k,
|
||||
Value: v,
|
||||
}
|
||||
}
|
||||
|
||||
close(ch)
|
||||
}()
|
||||
|
||||
return ch
|
||||
}
|
||||
|
||||
func (m *hashMap[K, V]) ForEach(f func(K, V)) {
|
||||
for k, v := range m.m {
|
||||
f(k, v)
|
||||
|
@ -10,5 +10,11 @@ type Map[K constraints.Ordered, V any] interface {
|
||||
Clone() Map[K, V]
|
||||
Clear()
|
||||
Count() int
|
||||
Iter() <-chan *Entry[K, V]
|
||||
ForEach(f func(K, V))
|
||||
}
|
||||
|
||||
type Entry[K constraints.Ordered, V any] struct {
|
||||
Key K
|
||||
Value V
|
||||
}
|
||||
|
@ -49,6 +49,13 @@ func (m *rw_map[K, V]) Count() int {
|
||||
return m.m.Count()
|
||||
}
|
||||
|
||||
func (m *rw_map[K, V]) Iter() <-chan *Entry[K, V] {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
|
||||
return m.m.Iter()
|
||||
}
|
||||
|
||||
func (m *rw_map[K, V]) ForEach(f func(K, V)) {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
|
@ -64,6 +64,23 @@ func (m *sorted_map[K, V]) Clone() Map[K, V] {
|
||||
return &sorted_map[K, V]{maps: m.maps.Clone(), keys: getKeys(m.maps)}
|
||||
}
|
||||
|
||||
func (m *sorted_map[K, V]) Iter() <-chan *Entry[K, V] {
|
||||
c := make(chan *Entry[K, V], m.Count())
|
||||
go func() {
|
||||
for _, k := range m.keys {
|
||||
v, _ := m.maps.Get(k)
|
||||
|
||||
c <- &Entry[K, V]{
|
||||
Key: k,
|
||||
Value: v,
|
||||
}
|
||||
}
|
||||
close(c)
|
||||
}()
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
func (m *sorted_map[K, V]) ForEach(f func(K, V)) {
|
||||
m.maps.ForEach(f)
|
||||
}
|
||||
|
Reference in New Issue
Block a user