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
52
53
54
55
56
57
58
59
60
61 package btree
62
63 import (
64 "fmt"
65 "io"
66 "sort"
67 "strings"
68 "sync"
69 )
70
71
72 type Item interface {
73
74
75
76
77
78 Less(than Item) bool
79 }
80
81 const (
82 DefaultFreeListSize = 32
83 )
84
85
86
87
88
89 type FreeListG[T any] struct {
90 mu sync.Mutex
91 freelist []*node[T]
92 }
93
94
95
96 func NewFreeListG[T any](size int) *FreeListG[T] {
97 return &FreeListG[T]{freelist: make([]*node[T], 0, size)}
98 }
99
100 func (f *FreeListG[T]) newNode() (n *node[T]) {
101 f.mu.Lock()
102 index := len(f.freelist) - 1
103 if index < 0 {
104 f.mu.Unlock()
105 return new(node[T])
106 }
107 n = f.freelist[index]
108 f.freelist[index] = nil
109 f.freelist = f.freelist[:index]
110 f.mu.Unlock()
111 return
112 }
113
114 func (f *FreeListG[T]) freeNode(n *node[T]) (out bool) {
115 f.mu.Lock()
116 if len(f.freelist) < cap(f.freelist) {
117 f.freelist = append(f.freelist, n)
118 out = true
119 }
120 f.mu.Unlock()
121 return
122 }
123
124
125
126
127 type ItemIteratorG[T any] func(item T) bool
128
129
130 type Ordered interface {
131 ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~float32 | ~float64 | ~string
132 }
133
134
135 func Less[T Ordered]() LessFunc[T] {
136 return func(a, b T) bool { return a < b }
137 }
138
139
140 func NewOrderedG[T Ordered](degree int) *BTreeG[T] {
141 return NewG[T](degree, Less[T]())
142 }
143
144
145
146
147
148
149
150 func NewG[T any](degree int, less LessFunc[T]) *BTreeG[T] {
151 return NewWithFreeListG(degree, less, NewFreeListG[T](DefaultFreeListSize))
152 }
153
154
155 func NewWithFreeListG[T any](degree int, less LessFunc[T], f *FreeListG[T]) *BTreeG[T] {
156 if degree <= 1 {
157 panic("bad degree")
158 }
159 return &BTreeG[T]{
160 degree: degree,
161 cow: ©OnWriteContext[T]{freelist: f, less: less},
162 }
163 }
164
165
166 type items[T any] []T
167
168
169
170 func (s *items[T]) insertAt(index int, item T) {
171 var zero T
172 *s = append(*s, zero)
173 if index < len(*s) {
174 copy((*s)[index+1:], (*s)[index:])
175 }
176 (*s)[index] = item
177 }
178
179
180
181 func (s *items[T]) removeAt(index int) T {
182 item := (*s)[index]
183 copy((*s)[index:], (*s)[index+1:])
184 var zero T
185 (*s)[len(*s)-1] = zero
186 *s = (*s)[:len(*s)-1]
187 return item
188 }
189
190
191 func (s *items[T]) pop() (out T) {
192 index := len(*s) - 1
193 out = (*s)[index]
194 var zero T
195 (*s)[index] = zero
196 *s = (*s)[:index]
197 return
198 }
199
200
201
202 func (s *items[T]) truncate(index int) {
203 var toClear items[T]
204 *s, toClear = (*s)[:index], (*s)[index:]
205 var zero T
206 for i := 0; i < len(toClear); i++ {
207 toClear[i] = zero
208 }
209 }
210
211
212
213
214 func (s items[T]) find(item T, less func(T, T) bool) (index int, found bool) {
215 i := sort.Search(len(s), func(i int) bool {
216 return less(item, s[i])
217 })
218 if i > 0 && !less(s[i-1], item) {
219 return i - 1, true
220 }
221 return i, false
222 }
223
224
225
226
227
228
229 type node[T any] struct {
230 items items[T]
231 children items[*node[T]]
232 cow *copyOnWriteContext[T]
233 }
234
235 func (n *node[T]) mutableFor(cow *copyOnWriteContext[T]) *node[T] {
236 if n.cow == cow {
237 return n
238 }
239 out := cow.newNode()
240 if cap(out.items) >= len(n.items) {
241 out.items = out.items[:len(n.items)]
242 } else {
243 out.items = make(items[T], len(n.items), cap(n.items))
244 }
245 copy(out.items, n.items)
246
247 if cap(out.children) >= len(n.children) {
248 out.children = out.children[:len(n.children)]
249 } else {
250 out.children = make(items[*node[T]], len(n.children), cap(n.children))
251 }
252 copy(out.children, n.children)
253 return out
254 }
255
256 func (n *node[T]) mutableChild(i int) *node[T] {
257 c := n.children[i].mutableFor(n.cow)
258 n.children[i] = c
259 return c
260 }
261
262
263
264
265 func (n *node[T]) split(i int) (T, *node[T]) {
266 item := n.items[i]
267 next := n.cow.newNode()
268 next.items = append(next.items, n.items[i+1:]...)
269 n.items.truncate(i)
270 if len(n.children) > 0 {
271 next.children = append(next.children, n.children[i+1:]...)
272 n.children.truncate(i + 1)
273 }
274 return item, next
275 }
276
277
278
279 func (n *node[T]) maybeSplitChild(i, maxItems int) bool {
280 if len(n.children[i].items) < maxItems {
281 return false
282 }
283 first := n.mutableChild(i)
284 item, second := first.split(maxItems / 2)
285 n.items.insertAt(i, item)
286 n.children.insertAt(i+1, second)
287 return true
288 }
289
290
291
292
293 func (n *node[T]) insert(item T, maxItems int) (_ T, _ bool) {
294 i, found := n.items.find(item, n.cow.less)
295 if found {
296 out := n.items[i]
297 n.items[i] = item
298 return out, true
299 }
300 if len(n.children) == 0 {
301 n.items.insertAt(i, item)
302 return
303 }
304 if n.maybeSplitChild(i, maxItems) {
305 inTree := n.items[i]
306 switch {
307 case n.cow.less(item, inTree):
308
309 case n.cow.less(inTree, item):
310 i++
311 default:
312 out := n.items[i]
313 n.items[i] = item
314 return out, true
315 }
316 }
317 return n.mutableChild(i).insert(item, maxItems)
318 }
319
320
321 func (n *node[T]) get(key T) (_ T, _ bool) {
322 i, found := n.items.find(key, n.cow.less)
323 if found {
324 return n.items[i], true
325 } else if len(n.children) > 0 {
326 return n.children[i].get(key)
327 }
328 return
329 }
330
331
332 func min[T any](n *node[T]) (_ T, found bool) {
333 if n == nil {
334 return
335 }
336 for len(n.children) > 0 {
337 n = n.children[0]
338 }
339 if len(n.items) == 0 {
340 return
341 }
342 return n.items[0], true
343 }
344
345
346 func max[T any](n *node[T]) (_ T, found bool) {
347 if n == nil {
348 return
349 }
350 for len(n.children) > 0 {
351 n = n.children[len(n.children)-1]
352 }
353 if len(n.items) == 0 {
354 return
355 }
356 return n.items[len(n.items)-1], true
357 }
358
359
360 type toRemove int
361
362 const (
363 removeItem toRemove = iota
364 removeMin
365 removeMax
366 )
367
368
369 func (n *node[T]) remove(item T, minItems int, typ toRemove) (_ T, _ bool) {
370 var i int
371 var found bool
372 switch typ {
373 case removeMax:
374 if len(n.children) == 0 {
375 return n.items.pop(), true
376 }
377 i = len(n.items)
378 case removeMin:
379 if len(n.children) == 0 {
380 return n.items.removeAt(0), true
381 }
382 i = 0
383 case removeItem:
384 i, found = n.items.find(item, n.cow.less)
385 if len(n.children) == 0 {
386 if found {
387 return n.items.removeAt(i), true
388 }
389 return
390 }
391 default:
392 panic("invalid type")
393 }
394
395 if len(n.children[i].items) <= minItems {
396 return n.growChildAndRemove(i, item, minItems, typ)
397 }
398 child := n.mutableChild(i)
399
400
401
402 if found {
403
404
405 out := n.items[i]
406
407
408
409 var zero T
410 n.items[i], _ = child.remove(zero, minItems, removeMax)
411 return out, true
412 }
413
414
415 return child.remove(item, minItems, typ)
416 }
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437 func (n *node[T]) growChildAndRemove(i int, item T, minItems int, typ toRemove) (T, bool) {
438 if i > 0 && len(n.children[i-1].items) > minItems {
439
440 child := n.mutableChild(i)
441 stealFrom := n.mutableChild(i - 1)
442 stolenItem := stealFrom.items.pop()
443 child.items.insertAt(0, n.items[i-1])
444 n.items[i-1] = stolenItem
445 if len(stealFrom.children) > 0 {
446 child.children.insertAt(0, stealFrom.children.pop())
447 }
448 } else if i < len(n.items) && len(n.children[i+1].items) > minItems {
449
450 child := n.mutableChild(i)
451 stealFrom := n.mutableChild(i + 1)
452 stolenItem := stealFrom.items.removeAt(0)
453 child.items = append(child.items, n.items[i])
454 n.items[i] = stolenItem
455 if len(stealFrom.children) > 0 {
456 child.children = append(child.children, stealFrom.children.removeAt(0))
457 }
458 } else {
459 if i >= len(n.items) {
460 i--
461 }
462 child := n.mutableChild(i)
463
464 mergeItem := n.items.removeAt(i)
465 mergeChild := n.children.removeAt(i + 1)
466 child.items = append(child.items, mergeItem)
467 child.items = append(child.items, mergeChild.items...)
468 child.children = append(child.children, mergeChild.children...)
469 n.cow.freeNode(mergeChild)
470 }
471 return n.remove(item, minItems, typ)
472 }
473
474 type direction int
475
476 const (
477 descend = direction(-1)
478 ascend = direction(+1)
479 )
480
481 type optionalItem[T any] struct {
482 item T
483 valid bool
484 }
485
486 func optional[T any](item T) optionalItem[T] {
487 return optionalItem[T]{item: item, valid: true}
488 }
489 func empty[T any]() optionalItem[T] {
490 return optionalItem[T]{}
491 }
492
493
494
495
496
497
498
499
500 func (n *node[T]) iterate(dir direction, start, stop optionalItem[T], includeStart bool, hit bool, iter ItemIteratorG[T]) (bool, bool) {
501 var ok, found bool
502 var index int
503 switch dir {
504 case ascend:
505 if start.valid {
506 index, _ = n.items.find(start.item, n.cow.less)
507 }
508 for i := index; i < len(n.items); i++ {
509 if len(n.children) > 0 {
510 if hit, ok = n.children[i].iterate(dir, start, stop, includeStart, hit, iter); !ok {
511 return hit, false
512 }
513 }
514 if !includeStart && !hit && start.valid && !n.cow.less(start.item, n.items[i]) {
515 hit = true
516 continue
517 }
518 hit = true
519 if stop.valid && !n.cow.less(n.items[i], stop.item) {
520 return hit, false
521 }
522 if !iter(n.items[i]) {
523 return hit, false
524 }
525 }
526 if len(n.children) > 0 {
527 if hit, ok = n.children[len(n.children)-1].iterate(dir, start, stop, includeStart, hit, iter); !ok {
528 return hit, false
529 }
530 }
531 case descend:
532 if start.valid {
533 index, found = n.items.find(start.item, n.cow.less)
534 if !found {
535 index = index - 1
536 }
537 } else {
538 index = len(n.items) - 1
539 }
540 for i := index; i >= 0; i-- {
541 if start.valid && !n.cow.less(n.items[i], start.item) {
542 if !includeStart || hit || n.cow.less(start.item, n.items[i]) {
543 continue
544 }
545 }
546 if len(n.children) > 0 {
547 if hit, ok = n.children[i+1].iterate(dir, start, stop, includeStart, hit, iter); !ok {
548 return hit, false
549 }
550 }
551 if stop.valid && !n.cow.less(stop.item, n.items[i]) {
552 return hit, false
553 }
554 hit = true
555 if !iter(n.items[i]) {
556 return hit, false
557 }
558 }
559 if len(n.children) > 0 {
560 if hit, ok = n.children[0].iterate(dir, start, stop, includeStart, hit, iter); !ok {
561 return hit, false
562 }
563 }
564 }
565 return hit, true
566 }
567
568
569 func (n *node[T]) print(w io.Writer, level int) {
570 fmt.Fprintf(w, "%sNODE:%v\n", strings.Repeat(" ", level), n.items)
571 for _, c := range n.children {
572 c.print(w, level+1)
573 }
574 }
575
576
577
578
579
580
581
582
583 type BTreeG[T any] struct {
584 degree int
585 length int
586 root *node[T]
587 cow *copyOnWriteContext[T]
588 }
589
590
591
592 type LessFunc[T any] func(a, b T) bool
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608 type copyOnWriteContext[T any] struct {
609 freelist *FreeListG[T]
610 less LessFunc[T]
611 }
612
613
614
615
616
617
618
619
620
621
622
623
624 func (t *BTreeG[T]) Clone() (t2 *BTreeG[T]) {
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 *BTreeG[T]) maxItems() int {
639 return t.degree*2 - 1
640 }
641
642
643
644 func (t *BTreeG[T]) minItems() int {
645 return t.degree - 1
646 }
647
648 func (c *copyOnWriteContext[T]) newNode() (n *node[T]) {
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[T]) freeNode(n *node[T]) 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 *BTreeG[T]) ReplaceOrInsert(item T) (_ T, _ bool) {
687 if t.root == nil {
688 t.root = t.cow.newNode()
689 t.root.items = append(t.root.items, item)
690 t.length++
691 return
692 } else {
693 t.root = t.root.mutableFor(t.cow)
694 if len(t.root.items) >= t.maxItems() {
695 item2, second := t.root.split(t.maxItems() / 2)
696 oldroot := t.root
697 t.root = t.cow.newNode()
698 t.root.items = append(t.root.items, item2)
699 t.root.children = append(t.root.children, oldroot, second)
700 }
701 }
702 out, outb := t.root.insert(item, t.maxItems())
703 if !outb {
704 t.length++
705 }
706 return out, outb
707 }
708
709
710
711 func (t *BTreeG[T]) Delete(item T) (T, bool) {
712 return t.deleteItem(item, removeItem)
713 }
714
715
716
717 func (t *BTreeG[T]) DeleteMin() (T, bool) {
718 var zero T
719 return t.deleteItem(zero, removeMin)
720 }
721
722
723
724 func (t *BTreeG[T]) DeleteMax() (T, bool) {
725 var zero T
726 return t.deleteItem(zero, removeMax)
727 }
728
729 func (t *BTreeG[T]) deleteItem(item T, typ toRemove) (_ T, _ bool) {
730 if t.root == nil || len(t.root.items) == 0 {
731 return
732 }
733 t.root = t.root.mutableFor(t.cow)
734 out, outb := t.root.remove(item, t.minItems(), typ)
735 if len(t.root.items) == 0 && len(t.root.children) > 0 {
736 oldroot := t.root
737 t.root = t.root.children[0]
738 t.cow.freeNode(oldroot)
739 }
740 if outb {
741 t.length--
742 }
743 return out, outb
744 }
745
746
747
748 func (t *BTreeG[T]) AscendRange(greaterOrEqual, lessThan T, iterator ItemIteratorG[T]) {
749 if t.root == nil {
750 return
751 }
752 t.root.iterate(ascend, optional[T](greaterOrEqual), optional[T](lessThan), true, false, iterator)
753 }
754
755
756
757 func (t *BTreeG[T]) AscendLessThan(pivot T, iterator ItemIteratorG[T]) {
758 if t.root == nil {
759 return
760 }
761 t.root.iterate(ascend, empty[T](), optional(pivot), false, false, iterator)
762 }
763
764
765
766 func (t *BTreeG[T]) AscendGreaterOrEqual(pivot T, iterator ItemIteratorG[T]) {
767 if t.root == nil {
768 return
769 }
770 t.root.iterate(ascend, optional[T](pivot), empty[T](), true, false, iterator)
771 }
772
773
774
775 func (t *BTreeG[T]) Ascend(iterator ItemIteratorG[T]) {
776 if t.root == nil {
777 return
778 }
779 t.root.iterate(ascend, empty[T](), empty[T](), false, false, iterator)
780 }
781
782
783
784 func (t *BTreeG[T]) DescendRange(lessOrEqual, greaterThan T, iterator ItemIteratorG[T]) {
785 if t.root == nil {
786 return
787 }
788 t.root.iterate(descend, optional[T](lessOrEqual), optional[T](greaterThan), true, false, iterator)
789 }
790
791
792
793 func (t *BTreeG[T]) DescendLessOrEqual(pivot T, iterator ItemIteratorG[T]) {
794 if t.root == nil {
795 return
796 }
797 t.root.iterate(descend, optional[T](pivot), empty[T](), true, false, iterator)
798 }
799
800
801
802 func (t *BTreeG[T]) DescendGreaterThan(pivot T, iterator ItemIteratorG[T]) {
803 if t.root == nil {
804 return
805 }
806 t.root.iterate(descend, empty[T](), optional[T](pivot), false, false, iterator)
807 }
808
809
810
811 func (t *BTreeG[T]) Descend(iterator ItemIteratorG[T]) {
812 if t.root == nil {
813 return
814 }
815 t.root.iterate(descend, empty[T](), empty[T](), false, false, iterator)
816 }
817
818
819
820 func (t *BTreeG[T]) Get(key T) (_ T, _ bool) {
821 if t.root == nil {
822 return
823 }
824 return t.root.get(key)
825 }
826
827
828 func (t *BTreeG[T]) Min() (_ T, _ bool) {
829 return min(t.root)
830 }
831
832
833 func (t *BTreeG[T]) Max() (_ T, _ bool) {
834 return max(t.root)
835 }
836
837
838 func (t *BTreeG[T]) Has(key T) bool {
839 _, ok := t.Get(key)
840 return ok
841 }
842
843
844 func (t *BTreeG[T]) 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 *BTreeG[T]) 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[T]) reset(c *copyOnWriteContext[T]) 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
895
896
897
898
899
900
901
902 type BTree BTreeG[Item]
903
904 var itemLess LessFunc[Item] = func(a, b Item) bool {
905 return a.Less(b)
906 }
907
908
909
910
911
912 func New(degree int) *BTree {
913 return (*BTree)(NewG[Item](degree, itemLess))
914 }
915
916
917
918
919
920 type FreeList FreeListG[Item]
921
922
923
924 func NewFreeList(size int) *FreeList {
925 return (*FreeList)(NewFreeListG[Item](size))
926 }
927
928
929 func NewWithFreeList(degree int, f *FreeList) *BTree {
930 return (*BTree)(NewWithFreeListG[Item](degree, itemLess, (*FreeListG[Item])(f)))
931 }
932
933
934
935
936 type ItemIterator ItemIteratorG[Item]
937
938
939
940
941
942
943
944
945
946
947
948
949 func (t *BTree) Clone() (t2 *BTree) {
950 return (*BTree)((*BTreeG[Item])(t).Clone())
951 }
952
953
954
955 func (t *BTree) Delete(item Item) Item {
956 i, _ := (*BTreeG[Item])(t).Delete(item)
957 return i
958 }
959
960
961
962 func (t *BTree) DeleteMax() Item {
963 i, _ := (*BTreeG[Item])(t).DeleteMax()
964 return i
965 }
966
967
968
969 func (t *BTree) DeleteMin() Item {
970 i, _ := (*BTreeG[Item])(t).DeleteMin()
971 return i
972 }
973
974
975
976 func (t *BTree) Get(key Item) Item {
977 i, _ := (*BTreeG[Item])(t).Get(key)
978 return i
979 }
980
981
982 func (t *BTree) Max() Item {
983 i, _ := (*BTreeG[Item])(t).Max()
984 return i
985 }
986
987
988 func (t *BTree) Min() Item {
989 i, _ := (*BTreeG[Item])(t).Min()
990 return i
991 }
992
993
994 func (t *BTree) Has(key Item) bool {
995 return (*BTreeG[Item])(t).Has(key)
996 }
997
998
999
1000
1001
1002
1003 func (t *BTree) ReplaceOrInsert(item Item) Item {
1004 i, _ := (*BTreeG[Item])(t).ReplaceOrInsert(item)
1005 return i
1006 }
1007
1008
1009
1010 func (t *BTree) AscendRange(greaterOrEqual, lessThan Item, iterator ItemIterator) {
1011 (*BTreeG[Item])(t).AscendRange(greaterOrEqual, lessThan, (ItemIteratorG[Item])(iterator))
1012 }
1013
1014
1015
1016 func (t *BTree) AscendLessThan(pivot Item, iterator ItemIterator) {
1017 (*BTreeG[Item])(t).AscendLessThan(pivot, (ItemIteratorG[Item])(iterator))
1018 }
1019
1020
1021
1022 func (t *BTree) AscendGreaterOrEqual(pivot Item, iterator ItemIterator) {
1023 (*BTreeG[Item])(t).AscendGreaterOrEqual(pivot, (ItemIteratorG[Item])(iterator))
1024 }
1025
1026
1027
1028 func (t *BTree) Ascend(iterator ItemIterator) {
1029 (*BTreeG[Item])(t).Ascend((ItemIteratorG[Item])(iterator))
1030 }
1031
1032
1033
1034 func (t *BTree) DescendRange(lessOrEqual, greaterThan Item, iterator ItemIterator) {
1035 (*BTreeG[Item])(t).DescendRange(lessOrEqual, greaterThan, (ItemIteratorG[Item])(iterator))
1036 }
1037
1038
1039
1040 func (t *BTree) DescendLessOrEqual(pivot Item, iterator ItemIterator) {
1041 (*BTreeG[Item])(t).DescendLessOrEqual(pivot, (ItemIteratorG[Item])(iterator))
1042 }
1043
1044
1045
1046 func (t *BTree) DescendGreaterThan(pivot Item, iterator ItemIterator) {
1047 (*BTreeG[Item])(t).DescendGreaterThan(pivot, (ItemIteratorG[Item])(iterator))
1048 }
1049
1050
1051
1052 func (t *BTree) Descend(iterator ItemIterator) {
1053 (*BTreeG[Item])(t).Descend((ItemIteratorG[Item])(iterator))
1054 }
1055
1056
1057 func (t *BTree) Len() int {
1058 return (*BTreeG[Item])(t).Len()
1059 }
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081 func (t *BTree) Clear(addNodesToFreelist bool) {
1082 (*BTreeG[Item])(t).Clear(addNodesToFreelist)
1083 }
1084
View as plain text