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.
|
|
package needle_map
import ( . "github.com/joeslay/seaweedfs/weed/storage/types" "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 NeedleId, offset Offset, size uint32) (oldOffset Offset, 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 NeedleId) (oldSize uint32) { found := cm.tree.Delete(NeedleValue{key, Offset{}, 0}) if found != nil { old := found.(NeedleValue) return old.Size } return } func (cm *BtreeMap) Get(key NeedleId) (*NeedleValue, bool) { found := cm.tree.Get(NeedleValue{key, Offset{}, 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) AscendingVisit(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 }
|