github.com/anacrolix/torrent@v1.61.0/internal/request-strategy/tidwall-btree.go (about)

     1  package requestStrategy
     2  
     3  import (
     4  	"github.com/tidwall/btree"
     5  )
     6  
     7  type tidwallBtree struct {
     8  	tree     *btree.BTreeG[PieceRequestOrderItem]
     9  	PathHint *btree.PathHint
    10  }
    11  
    12  func (me *tidwallBtree) Scan(f func(PieceRequestOrderItem) bool) {
    13  	me.tree.Scan(f)
    14  }
    15  
    16  func NewTidwallBtree() *tidwallBtree {
    17  	return &tidwallBtree{
    18  		tree: btree.NewBTreeGOptions(
    19  			func(a, b PieceRequestOrderItem) bool {
    20  				return a.Less(&b)
    21  			},
    22  			btree.Options{NoLocks: true, Degree: 64}),
    23  	}
    24  }
    25  
    26  func (me *tidwallBtree) Add(item PieceRequestOrderItem) {
    27  	if _, ok := me.tree.SetHint(item, me.PathHint); ok {
    28  		panic("shouldn't already have this")
    29  	}
    30  }
    31  
    32  type PieceRequestOrderPathHint = btree.PathHint
    33  
    34  func (me *tidwallBtree) Delete(item PieceRequestOrderItem) {
    35  	_, deleted := me.tree.DeleteHint(item, me.PathHint)
    36  	mustValue(deleted, item)
    37  }
    38  
    39  func (me *tidwallBtree) Contains(item PieceRequestOrderItem) bool {
    40  	_, ok := me.tree.Get(item)
    41  	return ok
    42  }