File tree Expand file tree Collapse file tree 2 files changed +29
-0
lines changed Expand file tree Collapse file tree 2 files changed +29
-0
lines changed Original file line number Diff line number Diff line change @@ -251,6 +251,7 @@ func (immutable *Immutable) delete(entry Entry) Entry {
251251 }
252252 it = it .copy () // the node we found needs to be copied
253253
254+ oldTop := top
254255 if it .children [0 ] == nil || it .children [1 ] == nil { // need to set children on parent, splicing out
255256 dir = intFromBool (it .children [0 ] == nil )
256257 if top != 0 {
@@ -272,6 +273,11 @@ func (immutable *Immutable) delete(entry Entry) Entry {
272273 }
273274
274275 it .entry = heir .entry
276+ if oldTop != 0 {
277+ cache [oldTop - 1 ].children [dirs [oldTop - 1 ]] = it
278+ } else {
279+ immutable .root = it
280+ }
275281 cache [top - 1 ].children [intFromBool (cache [top - 1 ] == it )] = heir .children [1 ]
276282 }
277283
Original file line number Diff line number Diff line change @@ -295,6 +295,29 @@ func TestAVLDeleteReplay(t *testing.T) {
295295 assert .Equal (t , uint64 (4 ), i2 .Len ())
296296}
297297
298+ func TestAVLFails (t * testing.T ) {
299+ keys := []mockEntry {
300+ mockEntry (0 ),
301+ mockEntry (1 ),
302+ mockEntry (3 ),
303+ mockEntry (4 ),
304+ mockEntry (5 ),
305+ mockEntry (6 ),
306+ mockEntry (7 ),
307+ mockEntry (2 ),
308+ }
309+ i1 := NewImmutable ()
310+ for _ , k := range keys {
311+ i1 , _ = i1 .Insert (k )
312+ }
313+
314+ for _ , k := range keys {
315+ var deleted Entries
316+ i1 , deleted = i1 .Delete (k )
317+ assert .Equal (t , Entries {k }, deleted )
318+ }
319+ }
320+
298321func BenchmarkImmutableInsert (b * testing.B ) {
299322 numItems := b .N
300323 sl := NewImmutable ()
You can’t perform that action at this time.
0 commit comments