bucket.go 1.49 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
package dht

import (
	"container/list"

	peer "github.com/jbenet/go-ipfs/peer"
)
// Bucket holds a list of peers.
type Bucket list.List

func (b *Bucket) Find(id peer.ID) *list.Element {
	bucket_list := (*list.List)(b)
	for e := bucket_list.Front(); e != nil; e = e.Next() {
		if e.Value.(*peer.Peer).ID.Equal(id) {
			return e
		}
	}
	return nil
}

func (b *Bucket) MoveToFront(e *list.Element) {
	bucket_list := (*list.List)(b)
	bucket_list.MoveToFront(e)
}

func (b *Bucket) PushFront(p *peer.Peer) {
	bucket_list := (*list.List)(b)
	bucket_list.PushFront(p)
}

func (b *Bucket) PopBack() *peer.Peer {
	bucket_list := (*list.List)(b)
	last := bucket_list.Back()
	bucket_list.Remove(last)
	return last.Value.(*peer.Peer)
}

func (b *Bucket) Len() int {
	bucket_list := (*list.List)(b)
	return bucket_list.Len()
}

// Splits a buckets peers into two buckets, the methods receiver will have
// peers with CPL equal to cpl, the returned bucket will have peers with CPL
// greater than cpl (returned bucket has closer peers)
func (b *Bucket) Split(cpl int, target ID) *Bucket {
	bucket_list := (*list.List)(b)
	out := list.New()
	e := bucket_list.Front()
	for e != nil {
		peer_id := ConvertPeerID(e.Value.(*peer.Peer).ID)
		peer_cpl := prefLen(peer_id, target)
		if peer_cpl > cpl {
			cur := e
			out.PushBack(e.Value)
			e = e.Next()
			bucket_list.Remove(cur)
			continue
		}
		e = e.Next()
	}
	return (*Bucket)(out)
}

func (b *Bucket) getIter() *list.Element {
	bucket_list := (*list.List)(b)
	return bucket_list.Front()
}