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

     1  package indexed
     2  
     3  import (
     4  	"iter"
     5  
     6  	"github.com/tidwall/btree"
     7  )
     8  
     9  type tidwallBtreeSet[R any] struct {
    10  	inner *btree.BTreeG[R]
    11  }
    12  
    13  func (me tidwallBtreeSet[R]) Iter(yield func(R) bool) {
    14  	it := me.inner.Iter()
    15  	if it.First() {
    16  		for {
    17  			if !yield(it.Item()) {
    18  				return
    19  			}
    20  			if !it.Next() {
    21  				break
    22  			}
    23  		}
    24  	}
    25  	it.Release()
    26  }
    27  
    28  func (me tidwallBtreeSet[R]) IterFrom(start R) iter.Seq[R] {
    29  	return func(yield func(R) bool) {
    30  		me.inner.Ascend(start, yield)
    31  	}
    32  }
    33  
    34  func (me tidwallBtreeSet[R]) Delete(r R) (actual R, removed bool) {
    35  	return me.inner.Delete(r)
    36  }
    37  
    38  func (me tidwallBtreeSet[R]) Upsert(r R) (_ R, overwrote bool) {
    39  	return me.inner.Set(r)
    40  }
    41  
    42  func (me tidwallBtreeSet[R]) Contains(r R) bool {
    43  	_, ok := me.inner.Get(r)
    44  	return ok
    45  }
    46  
    47  func (me tidwallBtreeSet[R]) Len() int {
    48  	return me.inner.Len()
    49  }
    50  
    51  func makeTidwallBtreeSet[R any](cmp func(R, R) int) tidwallBtreeSet[R] {
    52  	inner := btree.NewBTreeGOptions(func(a, b R) bool {
    53  		return cmp(a, b) < 0
    54  	}, btree.Options{
    55  		Degree:  32,
    56  		NoLocks: true,
    57  	})
    58  	return tidwallBtreeSet[R]{inner: inner}
    59  }