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