aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/needle/btree_map.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/storage/needle/btree_map.go')
-rw-r--r--weed/storage/needle/btree_map.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/weed/storage/needle/btree_map.go b/weed/storage/needle/btree_map.go
new file mode 100644
index 000000000..64c0bacc1
--- /dev/null
+++ b/weed/storage/needle/btree_map.go
@@ -0,0 +1,52 @@
+package needle
+
+import (
+ "github.com/google/btree"
+)
+
+//This map assumes mostly inserting increasing keys
+type BtreeMap struct {
+ tree *btree.BTree
+}
+
+func NewBtreeMap() *BtreeMap {
+ return &BtreeMap{
+ tree: btree.New(32),
+ }
+}
+
+func (cm *BtreeMap) Set(key Key, offset, size uint32) (oldOffset, oldSize uint32) {
+ found := cm.tree.ReplaceOrInsert(NeedleValue{key, offset, size})
+ if found != nil {
+ old := found.(NeedleValue)
+ return old.Offset, old.Size
+ }
+ return
+}
+
+func (cm *BtreeMap) Delete(key Key) (oldSize uint32) {
+ found := cm.tree.Delete(NeedleValue{key, 0, 0})
+ if found != nil {
+ old := found.(NeedleValue)
+ return old.Size
+ }
+ return
+}
+func (cm *BtreeMap) Get(key Key) (*NeedleValue, bool) {
+ found := cm.tree.Get(NeedleValue{key, 0, 0})
+ if found != nil {
+ old := found.(NeedleValue)
+ return &old, true
+ }
+ return nil, false
+}
+
+// Visit visits all entries or stop if any error when visiting
+func (cm *BtreeMap) Visit(visit func(NeedleValue) error) (ret error) {
+ cm.tree.Ascend(func(item btree.Item) bool {
+ needle := item.(NeedleValue)
+ ret = visit(needle)
+ return ret == nil
+ })
+ return ret
+}