-package request_strategy
+package requestStrategy
-import (
- "github.com/anacrolix/torrent/metainfo"
- "github.com/google/btree"
-)
+import "github.com/anacrolix/torrent/metainfo"
-func NewPieceOrder() *PieceRequestOrder {
+type Btree interface {
+ Delete(pieceRequestOrderItem)
+ Add(pieceRequestOrderItem)
+ Scan(func(pieceRequestOrderItem) bool)
+}
+
+func NewPieceOrder(btree Btree, cap int) *PieceRequestOrder {
return &PieceRequestOrder{
- tree: btree.New(32),
- keys: make(map[PieceRequestOrderKey]PieceRequestOrderState),
+ tree: btree,
+ keys: make(map[PieceRequestOrderKey]PieceRequestOrderState, cap),
}
}
type PieceRequestOrder struct {
- tree *btree.BTree
+ tree Btree
keys map[PieceRequestOrderKey]PieceRequestOrderState
}
type PieceRequestOrderState struct {
Priority piecePriority
Partial bool
- Availability int64
+ Availability int
}
type pieceRequestOrderItem struct {
state PieceRequestOrderState
}
-func (me pieceRequestOrderItem) Less(other btree.Item) bool {
- otherConcrete := other.(pieceRequestOrderItem)
- return pieceOrderLess(
- pieceOrderInput{
- PieceRequestOrderState: me.state,
- PieceRequestOrderKey: me.key,
- },
- pieceOrderInput{
- PieceRequestOrderState: otherConcrete.state,
- PieceRequestOrderKey: otherConcrete.key,
- },
- ).Less()
+func (me *pieceRequestOrderItem) Less(otherConcrete *pieceRequestOrderItem) bool {
+ return pieceOrderLess(me, otherConcrete).Less()
}
func (me *PieceRequestOrder) Add(key PieceRequestOrderKey, state PieceRequestOrderState) {
if _, ok := me.keys[key]; ok {
panic(key)
}
- if me.tree.ReplaceOrInsert(pieceRequestOrderItem{
- key: key,
- state: state,
- }) != nil {
- panic("shouldn't already have this")
- }
+ me.tree.Add(pieceRequestOrderItem{key, state})
me.keys[key] = state
}
-func (me *PieceRequestOrder) Update(key PieceRequestOrderKey, state PieceRequestOrderState) {
- if me.tree.Delete(me.existingItemForKey(key)) == nil {
- panic(key)
+func (me *PieceRequestOrder) Update(
+ key PieceRequestOrderKey,
+ state PieceRequestOrderState,
+) {
+ oldState, ok := me.keys[key]
+ if !ok {
+ panic("key should have been added already")
}
- if me.tree.ReplaceOrInsert(pieceRequestOrderItem{
- key: key,
- state: state,
- }) != nil {
- panic(key)
+ if state == oldState {
+ return
}
+ me.tree.Delete(pieceRequestOrderItem{key, oldState})
+ me.tree.Add(pieceRequestOrderItem{key, state})
me.keys[key] = state
}
}
func (me *PieceRequestOrder) Delete(key PieceRequestOrderKey) {
- if me.tree.Delete(me.existingItemForKey(key)) == nil {
- panic(key)
- }
+ me.tree.Delete(pieceRequestOrderItem{key, me.keys[key]})
delete(me.keys, key)
}
+
+func (me *PieceRequestOrder) Len() int {
+ return len(me.keys)
+}