1 package request_strategy
4 "github.com/anacrolix/torrent/metainfo"
5 "github.com/google/btree"
8 func NewPieceOrder() *PieceRequestOrder {
9 return &PieceRequestOrder{
11 keys: make(map[PieceRequestOrderKey]PieceRequestOrderState),
15 type PieceRequestOrder struct {
17 keys map[PieceRequestOrderKey]PieceRequestOrderState
20 type PieceRequestOrderKey struct {
21 InfoHash metainfo.Hash
25 type PieceRequestOrderState struct {
26 Priority piecePriority
31 type pieceRequestOrderItem struct {
32 key PieceRequestOrderKey
33 state PieceRequestOrderState
36 func (me pieceRequestOrderItem) Less(other btree.Item) bool {
37 otherConcrete := other.(pieceRequestOrderItem)
38 return pieceOrderLess(
40 PieceRequestOrderState: me.state,
41 PieceRequestOrderKey: me.key,
44 PieceRequestOrderState: otherConcrete.state,
45 PieceRequestOrderKey: otherConcrete.key,
50 func (me *PieceRequestOrder) Add(key PieceRequestOrderKey, state PieceRequestOrderState) {
51 if _, ok := me.keys[key]; ok {
54 if me.tree.ReplaceOrInsert(pieceRequestOrderItem{
58 panic("shouldn't already have this")
63 func (me *PieceRequestOrder) Update(key PieceRequestOrderKey, state PieceRequestOrderState) {
64 if me.tree.Delete(me.existingItemForKey(key)) == nil {
67 if me.tree.ReplaceOrInsert(pieceRequestOrderItem{
76 func (me *PieceRequestOrder) existingItemForKey(key PieceRequestOrderKey) pieceRequestOrderItem {
77 return pieceRequestOrderItem{
83 func (me *PieceRequestOrder) Delete(key PieceRequestOrderKey) {
84 if me.tree.Delete(me.existingItemForKey(key)) == nil {