58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
|
package critbitgo
|
||
|
|
||
|
import (
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
// The map is sorted according to the natural ordering of its keys
|
||
|
type SortedMap struct {
|
||
|
trie *Trie
|
||
|
}
|
||
|
|
||
|
func (m *SortedMap) Contains(key string) bool {
|
||
|
return m.trie.Contains(*(*[]byte)(unsafe.Pointer(&key)))
|
||
|
}
|
||
|
|
||
|
func (m *SortedMap) Get(key string) (value interface{}, ok bool) {
|
||
|
return m.trie.Get(*(*[]byte)(unsafe.Pointer(&key)))
|
||
|
}
|
||
|
|
||
|
func (m *SortedMap) Set(key string, value interface{}) {
|
||
|
m.trie.Set([]byte(key), value)
|
||
|
}
|
||
|
|
||
|
func (m *SortedMap) Delete(key string) (value interface{}, ok bool) {
|
||
|
return m.trie.Delete(*(*[]byte)(unsafe.Pointer(&key)))
|
||
|
}
|
||
|
|
||
|
func (m *SortedMap) Clear() {
|
||
|
m.trie.Clear()
|
||
|
}
|
||
|
|
||
|
func (m *SortedMap) Size() int {
|
||
|
return m.trie.Size()
|
||
|
}
|
||
|
|
||
|
// Returns a slice of sorted keys
|
||
|
func (m *SortedMap) Keys() []string {
|
||
|
keys := make([]string, 0, m.Size())
|
||
|
m.trie.Allprefixed([]byte{}, func(k []byte, v interface{}) bool {
|
||
|
keys = append(keys, string(k))
|
||
|
return true
|
||
|
})
|
||
|
return keys
|
||
|
}
|
||
|
|
||
|
// Executes a provided function for each element that has a given prefix.
|
||
|
// if handle returns `false`, the iteration is aborted.
|
||
|
func (m *SortedMap) Each(prefix string, handle func(key string, value interface{}) bool) bool {
|
||
|
return m.trie.Allprefixed([]byte(prefix), func(k []byte, v interface{}) bool {
|
||
|
return handle(string(k), v)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// Create a SortedMap
|
||
|
func NewSortedMap() *SortedMap {
|
||
|
return &SortedMap{NewTrie()}
|
||
|
}
|