mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 04:42:33 +02:00
49 lines
824 B
Go
49 lines
824 B
Go
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
|
|
}
|
|
}
|