github.com/mavryk-network/mvgo@v1.19.9/mavryk/filter.go (about) 1 // Copyright (c) 2020-2021 Blockwatch Data Inc. 2 // Author: alex@blockwatch.cc 3 4 package mavryk 5 6 import ( 7 "github.com/mavryk-network/mvgo/hash" 8 ) 9 10 type AddressFilter struct { 11 set map[uint64]struct{} 12 } 13 14 func NewAddressFilter(addrs ...Address) *AddressFilter { 15 set := &AddressFilter{ 16 set: make(map[uint64]struct{}), 17 } 18 for _, v := range addrs { 19 set.Add(v) 20 } 21 return set 22 } 23 24 func (s AddressFilter) hash(addr Address) uint64 { 25 h := hash.NewInlineFNV64a() 26 h.Write(addr[:]) 27 return h.Sum64() 28 } 29 30 func (s *AddressFilter) AddUnique(addr Address) bool { 31 h := s.hash(addr) 32 _, ok := s.set[h] 33 s.set[h] = struct{}{} 34 return !ok 35 } 36 37 func (s *AddressFilter) Add(addr Address) { 38 s.set[s.hash(addr)] = struct{}{} 39 } 40 41 func (s *AddressFilter) Remove(addr Address) { 42 delete(s.set, s.hash(addr)) 43 } 44 45 func (s AddressFilter) Contains(addr Address) bool { 46 if len(s.set) == 0 { 47 return false 48 } 49 _, ok := s.set[s.hash(addr)] 50 return ok 51 } 52 53 func (s *AddressFilter) Merge(b *AddressFilter) { 54 for n := range b.set { 55 s.set[n] = struct{}{} 56 } 57 } 58 59 func (s *AddressFilter) Len() int { 60 return len(s.set) 61 }