started by copying from https://sourcegraph.com/github.com/timtadh/data-structures@master/-/tree/tree/bptree
This commit is contained in:
77
weed/util/bptree/bpmap.go
Normal file
77
weed/util/bptree/bpmap.go
Normal file
@@ -0,0 +1,77 @@
|
||||
package bptree
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
/* A BpMap is a B+Tree with support for duplicate keys disabled. This makes it
|
||||
* behave like a regular Map rather than a MultiMap.
|
||||
*/
|
||||
type BpMap BpTree
|
||||
|
||||
func NewBpMap(node_size int) *BpMap {
|
||||
return &BpMap{
|
||||
root: NewLeaf(node_size, true),
|
||||
size: 0,
|
||||
}
|
||||
}
|
||||
|
||||
func (self *BpMap) Size() int {
|
||||
return (*BpTree)(self).Size()
|
||||
}
|
||||
|
||||
func (self *BpMap) Has(key Hashable) bool {
|
||||
return (*BpTree)(self).Has(key)
|
||||
}
|
||||
|
||||
func (self *BpMap) Put(key Hashable, value interface{}) (err error) {
|
||||
had := self.Has(key)
|
||||
new_root, err := self.root.put(key, value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
self.root = new_root
|
||||
if !had {
|
||||
self.size += 1
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *BpMap) Get(key Hashable) (value interface{}, err error) {
|
||||
j, l := self.root.get_start(key)
|
||||
if l.keys[j].Equals(key) {
|
||||
return l.values[j], nil
|
||||
}
|
||||
return nil, fmt.Errorf("key not found: %s", key)
|
||||
}
|
||||
|
||||
func (self *BpMap) Remove(key Hashable) (value interface{}, err error) {
|
||||
value, err = self.Get(key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ns := self.root.NodeSize()
|
||||
new_root, err := self.root.remove(key, func(value interface{}) bool { return true })
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if new_root == nil {
|
||||
self.root = NewLeaf(ns, true)
|
||||
} else {
|
||||
self.root = new_root
|
||||
}
|
||||
self.size--
|
||||
return value, nil
|
||||
}
|
||||
|
||||
func (self *BpMap) Keys() (ki KIterator) {
|
||||
return (*BpTree)(self).Keys()
|
||||
}
|
||||
|
||||
func (self *BpMap) Values() (vi Iterator) {
|
||||
return (*BpTree)(self).Values()
|
||||
}
|
||||
|
||||
func (self *BpMap) Iterate() (kvi KVIterator) {
|
||||
return (*BpTree)(self).Iterate()
|
||||
}
|
||||
Reference in New Issue
Block a user