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.

69 lines
1.4 KiB

  1. package bptree
  2. import (
  3. "fmt"
  4. )
  5. /* A BpMap is a B+Tree with support for duplicate keys disabled. This makes it
  6. * behave like a regular Map rather than a MultiMap.
  7. */
  8. type BpMap BpTree
  9. func NewBpMap(node_size int) *BpMap {
  10. return &BpMap{
  11. root: NewLeaf(node_size),
  12. }
  13. }
  14. func (self *BpMap) Has(key ItemKey) bool {
  15. return (*BpTree)(self).Has(key)
  16. }
  17. func (self *BpMap) Put(key ItemKey, value ItemValue) (err error) {
  18. new_root, err := self.getRoot().put(key, value)
  19. if err != nil {
  20. return err
  21. }
  22. self.setRoot(new_root)
  23. return nil
  24. }
  25. func (self *BpMap) Get(key ItemKey) (value ItemValue, err error) {
  26. j, l := self.getRoot().get_start(key)
  27. if l.keys[j].Equals(key) {
  28. return l.values[j], nil
  29. }
  30. return nil, fmt.Errorf("key not found: %s", key)
  31. }
  32. func (self *BpMap) Remove(key ItemKey) (value ItemValue, err error) {
  33. value, err = self.Get(key)
  34. if err != nil {
  35. return nil, err
  36. }
  37. ns := self.getRoot().Capacity()
  38. new_root, err := self.getRoot().remove(key, func(value ItemValue) bool { return true })
  39. if err != nil {
  40. return nil, err
  41. }
  42. if new_root == nil {
  43. new_root = NewLeaf(ns)
  44. err = new_root.persist()
  45. self.setRoot(new_root)
  46. } else {
  47. self.setRoot(new_root)
  48. }
  49. return value, nil
  50. }
  51. func (self *BpMap) Keys() (ki KIterator) {
  52. return (*BpTree)(self).Keys()
  53. }
  54. func (self *BpMap) Values() (vi Iterator) {
  55. return (*BpTree)(self).Values()
  56. }
  57. func (self *BpMap) Iterate() (kvi KVIterator) {
  58. return (*BpTree)(self).Iterate()
  59. }