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 }