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.

67 lines
1.4 KiB

4 years ago
  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 Hashable) bool {
  15. return (*BpTree)(self).Has(key)
  16. }
  17. func (self *BpMap) Put(key Hashable, value interface{}) (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 Hashable) (value interface{}, 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 Hashable) (value interface{}, err error) {
  33. value, err = self.Get(key)
  34. if err != nil {
  35. return nil, err
  36. }
  37. ns := self.getRoot().NodeSize()
  38. new_root, err := self.getRoot().remove(key, func(value interface{}) bool { return true })
  39. if err != nil {
  40. return nil, err
  41. }
  42. if new_root == nil {
  43. self.setRoot(NewLeaf(ns))
  44. } else {
  45. self.setRoot(new_root)
  46. }
  47. return value, nil
  48. }
  49. func (self *BpMap) Keys() (ki KIterator) {
  50. return (*BpTree)(self).Keys()
  51. }
  52. func (self *BpMap) Values() (vi Iterator) {
  53. return (*BpTree)(self).Values()
  54. }
  55. func (self *BpMap) Iterate() (kvi KVIterator) {
  56. return (*BpTree)(self).Iterate()
  57. }