You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

151 lines
3.2 KiB

  1. package bptree
  2. // started by copying from https://sourcegraph.com/github.com/timtadh/data-structures@master/-/tree/tree/bptree
  3. /* A BpTree is a B+Tree with support for duplicate keys. This makes it behave as
  4. * a MultiMap. Additionally you can use the Range operator to select k/v in a
  5. * range. If from > to it will iterate backwards.
  6. */
  7. type BpTree struct {
  8. root *BpNode
  9. }
  10. type loc_iterator func() (i int, leaf *BpNode, li loc_iterator)
  11. func NewBpTree(node_size int) *BpTree {
  12. return &BpTree{
  13. root: NewLeaf(node_size, false),
  14. }
  15. }
  16. func (self *BpTree) Has(key Hashable) bool {
  17. if len(self.root.keys) == 0 {
  18. return false
  19. }
  20. j, l := self.root.get_start(key)
  21. return l.keys[j].Equals(key)
  22. }
  23. func (self *BpTree) Count(key Hashable) int {
  24. if len(self.root.keys) == 0 {
  25. return 0
  26. }
  27. j, l := self.root.get_start(key)
  28. count := 0
  29. end := false
  30. for !end && l.keys[j].Equals(key) {
  31. count++
  32. j, l, end = next_location(j, l)
  33. }
  34. return count
  35. }
  36. func (self *BpTree) Add(key Hashable, value interface{}) (err error) {
  37. new_root, err := self.root.put(key, value)
  38. if err != nil {
  39. return err
  40. }
  41. self.root = new_root
  42. return nil
  43. }
  44. func (self *BpTree) Replace(key Hashable, where WhereFunc, value interface{}) (err error) {
  45. li := self.root.forward(key, key)
  46. for i, leaf, next := li(); next != nil; i, leaf, next = next() {
  47. if where(leaf.values[i]) {
  48. leaf.values[i] = value
  49. }
  50. }
  51. return nil
  52. }
  53. func (self *BpTree) Find(key Hashable) (kvi KVIterator) {
  54. return self.Range(key, key)
  55. }
  56. func (self *BpTree) Range(from, to Hashable) (kvi KVIterator) {
  57. var li loc_iterator
  58. if !to.Less(from) {
  59. li = self.root.forward(from, to)
  60. } else {
  61. li = self.root.backward(from, to)
  62. }
  63. kvi = func() (key Hashable, value interface{}, next KVIterator) {
  64. var i int
  65. var leaf *BpNode
  66. i, leaf, li = li()
  67. if li == nil {
  68. return nil, nil, nil
  69. }
  70. return leaf.keys[i], leaf.values[i], kvi
  71. }
  72. return kvi
  73. }
  74. func (self *BpTree) RemoveWhere(key Hashable, where WhereFunc) (err error) {
  75. ns := self.root.NodeSize()
  76. new_root, err := self.root.remove(key, where)
  77. if err != nil {
  78. return err
  79. }
  80. if new_root == nil {
  81. self.root = NewLeaf(ns, false)
  82. } else {
  83. self.root = new_root
  84. }
  85. return nil
  86. }
  87. func (self *BpTree) Keys() (ki KIterator) {
  88. li := self.root.all()
  89. var prev Equatable
  90. ki = func() (key Hashable, next KIterator) {
  91. var i int
  92. var leaf *BpNode
  93. i, leaf, li = li()
  94. if li == nil {
  95. return nil, nil
  96. }
  97. if leaf.keys[i].Equals(prev) {
  98. return ki()
  99. }
  100. prev = leaf.keys[i]
  101. return leaf.keys[i], ki
  102. }
  103. return ki
  104. }
  105. func (self *BpTree) Values() (vi Iterator) {
  106. return MakeValuesIterator(self)
  107. }
  108. func (self *BpTree) Items() (vi KIterator) {
  109. return MakeItemsIterator(self)
  110. }
  111. func (self *BpTree) Iterate() (kvi KVIterator) {
  112. li := self.root.all()
  113. kvi = func() (key Hashable, value interface{}, next KVIterator) {
  114. var i int
  115. var leaf *BpNode
  116. i, leaf, li = li()
  117. if li == nil {
  118. return nil, nil, nil
  119. }
  120. return leaf.keys[i], leaf.values[i], kvi
  121. }
  122. return kvi
  123. }
  124. func (self *BpTree) Backward() (kvi KVIterator) {
  125. li := self.root.all_backward()
  126. kvi = func() (key Hashable, value interface{}, next KVIterator) {
  127. var i int
  128. var leaf *BpNode
  129. i, leaf, li = li()
  130. if li == nil {
  131. return nil, nil, nil
  132. }
  133. return leaf.keys[i], leaf.values[i], kvi
  134. }
  135. return kvi
  136. }