1 package request_strategy
6 "github.com/anacrolix/torrent/metainfo"
7 "github.com/google/btree"
10 func NewPieceOrder() *PieceRequestOrder {
11 return &PieceRequestOrder{
13 keys: make(map[PieceRequestOrderKey]PieceRequestOrderState),
17 type PieceRequestOrder struct {
19 keys map[PieceRequestOrderKey]PieceRequestOrderState
22 type PieceRequestOrderKey struct {
23 InfoHash metainfo.Hash
27 type PieceRequestOrderState struct {
28 Priority piecePriority
33 type pieceRequestOrderItem struct {
34 key PieceRequestOrderKey
35 state PieceRequestOrderState
38 func (me pieceRequestOrderItem) Less(other btree.Item) bool {
39 otherConcrete := other.(pieceRequestOrderItem)
40 return pieceOrderLess(
42 PieceRequestOrderState: me.state,
43 PieceRequestOrderKey: me.key,
46 PieceRequestOrderState: otherConcrete.state,
47 PieceRequestOrderKey: otherConcrete.key,
52 func (me *PieceRequestOrder) Add(key PieceRequestOrderKey, state PieceRequestOrderState) {
53 if _, ok := me.keys[key]; ok {
56 if me.tree.ReplaceOrInsert(pieceRequestOrderItem{
60 panic("shouldn't already have this")
65 func (me *PieceRequestOrder) Update(key PieceRequestOrderKey, state PieceRequestOrderState) {
66 if me.tree.Delete(me.existingItemForKey(key)) == nil {
67 panic(fmt.Sprintf("%#v", key))
69 if me.tree.ReplaceOrInsert(pieceRequestOrderItem{
78 func (me *PieceRequestOrder) existingItemForKey(key PieceRequestOrderKey) pieceRequestOrderItem {
79 return pieceRequestOrderItem{
85 func (me *PieceRequestOrder) Delete(key PieceRequestOrderKey) {
86 if me.tree.Delete(me.existingItemForKey(key)) == nil {
90 // log.Printf("deleting %#v", key)