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.

775 lines
19 KiB

  1. package bptree
  2. type ItemKey Hashable
  3. type ItemValue Equatable
  4. type PersistFunc func(node *BpNode) error
  5. type DestroyFunc func(node *BpNode) error
  6. var (
  7. PersistFn PersistFunc
  8. DestroyFn DestroyFunc
  9. )
  10. type BpNode struct {
  11. keys []ItemKey
  12. values []ItemValue
  13. pointers []*BpNode
  14. next *BpNode
  15. prev *BpNode
  16. no_dup bool
  17. protoNodeId int64
  18. protoNode *ProtoNode
  19. }
  20. func NewInternal(size int) *BpNode {
  21. if size < 0 {
  22. panic(NegativeSize())
  23. }
  24. return &BpNode{
  25. keys: make([]ItemKey, 0, size),
  26. pointers: make([]*BpNode, 0, size),
  27. protoNodeId: GetProtoNodeId(),
  28. }
  29. }
  30. func NewLeaf(size int, no_dup bool) *BpNode {
  31. if size < 0 {
  32. panic(NegativeSize())
  33. }
  34. return &BpNode{
  35. keys: make([]ItemKey, 0, size),
  36. values: make([]ItemValue, 0, size),
  37. no_dup: no_dup,
  38. protoNodeId: GetProtoNodeId(),
  39. }
  40. }
  41. func (self *BpNode) Full() bool {
  42. return len(self.keys) == cap(self.keys)
  43. }
  44. func (self *BpNode) Pure() bool {
  45. if len(self.keys) == 0 {
  46. return true
  47. }
  48. k0 := self.keys[0]
  49. for _, k := range self.keys {
  50. if !k0.Equals(k) {
  51. return false
  52. }
  53. }
  54. return true
  55. }
  56. func (self *BpNode) Internal() bool {
  57. return cap(self.pointers) > 0
  58. }
  59. func (self *BpNode) NodeSize() int {
  60. return cap(self.keys)
  61. }
  62. func (self *BpNode) Height() int {
  63. if !self.Internal() {
  64. return 1
  65. } else if len(self.pointers) == 0 {
  66. panic(BpTreeError("Internal node has no pointers but asked for height"))
  67. }
  68. return self.pointers[0].Height() + 1
  69. }
  70. func (self *BpNode) count(key ItemKey) int {
  71. i, _ := self.find(key)
  72. count := 0
  73. for ; i < len(self.keys); i++ {
  74. if self.keys[i].Equals(key) {
  75. count++
  76. } else {
  77. break
  78. }
  79. }
  80. return count
  81. }
  82. func (self *BpNode) has(key ItemKey) bool {
  83. _, has := self.find(key)
  84. return has
  85. }
  86. func (self *BpNode) left_most_leaf() *BpNode {
  87. if self.Internal() {
  88. return self.pointers[0].left_most_leaf()
  89. }
  90. return self
  91. }
  92. func (self *BpNode) right_most_leaf() *BpNode {
  93. if self.Internal() {
  94. return self.pointers[len(self.pointers)-1].right_most_leaf()
  95. }
  96. return self
  97. }
  98. /* returns the index and leaf-block of the first key greater than or equal to
  99. * the search key. (unless the search key is greater than all the keys in the
  100. * tree, in that case it will be the last key in the tree)
  101. */
  102. func (self *BpNode) get_start(key ItemKey) (i int, leaf *BpNode) {
  103. if self.Internal() {
  104. return self.internal_get_start(key)
  105. } else {
  106. return self.leaf_get_start(key)
  107. }
  108. }
  109. func next_location(i int, leaf *BpNode) (int, *BpNode, bool) {
  110. j := i + 1
  111. for j >= len(leaf.keys) && leaf.getNext() != nil {
  112. j = 0
  113. leaf = leaf.getNext()
  114. }
  115. if j >= len(leaf.keys) {
  116. return -1, nil, true
  117. }
  118. return j, leaf, false
  119. }
  120. func prev_location(i int, leaf *BpNode) (int, *BpNode, bool) {
  121. j := i - 1
  122. for j < 0 && leaf.getPrev() != nil {
  123. leaf = leaf.getPrev()
  124. j = len(leaf.keys) - 1
  125. }
  126. if j < 0 {
  127. return -1, nil, true
  128. }
  129. return j, leaf, false
  130. }
  131. /* returns the index and leaf-block of the last key equal to the search key or
  132. * the first key greater than the search key. (unless the search key is greater
  133. * than all the keys in the tree, in that case it will be the last key in the
  134. * tree)
  135. */
  136. func (self *BpNode) get_end(key ItemKey) (i int, leaf *BpNode) {
  137. end := false
  138. i, leaf = self.get_start(key)
  139. pi, pleaf := i, leaf
  140. for !end && leaf.keys[i].Equals(key) {
  141. pi, pleaf = i, leaf
  142. i, leaf, end = next_location(i, leaf)
  143. }
  144. return pi, pleaf
  145. }
  146. func (self *BpNode) internal_get_start(key ItemKey) (i int, leaf *BpNode) {
  147. if !self.Internal() {
  148. panic(BpTreeError("Expected a internal node"))
  149. }
  150. i, has := self.find(key)
  151. if !has && i > 0 {
  152. // if it doesn't have it and the index > 0 then we have the next block
  153. // so we have to subtract one from the index.
  154. i--
  155. }
  156. child := self.pointers[i]
  157. return child.get_start(key)
  158. }
  159. func (self *BpNode) leaf_get_start(key ItemKey) (i int, leaf *BpNode) {
  160. i, has := self.find(key)
  161. if i >= len(self.keys) && i > 0 {
  162. i = len(self.keys) - 1
  163. }
  164. if !has && (len(self.keys) == 0 || self.keys[i].Less(key)) && self.getNext() != nil {
  165. return self.getNext().leaf_get_start(key)
  166. }
  167. return i, self
  168. }
  169. /* This puts the k/v pair into the B+Tree rooted at this node and returns the
  170. * (possibly) new root of the tree.
  171. */
  172. func (self *BpNode) put(key ItemKey, value ItemValue) (root *BpNode, err error) {
  173. a, b, err := self.insert(key, value)
  174. if err != nil {
  175. return nil, err
  176. } else if b == nil {
  177. return a, nil
  178. }
  179. // else we have root split
  180. root = NewInternal(self.NodeSize())
  181. root.put_kp(a.keys[0], a)
  182. root.put_kp(b.keys[0], b)
  183. return root, root.persist()
  184. }
  185. // right is only set on split
  186. // left is always set. When split is false left is the pointer to block
  187. // When split is true left is the pointer to the new left
  188. // block
  189. func (self *BpNode) insert(key ItemKey, value ItemValue) (a, b *BpNode, err error) {
  190. if self.Internal() {
  191. return self.internal_insert(key, value)
  192. } else { // leaf node
  193. return self.leaf_insert(key, value)
  194. }
  195. }
  196. /* - first find the child to insert into
  197. * - do the child insert
  198. * - if there was a split:
  199. * - if the block is full, split this block
  200. * - else insert the new key/pointer into this block
  201. */
  202. func (self *BpNode) internal_insert(key ItemKey, value ItemValue) (a, b *BpNode, err error) {
  203. if !self.Internal() {
  204. return nil, nil, BpTreeError("Expected a internal node")
  205. }
  206. i, has := self.find(key)
  207. if !has && i > 0 {
  208. // if it doesn't have it and the index > 0 then we have the next block
  209. // so we have to subtract one from the index.
  210. i--
  211. }
  212. child := self.pointers[i]
  213. p, q, err := child.insert(key, value)
  214. if err != nil {
  215. return nil, nil, err
  216. }
  217. self.keys[i] = p.keys[0]
  218. self.pointers[i] = p
  219. if q != nil {
  220. // we had a split
  221. if self.Full() {
  222. return self.internal_split(q.keys[0], q)
  223. } else {
  224. if err := self.put_kp(q.keys[0], q); err != nil {
  225. return nil, nil, err
  226. }
  227. return self, nil, self.persist()
  228. }
  229. }
  230. return self, nil, self.maybePersist(child != p)
  231. }
  232. /* On split
  233. * - first assert that the key to be inserted is not already in the block.
  234. * - Make a new block
  235. * - balance the two blocks.
  236. * - insert the new key/pointer combo into the correct block
  237. */
  238. func (self *BpNode) internal_split(key ItemKey, ptr *BpNode) (a, b *BpNode, err error) {
  239. if !self.Internal() {
  240. return nil, nil, BpTreeError("Expected a internal node")
  241. }
  242. if self.has(key) {
  243. return nil, nil, BpTreeError("Tried to split an internal block on duplicate key")
  244. }
  245. a = self
  246. b = NewInternal(self.NodeSize())
  247. balance_nodes(a, b)
  248. if key.Less(b.keys[0]) {
  249. if err := a.put_kp(key, ptr); err != nil {
  250. return nil, nil, err
  251. }
  252. } else {
  253. if err := b.put_kp(key, ptr); err != nil {
  254. return nil, nil, err
  255. }
  256. }
  257. return a, b, persist(a, b)
  258. }
  259. /* if the leaf is full then it will defer to a leaf_split
  260. * (but in one case that will not actually split in the case of a insert into
  261. * a pure block with a matching key)
  262. * else this leaf will get a new entry.
  263. */
  264. func (self *BpNode) leaf_insert(key ItemKey, value ItemValue) (a, b *BpNode, err error) {
  265. if self.Internal() {
  266. return nil, nil, BpTreeError("Expected a leaf node")
  267. }
  268. if self.no_dup {
  269. i, has := self.find(key)
  270. if has {
  271. self.values[i] = value
  272. return self, nil, self.persist()
  273. }
  274. }
  275. if self.Full() {
  276. return self.leaf_split(key, value)
  277. } else {
  278. if err := self.put_kv(key, value); err != nil {
  279. return nil, nil, err
  280. }
  281. return self, nil, self.persist()
  282. }
  283. }
  284. /* on leaf split if the block is pure then it will defer to pure_leaf_split
  285. * else
  286. * - a new block will be made and inserted after this one
  287. * - the two blocks will be balanced with balanced_nodes
  288. * - if the key is less than b.keys[0] it will go in a else b
  289. */
  290. func (self *BpNode) leaf_split(key ItemKey, value ItemValue) (a, b *BpNode, err error) {
  291. if self.Internal() {
  292. return nil, nil, BpTreeError("Expected a leaf node")
  293. }
  294. if self.Pure() {
  295. return self.pure_leaf_split(key, value)
  296. }
  297. a = self
  298. b = NewLeaf(self.NodeSize(), self.no_dup)
  299. insert_linked_list_node(b, a, a.getNext())
  300. balance_nodes(a, b)
  301. if key.Less(b.keys[0]) {
  302. if err := a.put_kv(key, value); err != nil {
  303. return nil, nil, err
  304. }
  305. } else {
  306. if err := b.put_kv(key, value); err != nil {
  307. return nil, nil, err
  308. }
  309. }
  310. return a, b, persist(a, b)
  311. }
  312. /* a pure leaf split has two cases:
  313. * 1) the inserted key is less than the current pure block.
  314. * - a new block should be created before the current block
  315. * - the key should be put in it
  316. * 2) the inserted key is greater than or equal to the pure block.
  317. * - the end of run of pure blocks should be found
  318. * - if the key is equal to pure block and the last block is not full insert
  319. * the new kv
  320. * - else split by making a new block after the last block in the run
  321. * and putting the new key there.
  322. * - always return the current block as "a" and the new block as "b"
  323. */
  324. func (self *BpNode) pure_leaf_split(key ItemKey, value ItemValue) (a, b *BpNode, err error) {
  325. if self.Internal() || !self.Pure() {
  326. return nil, nil, BpTreeError("Expected a pure leaf node")
  327. }
  328. if key.Less(self.keys[0]) {
  329. a = NewLeaf(self.NodeSize(), self.no_dup)
  330. b = self
  331. if err := a.put_kv(key, value); err != nil {
  332. return nil, nil, err
  333. }
  334. insert_linked_list_node(a, b.getPrev(), b)
  335. return a, b, persist(a, b)
  336. } else {
  337. a = self
  338. e := self.find_end_of_pure_run()
  339. if e.keys[0].Equals(key) && !e.Full() {
  340. if err := e.put_kv(key, value); err != nil {
  341. return nil, nil, err
  342. }
  343. return a, nil, a.persist()
  344. } else {
  345. b = NewLeaf(self.NodeSize(), self.no_dup)
  346. if err := b.put_kv(key, value); err != nil {
  347. return nil, nil, err
  348. }
  349. insert_linked_list_node(b, e, e.getNext())
  350. if e.keys[0].Equals(key) {
  351. return a, nil, nil
  352. }
  353. return a, b, persist(a, b)
  354. }
  355. }
  356. }
  357. func (self *BpNode) put_kp(key ItemKey, ptr *BpNode) error {
  358. if self.Full() {
  359. return BpTreeError("Block is full.")
  360. }
  361. if !self.Internal() {
  362. return BpTreeError("Expected a internal node")
  363. }
  364. i, has := self.find(key)
  365. if has {
  366. return BpTreeError("Tried to insert a duplicate key into an internal node")
  367. } else if i < 0 {
  368. panic(BpTreeError("find returned a negative int"))
  369. } else if i >= cap(self.keys) {
  370. panic(BpTreeError("find returned a int > than cap(keys)"))
  371. }
  372. if err := self.put_key_at(i, key); err != nil {
  373. return err
  374. }
  375. if err := self.put_pointer_at(i, ptr); err != nil {
  376. return err
  377. }
  378. return nil
  379. }
  380. func (self *BpNode) put_kv(key ItemKey, value ItemValue) error {
  381. if self.Full() {
  382. return BpTreeError("Block is full.")
  383. }
  384. if self.Internal() {
  385. return BpTreeError("Expected a leaf node")
  386. }
  387. i, _ := self.find(key)
  388. if i < 0 {
  389. panic(BpTreeError("find returned a negative int"))
  390. } else if i >= cap(self.keys) {
  391. panic(BpTreeError("find returned a int > than cap(keys)"))
  392. }
  393. if err := self.put_key_at(i, key); err != nil {
  394. return err
  395. }
  396. if err := self.put_value_at(i, value); err != nil {
  397. return err
  398. }
  399. return nil
  400. }
  401. func (self *BpNode) put_key_at(i int, key ItemKey) error {
  402. if self.Full() {
  403. return BpTreeError("Block is full.")
  404. }
  405. self.keys = self.keys[:len(self.keys)+1]
  406. for j := len(self.keys) - 1; j > i; j-- {
  407. self.keys[j] = self.keys[j-1]
  408. }
  409. self.keys[i] = key
  410. return nil
  411. }
  412. func (self *BpNode) put_value_at(i int, value ItemValue) error {
  413. if len(self.values) == cap(self.values) {
  414. return BpTreeError("Block is full.")
  415. }
  416. if self.Internal() {
  417. return BpTreeError("Expected a leaf node")
  418. }
  419. self.values = self.values[:len(self.values)+1]
  420. for j := len(self.values) - 1; j > i; j-- {
  421. self.values[j] = self.values[j-1]
  422. }
  423. self.values[i] = value
  424. return nil
  425. }
  426. func (self *BpNode) put_pointer_at(i int, pointer *BpNode) error {
  427. if len(self.pointers) == cap(self.pointers) {
  428. return BpTreeError("Block is full.")
  429. }
  430. if !self.Internal() {
  431. return BpTreeError("Expected a internal node")
  432. }
  433. self.pointers = self.pointers[:len(self.pointers)+1]
  434. for j := len(self.pointers) - 1; j > i; j-- {
  435. self.pointers[j] = self.pointers[j-1]
  436. }
  437. self.pointers[i] = pointer
  438. return nil
  439. }
  440. func (self *BpNode) remove(key ItemKey, where WhereFunc) (a *BpNode, err error) {
  441. if self.Internal() {
  442. return self.internal_remove(key, nil, where)
  443. } else {
  444. return self.leaf_remove(key, self.keys[len(self.keys)-1], where)
  445. }
  446. }
  447. func (self *BpNode) internal_remove(key ItemKey, sibling *BpNode, where WhereFunc) (a *BpNode, err error) {
  448. if !self.Internal() {
  449. panic(BpTreeError("Expected a internal node"))
  450. }
  451. i, has := self.find(key)
  452. if !has && i > 0 {
  453. // if it doesn't have it and the index > 0 then we have the next block
  454. // so we have to subtract one from the index.
  455. i--
  456. }
  457. if i+1 < len(self.keys) {
  458. sibling = self.pointers[i+1]
  459. } else if sibling != nil {
  460. sibling = sibling.left_most_leaf()
  461. }
  462. child := self.pointers[i]
  463. oldChild := child
  464. if child.Internal() {
  465. child, err = child.internal_remove(key, sibling, where)
  466. } else {
  467. if sibling == nil {
  468. child, err = child.leaf_remove(key, nil, where)
  469. } else {
  470. child, err = child.leaf_remove(key, sibling.keys[0], where)
  471. }
  472. }
  473. if err != nil {
  474. return nil, err
  475. }
  476. if child == nil {
  477. if err := self.remove_key_at(i); err != nil {
  478. return nil, err
  479. }
  480. if err := self.remove_ptr_at(i); err != nil {
  481. return nil, err
  482. }
  483. } else {
  484. self.keys[i] = child.keys[0]
  485. self.pointers[i] = child
  486. }
  487. if len(self.keys) == 0 {
  488. return nil, self.destroy()
  489. }
  490. return self, self.maybePersist(oldChild != child)
  491. }
  492. func (self *BpNode) leaf_remove(key, stop ItemKey, where WhereFunc) (a *BpNode, err error) {
  493. if self.Internal() {
  494. return nil, BpTreeError("Expected a leaf node")
  495. }
  496. a = self
  497. hasChange := false
  498. for j, l, next := self.forward(key, key)(); next != nil; j, l, next = next() {
  499. if where(l.values[j]) {
  500. hasChange = true
  501. if err := l.remove_key_at(j); err != nil {
  502. return nil, err
  503. }
  504. if err := l.remove_value_at(j); err != nil {
  505. return nil, err
  506. }
  507. }
  508. if len(l.keys) == 0 {
  509. remove_linked_list_node(l)
  510. if l.getNext() == nil {
  511. a = nil
  512. } else if stop == nil {
  513. a = nil
  514. } else if !l.getNext().keys[0].Equals(stop) {
  515. a = l.getNext()
  516. } else {
  517. a = nil
  518. }
  519. if err := l.destroy(); err != nil {
  520. return nil, err
  521. }
  522. }
  523. }
  524. if a != nil {
  525. return a, a.maybePersist(hasChange)
  526. }
  527. return a, nil
  528. }
  529. func (self *BpNode) remove_key_at(i int) error {
  530. if i >= len(self.keys) || i < 0 {
  531. return BpTreeError("i, %v, is out of bounds, %v, %v %v.", i, len(self.keys), len(self.values), self)
  532. }
  533. for j := i; j < len(self.keys)-1; j++ {
  534. self.keys[j] = self.keys[j+1]
  535. }
  536. self.keys = self.keys[:len(self.keys)-1]
  537. return nil
  538. }
  539. func (self *BpNode) remove_value_at(i int) error {
  540. if i >= len(self.values) || i < 0 {
  541. return BpTreeError("i, %v, is out of bounds, %v.", i, len(self.values))
  542. }
  543. for j := i; j < len(self.values)-1; j++ {
  544. self.values[j] = self.values[j+1]
  545. }
  546. self.values = self.values[:len(self.values)-1]
  547. return nil
  548. }
  549. func (self *BpNode) remove_ptr_at(i int) error {
  550. if i >= len(self.pointers) || i < 0 {
  551. return BpTreeError("i, %v, is out of bounds, %v.", i, len(self.pointers))
  552. }
  553. for j := i; j < len(self.pointers)-1; j++ {
  554. self.pointers[j] = self.pointers[j+1]
  555. }
  556. self.pointers = self.pointers[:len(self.pointers)-1]
  557. return nil
  558. }
  559. func (self *BpNode) find(key ItemKey) (int, bool) {
  560. var l = 0
  561. var r = len(self.keys) - 1
  562. var m int
  563. for l <= r {
  564. m = ((r - l) >> 1) + l
  565. if key.Less(self.keys[m]) {
  566. r = m - 1
  567. } else if key.Equals(self.keys[m]) {
  568. for j := m; j >= 0; j-- {
  569. if j == 0 || !key.Equals(self.keys[j-1]) {
  570. return j, true
  571. }
  572. }
  573. } else {
  574. l = m + 1
  575. }
  576. }
  577. return l, false
  578. }
  579. func (self *BpNode) find_end_of_pure_run() *BpNode {
  580. k := self.keys[0]
  581. p := self
  582. n := self.getNext()
  583. for n != nil && n.Pure() && k.Equals(n.keys[0]) {
  584. p = n
  585. n = n.getNext()
  586. }
  587. return p
  588. }
  589. func (self *BpNode) all() (li loc_iterator) {
  590. j := -1
  591. l := self.left_most_leaf()
  592. end := false
  593. j, l, end = next_location(j, l)
  594. li = func() (i int, leaf *BpNode, next loc_iterator) {
  595. if end {
  596. return -1, nil, nil
  597. }
  598. i = j
  599. leaf = l
  600. j, l, end = next_location(j, l)
  601. return i, leaf, li
  602. }
  603. return li
  604. }
  605. func (self *BpNode) all_backward() (li loc_iterator) {
  606. l := self.right_most_leaf()
  607. j := len(l.keys)
  608. end := false
  609. j, l, end = prev_location(j, l)
  610. li = func() (i int, leaf *BpNode, next loc_iterator) {
  611. if end {
  612. return -1, nil, nil
  613. }
  614. i = j
  615. leaf = l
  616. j, l, end = prev_location(j, l)
  617. return i, leaf, li
  618. }
  619. return li
  620. }
  621. func (self *BpNode) forward(from, to ItemKey) (li loc_iterator) {
  622. j, l := self.get_start(from)
  623. end := false
  624. j--
  625. li = func() (i int, leaf *BpNode, next loc_iterator) {
  626. j, l, end = next_location(j, l)
  627. if end || to.Less(l.keys[j]) {
  628. return -1, nil, nil
  629. }
  630. return j, l, li
  631. }
  632. return li
  633. }
  634. func (self *BpNode) backward(from, to ItemKey) (li loc_iterator) {
  635. j, l := self.get_end(from)
  636. end := false
  637. li = func() (i int, leaf *BpNode, next loc_iterator) {
  638. if end || l.keys[j].Less(to) {
  639. return -1, nil, nil
  640. }
  641. i = j
  642. leaf = l
  643. j, l, end = prev_location(i, l)
  644. return i, leaf, li
  645. }
  646. return li
  647. }
  648. func insert_linked_list_node(n, prev, next *BpNode) {
  649. if (prev != nil && prev.getNext() != next) || (next != nil && next.getPrev() != prev) {
  650. panic(BpTreeError("prev and next not hooked up"))
  651. }
  652. n.setPrev(prev)
  653. n.setNext(next)
  654. if prev != nil {
  655. prev.setNext(n)
  656. }
  657. if next != nil {
  658. next.setPrev(n)
  659. }
  660. }
  661. func remove_linked_list_node(n *BpNode) {
  662. if n.getPrev() != nil {
  663. n.getPrev().setNext(n.getNext())
  664. }
  665. if n.getNext() != nil {
  666. n.getNext().setPrev(n.getPrev())
  667. }
  668. }
  669. /* a must be full and b must be empty else there will be a panic
  670. */
  671. func balance_nodes(a, b *BpNode) {
  672. if len(b.keys) != 0 {
  673. panic(BpTreeError("b was not empty"))
  674. }
  675. if !a.Full() {
  676. panic(BpTreeError("a was not full", a))
  677. }
  678. if cap(a.keys) != cap(b.keys) {
  679. panic(BpTreeError("cap(a.keys) != cap(b.keys)"))
  680. }
  681. if cap(a.values) != cap(b.values) {
  682. panic(BpTreeError("cap(a.values) != cap(b.values)"))
  683. }
  684. if cap(a.pointers) != cap(b.pointers) {
  685. panic(BpTreeError("cap(a.pointers) != cap(b.pointers)"))
  686. }
  687. m := len(a.keys) / 2
  688. for m < len(a.keys) && a.keys[m-1].Equals(a.keys[m]) {
  689. m++
  690. }
  691. if m == len(a.keys) {
  692. m--
  693. for m > 0 && a.keys[m-1].Equals(a.keys[m]) {
  694. m--
  695. }
  696. }
  697. var lim = len(a.keys) - m
  698. b.keys = b.keys[:lim]
  699. if cap(a.values) > 0 {
  700. if cap(a.values) != cap(a.keys) {
  701. panic(BpTreeError("cap(a.values) != cap(a.keys)"))
  702. }
  703. b.values = b.values[:lim]
  704. }
  705. if cap(a.pointers) > 0 {
  706. if cap(a.pointers) != cap(a.keys) {
  707. panic(BpTreeError("cap(a.pointers) != cap(a.keys)"))
  708. }
  709. b.pointers = b.pointers[:lim]
  710. }
  711. for i := 0; i < lim; i++ {
  712. j := m + i
  713. b.keys[i] = a.keys[j]
  714. if cap(a.values) > 0 {
  715. b.values[i] = a.values[j]
  716. }
  717. if cap(a.pointers) > 0 {
  718. b.pointers[i] = a.pointers[j]
  719. }
  720. }
  721. a.keys = a.keys[:m]
  722. if cap(a.values) > 0 {
  723. a.values = a.values[:m]
  724. }
  725. if cap(a.pointers) > 0 {
  726. a.pointers = a.pointers[:m]
  727. }
  728. }