github.com/anacrolix/torrent@v1.61.0/internal/request-strategy/ajwerner-btree.go (about) 1 package requestStrategy 2 3 import ( 4 "github.com/anacrolix/btree" 5 ) 6 7 type ajwernerBtree struct { 8 btree btree.Set[PieceRequestOrderItem] 9 } 10 11 func (a *ajwernerBtree) Contains(item PieceRequestOrderItem) bool { 12 _, ok := a.btree.Get(item) 13 return ok 14 } 15 16 var _ Btree = (*ajwernerBtree)(nil) 17 18 func NewAjwernerBtree() *ajwernerBtree { 19 return &ajwernerBtree{ 20 btree: btree.MakeSet(func(t, t2 PieceRequestOrderItem) int { 21 return pieceOrderLess(&t, &t2).OrderingInt() 22 }), 23 } 24 } 25 26 func mustValue[V any](b bool, panicValue V) { 27 if !b { 28 panic(panicValue) 29 } 30 } 31 32 func (a *ajwernerBtree) Delete(item PieceRequestOrderItem) { 33 mustValue(a.btree.Delete(item), item) 34 } 35 36 func (a *ajwernerBtree) Add(item PieceRequestOrderItem) { 37 _, overwrote := a.btree.Upsert(item) 38 mustValue(!overwrote, item) 39 } 40 41 func (a *ajwernerBtree) Scan(f func(PieceRequestOrderItem) bool) { 42 it := a.btree.Iterator() 43 for it.First(); it.Valid(); it.Next() { 44 if !f(it.Cur()) { 45 break 46 } 47 } 48 }