2
0
mirror of synced 2025-02-23 14:18:13 +00:00

Add multiLess and use it for worseConn

This commit is contained in:
Matt Joiner 2018-06-16 17:04:12 +10:00
parent 2852fee357
commit 8732aa9cf1
2 changed files with 55 additions and 7 deletions

46
multiless.go Normal file
View File

@ -0,0 +1,46 @@
package torrent
func strictCmp(same, less bool) cmper {
return func() (bool, bool) { return same, less }
}
type (
cmper func() (same, less bool)
multiLess struct {
ok bool
less bool
}
)
func (me *multiLess) Final() bool {
if !me.ok {
panic("undetermined")
}
return me.less
}
func (me *multiLess) FinalOk() (left, ok bool) {
return me.less, me.ok
}
func (me *multiLess) Next(f cmper) {
if me.ok {
return
}
same, less := f()
if same {
return
}
me.ok, me.less = true, less
}
func (me *multiLess) StrictNext(same, less bool) {
if same {
return
}
me.ok, me.less = true, less
}
func (me *multiLess) NextBool(l, r bool) {
me.StrictNext(l == r, l)
}

View File

@ -3,13 +3,15 @@ package torrent
import "container/heap"
func worseConn(l, r *connection) bool {
if l.useful() != r.useful() {
return r.useful()
}
if !l.lastHelpful().Equal(r.lastHelpful()) {
return l.lastHelpful().Before(r.lastHelpful())
}
return l.completedHandshake.Before(r.completedHandshake)
var ml multiLess
ml.NextBool(!l.useful(), !r.useful())
ml.StrictNext(
l.lastHelpful().Equal(r.lastHelpful()),
l.lastHelpful().Before(r.lastHelpful()))
ml.StrictNext(
l.completedHandshake.Equal(r.completedHandshake),
l.completedHandshake.Before(r.completedHandshake))
return ml.Final()
}
type worseConnSlice struct {