github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/routing/kbucket/sorting.go (about)

     1  package kbucket
     2  
     3  import (
     4  	"container/list"
     5  	peer "github.com/ipfs/go-ipfs/p2p/peer"
     6  	"sort"
     7  )
     8  
     9  // A helper struct to sort peers by their distance to the local node
    10  type peerDistance struct {
    11  	p        peer.ID
    12  	distance ID
    13  }
    14  
    15  // peerSorterArr implements sort.Interface to sort peers by xor distance
    16  type peerSorterArr []*peerDistance
    17  
    18  func (p peerSorterArr) Len() int      { return len(p) }
    19  func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] }
    20  func (p peerSorterArr) Less(a, b int) bool {
    21  	return p[a].distance.less(p[b].distance)
    22  }
    23  
    24  //
    25  
    26  func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr {
    27  	for e := peerList.Front(); e != nil; e = e.Next() {
    28  		p := e.Value.(peer.ID)
    29  		pID := ConvertPeerID(p)
    30  		pd := peerDistance{
    31  			p:        p,
    32  			distance: xor(target, pID),
    33  		}
    34  		peerArr = append(peerArr, &pd)
    35  		if e == nil {
    36  			log.Debug("list element was nil")
    37  			return peerArr
    38  		}
    39  	}
    40  	return peerArr
    41  }
    42  
    43  func SortClosestPeers(peers []peer.ID, target ID) []peer.ID {
    44  	var psarr peerSorterArr
    45  	for _, p := range peers {
    46  		pID := ConvertPeerID(p)
    47  		pd := &peerDistance{
    48  			p:        p,
    49  			distance: xor(target, pID),
    50  		}
    51  		psarr = append(psarr, pd)
    52  	}
    53  	sort.Sort(psarr)
    54  	var out []peer.ID
    55  	for _, p := range psarr {
    56  		out = append(out, p.p)
    57  	}
    58  	return out
    59  }