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  }