diff options
author | gluk256 <gluk256@users.noreply.github.com> | 2019-01-15 18:51:33 +0800 |
---|---|---|
committer | Anton Evangelatov <anton.evangelatov@gmail.com> | 2019-01-15 18:51:33 +0800 |
commit | 4aeeecfded1310e88579d9eaf47c33967e496f8f (patch) | |
tree | 91374b02adfd2e9e8a615c4e92cce117920e3846 /swarm/pot | |
parent | 1636d9574be4e3df318f16bd1bf2741cf79b76a1 (diff) | |
download | dexon-4aeeecfded1310e88579d9eaf47c33967e496f8f.tar.gz dexon-4aeeecfded1310e88579d9eaf47c33967e496f8f.tar.zst dexon-4aeeecfded1310e88579d9eaf47c33967e496f8f.zip |
swarm/pot: each() functions refactored (#18452)
Diffstat (limited to 'swarm/pot')
-rw-r--r-- | swarm/pot/pot.go | 74 | ||||
-rw-r--r-- | swarm/pot/pot_test.go | 48 |
2 files changed, 49 insertions, 73 deletions
diff --git a/swarm/pot/pot.go b/swarm/pot/pot.go index 0797b286c..7e3967f3f 100644 --- a/swarm/pot/pot.go +++ b/swarm/pot/pot.go @@ -447,60 +447,50 @@ func union(t0, t1 *Pot, pof Pof) (*Pot, int) { return n, common } -// Each called with (f) is a synchronous iterator over the bins of a node -// respecting an ordering -// proximity > pinnedness -func (t *Pot) Each(f func(Val, int) bool) bool { +// Each is a synchronous iterator over the elements of pot with function f. +func (t *Pot) Each(f func(Val) bool) bool { return t.each(f) } -func (t *Pot) each(f func(Val, int) bool) bool { - var next bool +// each is a synchronous iterator over the elements of pot with function f. +// the iteration ends if the function return false or there are no more elements. +func (t *Pot) each(f func(Val) bool) bool { + if t == nil || t.size == 0 { + return false + } for _, n := range t.bins { - if n == nil { - return true - } - next = n.each(f) - if !next { + if !n.each(f) { return false } } - if t.size == 0 { - return false - } - return f(t.pin, t.po) + return f(t.pin) } -// eachFrom called with (f, start) is a synchronous iterator over the elements of a Pot -// within the inclusive range starting from proximity order start -// the function argument is passed the value and the proximity order wrt the root pin -// it does NOT include the pinned item of the root -// respecting an ordering -// proximity > pinnedness -// the iteration ends if the function return false or there are no more elements -// end of a po range can be implemented since po is passed to the function -func (t *Pot) eachFrom(f func(Val, int) bool, po int) bool { - var next bool - _, lim := t.getPos(po) - for i := lim; i < len(t.bins); i++ { - n := t.bins[i] - next = n.each(f) - if !next { +// eachFrom is a synchronous iterator over the elements of pot with function f, +// starting from certain proximity order po, which is passed as a second parameter. +// the iteration ends if the function return false or there are no more elements. +func (t *Pot) eachFrom(f func(Val) bool, po int) bool { + if t == nil || t.size == 0 { + return false + } + _, beg := t.getPos(po) + for i := beg; i < len(t.bins); i++ { + if !t.bins[i].each(f) { return false } } - return f(t.pin, t.po) + return f(t.pin) } // EachBin iterates over bins of the pivot node and offers iterators to the caller on each // subtree passing the proximity order and the size // the iteration continues until the function's return value is false // or there are no more subtries -func (t *Pot) EachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val, i int) bool) bool) bool) { +func (t *Pot) EachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val) bool) bool) bool) { t.eachBin(val, pof, po, f) } -func (t *Pot) eachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val, i int) bool) bool) bool) { +func (t *Pot) eachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val) bool) bool) bool) { if t == nil || t.size == 0 { return } @@ -520,8 +510,8 @@ func (t *Pot) eachBin(val Val, pof Pof, po int, f func(int, int, func(func(val V } if lim == len(t.bins) { if spr >= po { - f(spr, 1, func(g func(Val, int) bool) bool { - return g(t.pin, spr) + f(spr, 1, func(g func(Val) bool) bool { + return g(t.pin) }) } return @@ -535,9 +525,9 @@ func (t *Pot) eachBin(val Val, pof Pof, po int, f func(int, int, func(func(val V size += n.size } if spr >= po { - if !f(spr, t.size-size, func(g func(Val, int) bool) bool { - return t.eachFrom(func(v Val, j int) bool { - return g(v, spr) + if !f(spr, t.size-size, func(g func(Val) bool) bool { + return t.eachFrom(func(v Val) bool { + return g(v) }, spo) }) { return @@ -585,7 +575,7 @@ func (t *Pot) eachNeighbour(val Val, pof Pof, f func(Val, int) bool) bool { } for i := l - 1; i > ir; i-- { - next = t.bins[i].each(func(v Val, _ int) bool { + next = t.bins[i].each(func(v Val) bool { return f(v, po) }) if !next { @@ -595,7 +585,7 @@ func (t *Pot) eachNeighbour(val Val, pof Pof, f func(Val, int) bool) bool { for i := il - 1; i >= 0; i-- { n := t.bins[i] - next = n.each(func(v Val, _ int) bool { + next = n.each(func(v Val) bool { return f(v, n.po) }) if !next { @@ -709,7 +699,7 @@ func (t *Pot) eachNeighbourAsync(val Val, pof Pof, max int, maxPos int, f func(V wg.Add(m) } go func(pn *Pot, pm int) { - pn.each(func(v Val, _ int) bool { + pn.each(func(v Val) bool { if wg != nil { defer wg.Done() } @@ -736,7 +726,7 @@ func (t *Pot) eachNeighbourAsync(val Val, pof Pof, max int, maxPos int, f func(V wg.Add(m) } go func(pn *Pot, pm int) { - pn.each(func(v Val, _ int) bool { + pn.each(func(v Val) bool { if wg != nil { defer wg.Done() } diff --git a/swarm/pot/pot_test.go b/swarm/pot/pot_test.go index 8c7daebe0..83d604919 100644 --- a/swarm/pot/pot_test.go +++ b/swarm/pot/pot_test.go @@ -65,14 +65,13 @@ func randomtestAddr(n int, i int) *testAddr { return newTestAddr(v, i) } -func indexes(t *Pot) (i []int, po []int) { - t.Each(func(v Val, p int) bool { +func indexes(t *Pot) (i []int) { + t.Each(func(v Val) bool { a := v.(*testAddr) i = append(i, a.i) - po = append(po, p) return true }) - return i, po + return i } func testAdd(t *Pot, pof Pof, j int, values ...string) (_ *Pot, n int, f bool) { @@ -102,23 +101,18 @@ func TestPotRemoveSameBin(t *testing.T) { n := NewPot(newTestAddr("11111111", 0), 0) n, _, _ = testAdd(n, pof, 1, "00000000", "01000000", "01100000", "01110000", "01111000") n, _, _ = Remove(n, newTestAddr("01110000", 0), pof) - inds, po := indexes(n) + inds := indexes(n) goti := n.Size() expi := 5 if goti != expi { t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) } - inds, po = indexes(n) + inds = indexes(n) got := fmt.Sprintf("%v", inds) exp := "[5 3 2 1 0]" if got != exp { t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) } - got = fmt.Sprintf("%v", po) - exp = "[3 2 1 0 0]" - if got != exp { - t.Fatalf("incorrect po-s in iteration over Pot. Expected %v, got %v", exp, got) - } } // this test creates a flat pot tree (all the elements are leafs of one root), @@ -129,22 +123,24 @@ func TestPotRemoveDifferentBins(t *testing.T) { n := NewPot(newTestAddr("11111111", 0), 0) n, _, _ = testAdd(n, pof, 1, "00000000", "10000000", "11000000", "11100000", "11110000") n, _, _ = Remove(n, newTestAddr("11100000", 0), pof) - inds, po := indexes(n) + inds := indexes(n) goti := n.Size() expi := 5 if goti != expi { t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) } - inds, po = indexes(n) + inds = indexes(n) got := fmt.Sprintf("%v", inds) exp := "[1 2 3 5 0]" if got != exp { t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) } - got = fmt.Sprintf("%v", po) - exp = "[0 1 2 4 0]" + n, _, _ = testAdd(n, pof, 4, "11100000") + inds = indexes(n) + got = fmt.Sprintf("%v", inds) + exp = "[1 2 3 4 5 0]" if got != exp { - t.Fatalf("incorrect po-s in iteration over Pot. Expected %v, got %v", exp, got) + t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) } } @@ -171,17 +167,12 @@ func TestPotAdd(t *testing.T) { if goti != expi { t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) } - inds, po := indexes(n) + inds := indexes(n) got = fmt.Sprintf("%v", inds) exp = "[3 4 2]" if got != exp { t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) } - got = fmt.Sprintf("%v", po) - exp = "[1 2 0]" - if got != exp { - t.Fatalf("incorrect po-s in iteration over Pot. Expected %v, got %v", exp, got) - } } func TestPotRemove(t *testing.T) { @@ -200,25 +191,20 @@ func TestPotRemove(t *testing.T) { if goti != expi { t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) } - inds, po := indexes(n) - got = fmt.Sprintf("%v", po) - exp = "[1 3 0]" - if got != exp { - t.Fatalf("incorrect po-s in iteration over Pot. Expected %v, got %v", exp, got) - } + inds := indexes(n) got = fmt.Sprintf("%v", inds) exp = "[2 4 1]" if got != exp { t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) } n, _, _ = Remove(n, newTestAddr("00111100", 0), pof) // remove again same element - inds, _ = indexes(n) + inds = indexes(n) got = fmt.Sprintf("%v", inds) if got != exp { t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) } n, _, _ = Remove(n, newTestAddr("00000000", 0), pof) // remove the first element - inds, _ = indexes(n) + inds = indexes(n) got = fmt.Sprintf("%v", inds) exp = "[2 4]" if got != exp { @@ -272,7 +258,7 @@ func TestPotSwap(t *testing.T) { }) } sum := 0 - n.Each(func(v Val, i int) bool { + n.Each(func(v Val) bool { if v == nil { return true } |