github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/gossip/emitter/originatedtxs/txs_ring_buffer.go (about)

     1  package originatedtxs
     2  
     3  import (
     4  	"github.com/hashicorp/golang-lru/simplelru"
     5  	"github.com/unicornultrafoundation/go-u2u/common"
     6  )
     7  
     8  type Buffer struct {
     9  	senderCount *simplelru.LRU // sender address -> number of transactions
    10  }
    11  
    12  func New(maxAddresses int) *Buffer {
    13  	ring := &Buffer{}
    14  	ring.senderCount, _ = simplelru.NewLRU(maxAddresses, nil)
    15  	return ring
    16  }
    17  
    18  // Inc is not safe for concurrent use
    19  func (ring *Buffer) Inc(sender common.Address) {
    20  	cur, ok := ring.senderCount.Peek(sender)
    21  	if ok {
    22  		ring.senderCount.Add(sender, cur.(int)+1)
    23  	} else {
    24  		ring.senderCount.Add(sender, int(1))
    25  	}
    26  }
    27  
    28  // Dec is not safe for concurrent use
    29  func (ring *Buffer) Dec(sender common.Address) {
    30  	cur, ok := ring.senderCount.Peek(sender)
    31  	if !ok {
    32  		return
    33  	}
    34  	if cur.(int) <= 1 {
    35  		ring.senderCount.Remove(sender)
    36  	} else {
    37  		ring.senderCount.Add(sender, cur.(int)-1)
    38  	}
    39  }
    40  
    41  // Clear is not safe for concurrent use
    42  func (ring *Buffer) Clear() {
    43  	ring.senderCount.Purge()
    44  }
    45  
    46  // TotalOf is not safe for concurrent use
    47  func (ring *Buffer) TotalOf(sender common.Address) int {
    48  	cur, ok := ring.senderCount.Get(sender)
    49  	if !ok {
    50  		return 0
    51  	}
    52  	return cur.(int)
    53  }
    54  
    55  // Empty is not safe for concurrent use
    56  func (ring *Buffer) Empty() bool {
    57  	return ring.senderCount.Len() == 0
    58  }