swarm/pot: refactored pot.remove(), updated comments

This commit is contained in:
Vlad 2019-01-08 22:06:59 +04:00
parent fe03b76ffe
commit 357d536585
3 changed files with 80 additions and 21 deletions

View file

@ -162,7 +162,6 @@ func ToBytes(v Val) []byte {
} }
// DefaultPof returns a proximity order comparison operator function // DefaultPof returns a proximity order comparison operator function
// where all
func DefaultPof(max int) func(one, other Val, pos int) (int, bool) { func DefaultPof(max int) func(one, other Val, pos int) (int, bool) {
return func(one, other Val, pos int) (int, bool) { return func(one, other Val, pos int) (int, bool) {
po, eq := proximityOrder(ToBytes(one), ToBytes(other), pos) po, eq := proximityOrder(ToBytes(one), ToBytes(other), pos)
@ -174,6 +173,9 @@ func DefaultPof(max int) func(one, other Val, pos int) (int, bool) {
} }
} }
// proximityOrder returns two parameters:
// 1. relative proximity order of the arguments one & other;
// 2. boolean indicating is the full match occurred (one == other).
func proximityOrder(one, other []byte, pos int) (int, bool) { func proximityOrder(one, other []byte, pos int) (int, bool) {
for i := pos / 8; i < len(one); i++ { for i := pos / 8; i < len(one); i++ {
if one[i] == other[i] { if one[i] == other[i] {

View file

@ -144,13 +144,10 @@ func add(t *Pot, val Val, pof Pof) (*Pot, int, bool) {
return r, po, found return r, po, found
} }
// Remove called on (v) deletes v from the Pot and returns // Remove deletes element v from the Pot t and returns three parameters:
// the proximity order of v and a boolean value indicating // 1. new Pot that contains all the elements of t minus the element v;
// if the value was found // 2. proximity order of the removed element v;
// Remove called on (t, v) returns a new Pot that contains all the elements of t // 3. boolean indicating if the item was found.
// minus the value v, using the applicative remove
// the second return value is the proximity order of the inserted element
// the third is boolean indicating if the item was found
func Remove(t *Pot, v Val, pof Pof) (*Pot, int, bool) { func Remove(t *Pot, v Val, pof Pof) (*Pot, int, bool) {
return remove(t, v, pof) return remove(t, v, pof)
} }
@ -161,10 +158,7 @@ func remove(t *Pot, val Val, pof Pof) (r *Pot, po int, found bool) {
if found { if found {
size-- size--
if size == 0 { if size == 0 {
r = &Pot{ return &Pot{}, po, true
po: t.po,
}
return r, po, true
} }
i := len(t.bins) - 1 i := len(t.bins) - 1
last := t.bins[i] last := t.bins[i]
@ -201,7 +195,7 @@ func remove(t *Pot, val Val, pof Pof) (r *Pot, po int, found bool) {
} }
bins = append(bins, t.bins[j:]...) bins = append(bins, t.bins[j:]...)
r = &Pot{ r = &Pot{
pin: val, pin: t.pin,
size: size, size: size,
po: t.po, po: t.po,
bins: bins, bins: bins,

View file

@ -82,6 +82,65 @@ func testAdd(t *Pot, pof Pof, j int, values ...string) (_ *Pot, n int, f bool) {
return t, n, f return t, n, f
} }
func TestPotRemoveNonExisting(t *testing.T) {
pof := DefaultPof(8)
n := NewPot(newTestAddr("00111100", 0), 0)
n, _, _ = Remove(n, newTestAddr("00000101", 0), pof)
exp := "00111100"
got := Label(n.Pin())
if got[:8] != exp {
t.Fatalf("incorrect pinned value. Expected %v, got %v", exp, got[:8])
}
}
func TestPotRemoveSameBin(t *testing.T) {
pof := DefaultPof(8)
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)
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)
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)
}
}
func TestPotRemoveDifferentBins(t *testing.T) {
pof := DefaultPof(8)
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)
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)
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]"
if got != exp {
t.Fatalf("incorrect po-s in iteration over Pot. Expected %v, got %v", exp, got)
}
}
func TestPotAdd(t *testing.T) { func TestPotAdd(t *testing.T) {
pof := DefaultPof(8) pof := DefaultPof(8)
n := NewPot(newTestAddr("00111100", 0), 0) n := NewPot(newTestAddr("00111100", 0), 0)
@ -135,25 +194,29 @@ func TestPotRemove(t *testing.T) {
t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti)
} }
inds, po := indexes(n) inds, po := indexes(n)
got = fmt.Sprintf("%v", inds)
exp = "[2 4 0]"
if got != exp {
t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got)
}
got = fmt.Sprintf("%v", po) got = fmt.Sprintf("%v", po)
exp = "[1 3 0]" exp = "[1 3 0]"
if got != exp { if got != exp {
t.Fatalf("incorrect po-s in iteration over Pot. Expected %v, got %v", exp, got) t.Fatalf("incorrect po-s in iteration over Pot. Expected %v, got %v", exp, got)
} }
// remove again got = fmt.Sprintf("%v", inds)
n, _, _ = Remove(n, newTestAddr("00111100", 0), pof) 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)
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) got = fmt.Sprintf("%v", inds)
exp = "[2 4]" exp = "[2 4]"
if got != exp { if got != exp {
t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got)
} }
} }
func TestPotSwap(t *testing.T) { func TestPotSwap(t *testing.T) {