mirror of
https://github.com/charlienet/go-mixed.git
synced 2025-07-18 00:22:41 +08:00
52 lines
787 B
Go
52 lines
787 B
Go
package bloom
|
|
|
|
import (
|
|
"github.com/bits-and-blooms/bitset"
|
|
"github.com/charlienet/go-mixed/locker"
|
|
)
|
|
|
|
type memStore struct {
|
|
size uint
|
|
set *bitset.BitSet // 内存位图
|
|
lock locker.RWLocker // 同步锁
|
|
}
|
|
|
|
func newMemStore(size uint) *memStore {
|
|
return &memStore{
|
|
size: size,
|
|
set: bitset.New(size),
|
|
lock: locker.NewRWLocker(),
|
|
}
|
|
}
|
|
|
|
func (s *memStore) Clear() {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
|
|
s.set.ClearAll()
|
|
}
|
|
|
|
func (s *memStore) Set(offsets ...uint) error {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
|
|
for _, p := range offsets {
|
|
s.set.Set(p)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *memStore) Test(offsets ...uint) (bool, error) {
|
|
s.lock.RLock()
|
|
defer s.lock.RUnlock()
|
|
|
|
for _, p := range offsets {
|
|
if !s.set.Test(p) {
|
|
return false, nil
|
|
}
|
|
}
|
|
|
|
return true, nil
|
|
}
|