github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/utils/eventid/eventid.go (about) 1 package eventid 2 3 import ( 4 "sync" 5 6 "github.com/unicornultrafoundation/go-helios/hash" 7 "github.com/unicornultrafoundation/go-helios/native/idx" 8 ) 9 10 type Cache struct { 11 ids map[hash.Event]bool 12 mu sync.RWMutex 13 maxSize int 14 epoch idx.Epoch 15 } 16 17 func NewCache(maxSize int) *Cache { 18 return &Cache{ 19 maxSize: maxSize, 20 } 21 } 22 23 func (c *Cache) Reset(epoch idx.Epoch) { 24 c.mu.Lock() 25 defer c.mu.Unlock() 26 c.ids = make(map[hash.Event]bool) 27 c.epoch = epoch 28 } 29 30 func (c *Cache) Has(id hash.Event) (has bool, ok bool) { 31 c.mu.RLock() 32 defer c.mu.RUnlock() 33 34 if c.ids == nil { 35 return false, false 36 } 37 if c.epoch != id.Epoch() { 38 return false, false 39 } 40 return c.ids[id], true 41 } 42 43 func (c *Cache) Add(id hash.Event) bool { 44 c.mu.Lock() 45 defer c.mu.Unlock() 46 47 if c.ids == nil { 48 return false 49 } 50 if c.epoch != id.Epoch() { 51 return false 52 } 53 if len(c.ids) >= c.maxSize { 54 c.ids = nil 55 return false 56 } 57 c.ids[id] = true 58 return true 59 } 60 61 func (c *Cache) Remove(id hash.Event) { 62 c.mu.Lock() 63 defer c.mu.Unlock() 64 65 if c.ids == nil { 66 return 67 } 68 delete(c.ids, id) 69 }