feat: trie implementation

This commit is contained in:
yusing
2025-04-24 05:56:03 +08:00
parent 4a65de99a8
commit ec8cca1245
15 changed files with 699 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
package trie
import (
"sync/atomic"
)
// AnyValue is a wrapper of atomic.Value
// It is used to store values in trie nodes
// And allowed to assign to empty struct value when node
// is not an end node anymore
type AnyValue struct {
v atomic.Value
}
type zeroValue struct{}
var zero zeroValue
func (av *AnyValue) Store(v any) {
if v == nil {
av.v.Store(zero)
return
}
defer panicInvalidAssignment()
av.v.Store(v)
}
func (av *AnyValue) Swap(v any) any {
defer panicInvalidAssignment()
return av.v.Swap(v)
}
func (av *AnyValue) Load() any {
switch v := av.v.Load().(type) {
case zeroValue:
return nil
default:
return v
}
}
func (av *AnyValue) IsNil() bool {
switch v := av.v.Load().(type) {
case zeroValue:
return true // assigned nil manually
default:
return v == nil // uninitialized
}
}