]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Add multiLess and use it for worseConn
authorMatt Joiner <anacrolix@gmail.com>
Sat, 16 Jun 2018 07:04:12 +0000 (17:04 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Sat, 16 Jun 2018 07:04:12 +0000 (17:04 +1000)
multiless.go [new file with mode: 0644]
worst_conns.go

diff --git a/multiless.go b/multiless.go
new file mode 100644 (file)
index 0000000..5d6ebb4
--- /dev/null
@@ -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)
+}
index dbbc3c279cb5006c8d4479966a16d24a580fac22..51a23f12b125c32e66964c348d655673aa2ad209 100644 (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 {