]> Sergey Matveev's repositories - btrtrc.git/blob - prioritized_peers.go
ca8b8736a626e007988ab650b105958dafec1dbc
[btrtrc.git] / prioritized_peers.go
1 package torrent
2
3 import "github.com/google/btree"
4
5 // Peers are stored with their priority at insertion. Their priority may
6 // change if our apparent IP changes, we don't currently handle that.
7 type prioritizedPeersItem struct {
8         prio peerPriority
9         p    Peer
10 }
11
12 func (me prioritizedPeersItem) Less(than btree.Item) bool {
13         return me.prio < than.(prioritizedPeersItem).prio
14 }
15
16 type prioritizedPeers struct {
17         om      *btree.BTree
18         getPrio func(Peer) peerPriority
19 }
20
21 func (me *prioritizedPeers) Each(f func(Peer)) {
22         me.om.Ascend(func(i btree.Item) bool {
23                 f(i.(prioritizedPeersItem).p)
24                 return true
25         })
26 }
27
28 func (me *prioritizedPeers) Len() int {
29         return me.om.Len()
30 }
31
32 // Returns true if a peer is replaced.
33 func (me *prioritizedPeers) Add(p Peer) bool {
34         return me.om.ReplaceOrInsert(prioritizedPeersItem{me.getPrio(p), p}) != nil
35 }
36
37 func (me *prioritizedPeers) DeleteMin() (ret prioritizedPeersItem, ok bool) {
38         i := me.om.DeleteMin()
39         if i == nil {
40                 return
41         }
42         ret = i.(prioritizedPeersItem)
43         ok = true
44         return
45 }
46
47 func (me *prioritizedPeers) PopMax() Peer {
48         return me.om.DeleteMax().(prioritizedPeersItem).p
49 }