Add multiLess and use it for worseConn
This commit is contained in:
parent
2852fee357
commit
8732aa9cf1
46
multiless.go
Normal file
46
multiless.go
Normal 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)
|
||||||
|
}
|
@ -3,13 +3,15 @@ package torrent
|
|||||||
import "container/heap"
|
import "container/heap"
|
||||||
|
|
||||||
func worseConn(l, r *connection) bool {
|
func worseConn(l, r *connection) bool {
|
||||||
if l.useful() != r.useful() {
|
var ml multiLess
|
||||||
return r.useful()
|
ml.NextBool(!l.useful(), !r.useful())
|
||||||
}
|
ml.StrictNext(
|
||||||
if !l.lastHelpful().Equal(r.lastHelpful()) {
|
l.lastHelpful().Equal(r.lastHelpful()),
|
||||||
return l.lastHelpful().Before(r.lastHelpful())
|
l.lastHelpful().Before(r.lastHelpful()))
|
||||||
}
|
ml.StrictNext(
|
||||||
return l.completedHandshake.Before(r.completedHandshake)
|
l.completedHandshake.Equal(r.completedHandshake),
|
||||||
|
l.completedHandshake.Before(r.completedHandshake))
|
||||||
|
return ml.Final()
|
||||||
}
|
}
|
||||||
|
|
||||||
type worseConnSlice struct {
|
type worseConnSlice struct {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user