1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 package btree
52
53 import (
54 "fmt"
55 "io"
56 "sort"
57 "strings"
58 "sync"
59 )
60
61
62 type Item interface {
63
64
65
66
67
68 Less(than Item) bool
69 }
70
71 const (
72 DefaultFreeListSize = 32
73 )
74
75 var (
76 nilItems = make(items, 16)
77 nilChildren = make(children, 16)
78 )
79
80
81
82
83
84 type FreeList struct {
85 mu sync.Mutex
86 freelist []*node
87 }
88
89
90
91 func NewFreeList(size int) *FreeList {
92 return &FreeList{freelist: make([]*node, 0, size)}
93 }
94
95 func (f *FreeList) newNode() (n *node) {
96 f.mu.Lock()
97 index := len(f.freelist) - 1
98 if index < 0 {
99 f.mu.Unlock()
100 return new(node)
101 }
102 n = f.freelist[index]
103 f.freelist[index] = nil
104 f.freelist = f.freelist[:index]
105 f.mu.Unlock()
106 return
107 }
108
109
110
111 func (f *FreeList) freeNode(n *node) (out bool) {
112 f.mu.Lock()
113 if len(f.freelist) < cap(f.freelist) {
114 f.freelist = append(f.freelist, n)
115 out = true
116 }
117 f.mu.Unlock()
118 return
119 }
120
121
122
123
124 type ItemIterator func(i Item) bool
125
126
127
128
129
130 func New(degree int) *BTree {
131 return NewWithFreeList(degree, NewFreeList(DefaultFreeListSize))
132 }
133
134
135 func NewWithFreeList(degree int, f *FreeList) *BTree {
136 if degree <= 1 {
137 panic("bad degree")
138 }
139 return &BTree{
140 degree: degree,
141 cow: ©OnWriteContext{freelist: f},
142 }
143 }
144
145
146 type items []Item
147
148
149
150 func (s *items) insertAt(index int, item Item) {
151 *s = append(*s, nil)
152 if index < len(*s) {
153 copy((*s)[index+1:], (*s)[index:])
154 }
155 (*s)[index] = item
156 }
157
158
159
160 func (s *items) removeAt(index int) Item {
161 item := (*s)[index]
162 copy((*s)[index:], (*s)[index+1:])
163 (*s)[len(*s)-1] = nil
164 *s = (*s)[:len(*s)-1]
165 return item
166 }
167
168
169 func (s *items) pop() (out Item) {
170 index := len(*s) - 1
171 out = (*s)[index]
172 (*s)[index] = nil
173 *s = (*s)[:index]
174 return
175 }
176
177
178
179 func (s *items) truncate(index int) {
180 var toClear items
181 *s, toClear = (*s)[:index], (*s)[index:]
182 for len(toClear) > 0 {
183 toClear = toClear[copy(toClear, nilItems):]
184 }
185 }
186
187
188
189
190 func (s items) find(item Item) (index int, found bool) {
191 i := sort.Search(len(s), func(i int) bool {
192 return item.Less(s[i])
193 })
194 if i > 0 && !s[i-1].Less(item) {
195 return i - 1, true
196 }
197 return i, false
198 }
199
200
201 type children []*node
202
203
204
205 func (s *children) insertAt(index int, n *node) {
206 *s = append(*s, nil)
207 if index < len(*s) {
208 copy((*s)[index+1:], (*s)[index:])
209 }
210 (*s)[index] = n
211 }
212
213
214
215 func (s *children) removeAt(index int) *node {
216 n := (*s)[index]
217 copy((*s)[index:], (*s)[index+1:])
218 (*s)[len(*s)-1] = nil
219 *s = (*s)[:len(*s)-1]
220 return n
221 }
222
223
224 func (s *children) pop() (out *node) {
225 index := len(*s) - 1
226 out = (*s)[index]
227 (*s)[index] = nil
228 *s = (*s)[:index]
229 return
230 }
231
232
233
234 func (s *children) truncate(index int) {
235 var toClear children
236 *s, toClear = (*s)[:index], (*s)[index:]
237 for len(toClear) > 0 {
238 toClear = toClear[copy(toClear, nilChildren):]
239 }
240 }
241
242
243
244
245
246
247 type node struct {
248 items items
249 children children
250 cow *copyOnWriteContext
251 }
252
253 func (n *node) mutableFor(cow *copyOnWriteContext) *node {
254 if n.cow == cow {
255 return n
256 }
257 out := cow.newNode()
258 if cap(out.items) >= len(n.items) {
259 out.items = out.items[:len(n.items)]
260 } else {
261 out.items = make(items, len(n.items), cap(n.items))
262 }
263 copy(out.items, n.items)
264
265 if cap(out.children) >= len(n.children) {
266 out.children = out.children[:len(n.children)]
267 } else {
268 out.children = make(children, len(n.children), cap(n.children))
269 }
270 copy(out.children, n.children)
271 return out
272 }
273
274 func (n *node) mutableChild(i int) *node {
275 c := n.children[i].mutableFor(n.cow)
276 n.children[i] = c
277 return c
278 }
279
280
281
282
283 func (n *node) split(i int) (Item, *node) {
284 item := n.items[i]
285 next := n.cow.newNode()
286 next.items = append(next.items, n.items[i+1:]...)
287 n.items.truncate(i)
288 if len(n.children) > 0 {
289 next.children = append(next.children, n.children[i+1:]...)
290 n.children.truncate(i + 1)
291 }
292 return item, next
293 }
294
295
296
297 func (n *node) maybeSplitChild(i, maxItems int) bool {
298 if len(n.children[i].items) < maxItems {
299 return false
300 }
301 first := n.mutableChild(i)
302 item, second := first.split(maxItems / 2)
303 n.items.insertAt(i, item)
304 n.children.insertAt(i+1, second)
305 return true
306 }
307
308
309
310
311 func (n *node) insert(item Item, maxItems int) Item {
312 i, found := n.items.find(item)
313 if found {
314 out := n.items[i]
315 n.items[i] = item
316 return out
317 }
318 if len(n.children) == 0 {
319 n.items.insertAt(i, item)
320 return nil
321 }
322 if n.maybeSplitChild(i, maxItems) {
323 inTree := n.items[i]
324 switch {
325 case item.Less(inTree):
326
327 case inTree.Less(item):
328 i++
329 default:
330 out := n.items[i]
331 n.items[i] = item
332 return out
333 }
334 }
335 return n.mutableChild(i).insert(item, maxItems)
336 }
337
338
339 func (n *node) get(key Item) Item {
340 i, found := n.items.find(key)
341 if found {
342 return n.items[i]
343 } else if len(n.children) > 0 {
344 return n.children[i].get(key)
345 }
346 return nil
347 }
348
349
350 func min(n *node) Item {
351 if n == nil {
352 return nil
353 }
354 for len(n.children) > 0 {
355 n = n.children[0]
356 }
357 if len(n.items) == 0 {
358 return nil
359 }
360 return n.items[0]
361 }
362
363
364 func max(n *node) Item {
365 if n == nil {
366 return nil
367 }
368 for len(n.children) > 0 {
369 n = n.children[len(n.children)-1]
370 }
371 if len(n.items) == 0 {
372 return nil
373 }
374 return n.items[len(n.items)-1]
375 }
376
377
378 type toRemove int
379
380 const (
381 removeItem toRemove = iota
382 removeMin
383 removeMax
384 )
385
386
387 func (n *node) remove(item Item, minItems int, typ toRemove) Item {
388 var i int
389 var found bool
390 switch typ {
391 case removeMax:
392 if len(n.children) == 0 {
393 return n.items.pop()
394 }
395 i = len(n.items)
396 case removeMin:
397 if len(n.children) == 0 {
398 return n.items.removeAt(0)
399 }
400 i = 0
401 case removeItem:
402 i, found = n.items.find(item)
403 if len(n.children) == 0 {
404 if found {
405 return n.items.removeAt(i)
406 }
407 return nil
408 }
409 default:
410 panic("invalid type")
411 }
412
413 if len(n.children[i].items) <= minItems {
414 return n.growChildAndRemove(i, item, minItems, typ)
415 }
416 child := n.mutableChild(i)
417
418
419
420 if found {
421
422
423 out := n.items[i]
424
425
426
427 n.items[i] = child.remove(nil, minItems, removeMax)
428 return out
429 }
430
431
432 return child.remove(item, minItems, typ)
433 }
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454 func (n *node) growChildAndRemove(i int, item Item, minItems int, typ toRemove) Item {
455 if i > 0 && len(n.children[i-1].items) > minItems {
456
457 child := n.mutableChild(i)
458 stealFrom := n.mutableChild(i - 1)
459 stolenItem := stealFrom.items.pop()
460 child.items.insertAt(0, n.items[i-1])
461 n.items[i-1] = stolenItem
462 if len(stealFrom.children) > 0 {
463 child.children.insertAt(0, stealFrom.children.pop())
464 }
465 } else if i < len(n.items) && len(n.children[i+1].items) > minItems {
466
467 child := n.mutableChild(i)
468 stealFrom := n.mutableChild(i + 1)
469 stolenItem := stealFrom.items.removeAt(0)
470 child.items = append(child.items, n.items[i])
471 n.items[i] = stolenItem
472 if len(stealFrom.children) > 0 {
473 child.children = append(child.children, stealFrom.children.removeAt(0))
474 }
475 } else {
476 if i >= len(n.items) {
477 i--
478 }
479 child := n.mutableChild(i)
480
481 mergeItem := n.items.removeAt(i)
482 mergeChild := n.children.removeAt(i + 1)
483 child.items = append(child.items, mergeItem)
484 child.items = append(child.items, mergeChild.items...)
485 child.children = append(child.children, mergeChild.children...)
486 n.cow.freeNode(mergeChild)
487 }
488 return n.remove(item, minItems, typ)
489 }
490
491 type direction int
492
493 const (
494 descend = direction(-1)
495 ascend = direction(+1)
496 )
497
498
499
500
501
502
503
504
505 func (n *node) iterate(dir direction, start, stop Item, includeStart bool, hit bool, iter ItemIterator) (bool, bool) {
506 var ok, found bool
507 var index int
508 switch dir {
509 case ascend:
510 if start != nil {
511 index, _ = n.items.find(start)
512 }
513 for i := index; i < len(n.items); i++ {
514 if len(n.children) > 0 {
515 if hit, ok = n.children[i].iterate(dir, start, stop, includeStart, hit, iter); !ok {
516 return hit, false
517 }
518 }
519 if !includeStart && !hit && start != nil && !start.Less(n.items[i]) {
520 hit = true
521 continue
522 }
523 hit = true
524 if stop != nil && !n.items[i].Less(stop) {
525 return hit, false
526 }
527 if !iter(n.items[i]) {
528 return hit, false
529 }
530 }
531 if len(n.children) > 0 {
532 if hit, ok = n.children[len(n.children)-1].iterate(dir, start, stop, includeStart, hit, iter); !ok {
533 return hit, false
534 }
535 }
536 case descend:
537 if start != nil {
538 index, found = n.items.find(start)
539 if !found {
540 index = index - 1
541 }
542 } else {
543 index = len(n.items) - 1
544 }
545 for i := index; i >= 0; i-- {
546 if start != nil && !n.items[i].Less(start) {
547 if !includeStart || hit || start.Less(n.items[i]) {
548 continue
549 }
550 }
551 if len(n.children) > 0 {
552 if hit, ok = n.children[i+1].iterate(dir, start, stop, includeStart, hit, iter); !ok {
553 return hit, false
554 }
555 }
556 if stop != nil && !stop.Less(n.items[i]) {
557 return hit, false
558 }
559 hit = true
560 if !iter(n.items[i]) {
561 return hit, false
562 }
563 }
564 if len(n.children) > 0 {
565 if hit, ok = n.children[0].iterate(dir, start, stop, includeStart, hit, iter); !ok {
566 return hit, false
567 }
568 }
569 }
570 return hit, true
571 }
572
573
574 func (n *node) print(w io.Writer, level int) {
575 fmt.Fprintf(w, "%sNODE:%v\n", strings.Repeat(" ", level), n.items)
576 for _, c := range n.children {
577 c.print(w, level+1)
578 }
579 }
580
581
582
583
584
585
586
587
588 type BTree struct {
589 degree int
590 length int
591 root *node
592 cow *copyOnWriteContext
593 }
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609 type copyOnWriteContext struct {
610 freelist *FreeList
611 }
612
613
614
615
616
617
618
619
620
621
622
623
624 func (t *BTree) Clone() (t2 *BTree) {
625
626
627
628
629
630 cow1, cow2 := *t.cow, *t.cow
631 out := *t
632 t.cow = &cow1
633 out.cow = &cow2
634 return &out
635 }
636
637
638 func (t *BTree) maxItems() int {
639 return t.degree*2 - 1
640 }
641
642
643
644 func (t *BTree) minItems() int {
645 return t.degree - 1
646 }
647
648 func (c *copyOnWriteContext) newNode() (n *node) {
649 n = c.freelist.newNode()
650 n.cow = c
651 return
652 }
653
654 type freeType int
655
656 const (
657 ftFreelistFull freeType = iota
658 ftStored
659 ftNotOwned
660 )
661
662
663
664
665 func (c *copyOnWriteContext) freeNode(n *node) freeType {
666 if n.cow == c {
667
668 n.items.truncate(0)
669 n.children.truncate(0)
670 n.cow = nil
671 if c.freelist.freeNode(n) {
672 return ftStored
673 } else {
674 return ftFreelistFull
675 }
676 } else {
677 return ftNotOwned
678 }
679 }
680
681
682
683
684
685
686 func (t *BTree) ReplaceOrInsert(item Item) Item {
687 if item == nil {
688 panic("nil item being added to BTree")
689 }
690 if t.root == nil {
691 t.root = t.cow.newNode()
692 t.root.items = append(t.root.items, item)
693 t.length++
694 return nil
695 } else {
696 t.root = t.root.mutableFor(t.cow)
697 if len(t.root.items) >= t.maxItems() {
698 item2, second := t.root.split(t.maxItems() / 2)
699 oldroot := t.root
700 t.root = t.cow.newNode()
701 t.root.items = append(t.root.items, item2)
702 t.root.children = append(t.root.children, oldroot, second)
703 }
704 }
705 out := t.root.insert(item, t.maxItems())
706 if out == nil {
707 t.length++
708 }
709 return out
710 }
711
712
713
714 func (t *BTree) Delete(item Item) Item {
715 return t.deleteItem(item, removeItem)
716 }
717
718
719
720 func (t *BTree) DeleteMin() Item {
721 return t.deleteItem(nil, removeMin)
722 }
723
724
725
726 func (t *BTree) DeleteMax() Item {
727 return t.deleteItem(nil, removeMax)
728 }
729
730 func (t *BTree) deleteItem(item Item, typ toRemove) Item {
731 if t.root == nil || len(t.root.items) == 0 {
732 return nil
733 }
734 t.root = t.root.mutableFor(t.cow)
735 out := t.root.remove(item, t.minItems(), typ)
736 if len(t.root.items) == 0 && len(t.root.children) > 0 {
737 oldroot := t.root
738 t.root = t.root.children[0]
739 t.cow.freeNode(oldroot)
740 }
741 if out != nil {
742 t.length--
743 }
744 return out
745 }
746
747
748
749 func (t *BTree) AscendRange(greaterOrEqual, lessThan Item, iterator ItemIterator) {
750 if t.root == nil {
751 return
752 }
753 t.root.iterate(ascend, greaterOrEqual, lessThan, true, false, iterator)
754 }
755
756
757
758 func (t *BTree) AscendLessThan(pivot Item, iterator ItemIterator) {
759 if t.root == nil {
760 return
761 }
762 t.root.iterate(ascend, nil, pivot, false, false, iterator)
763 }
764
765
766
767 func (t *BTree) AscendGreaterOrEqual(pivot Item, iterator ItemIterator) {
768 if t.root == nil {
769 return
770 }
771 t.root.iterate(ascend, pivot, nil, true, false, iterator)
772 }
773
774
775
776 func (t *BTree) Ascend(iterator ItemIterator) {
777 if t.root == nil {
778 return
779 }
780 t.root.iterate(ascend, nil, nil, false, false, iterator)
781 }
782
783
784
785 func (t *BTree) DescendRange(lessOrEqual, greaterThan Item, iterator ItemIterator) {
786 if t.root == nil {
787 return
788 }
789 t.root.iterate(descend, lessOrEqual, greaterThan, true, false, iterator)
790 }
791
792
793
794 func (t *BTree) DescendLessOrEqual(pivot Item, iterator ItemIterator) {
795 if t.root == nil {
796 return
797 }
798 t.root.iterate(descend, pivot, nil, true, false, iterator)
799 }
800
801
802
803 func (t *BTree) DescendGreaterThan(pivot Item, iterator ItemIterator) {
804 if t.root == nil {
805 return
806 }
807 t.root.iterate(descend, nil, pivot, false, false, iterator)
808 }
809
810
811
812 func (t *BTree) Descend(iterator ItemIterator) {
813 if t.root == nil {
814 return
815 }
816 t.root.iterate(descend, nil, nil, false, false, iterator)
817 }
818
819
820
821 func (t *BTree) Get(key Item) Item {
822 if t.root == nil {
823 return nil
824 }
825 return t.root.get(key)
826 }
827
828
829 func (t *BTree) Min() Item {
830 return min(t.root)
831 }
832
833
834 func (t *BTree) Max() Item {
835 return max(t.root)
836 }
837
838
839 func (t *BTree) Has(key Item) bool {
840 return t.Get(key) != nil
841 }
842
843
844 func (t *BTree) Len() int {
845 return t.length
846 }
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868 func (t *BTree) Clear(addNodesToFreelist bool) {
869 if t.root != nil && addNodesToFreelist {
870 t.root.reset(t.cow)
871 }
872 t.root, t.length = nil, 0
873 }
874
875
876
877
878 func (n *node) reset(c *copyOnWriteContext) bool {
879 for _, child := range n.children {
880 if !child.reset(c) {
881 return false
882 }
883 }
884 return c.freeNode(n) != ftFreelistFull
885 }
886
887
888 type Int int
889
890
891 func (a Int) Less(b Item) bool {
892 return a < b.(Int)
893 }
894
View as plain text