blob: 8eca1064aff3b2a34208109fba595bee00f02ce4 [file]
//go:build go1.24 && cache
package govaluate
import (
"sync"
"weak"
)
var (
paramMap = sync.Map{}
constMap = sync.Map{}
)
func getParameterStage(name string) (*evaluationStage, error) {
stage, ok := getParamFromMap(name)
if ok {
return stage, nil
}
operator := makeParameterStage(name)
ret := &evaluationStage{
operator: operator,
}
storeVal := weak.Make(ret)
paramMap.Store(name, storeVal)
return ret, nil
}
func getParamFromMap(name string) (*evaluationStage, bool) {
stage, ok := paramMap.Load(name)
if ok {
ptr, ok := stage.(weak.Pointer[evaluationStage])
if ok {
ret := ptr.Value()
if ret != nil {
return ret, true
}
paramMap.Delete(name)
}
}
return nil, false
}
func getConstantStage(value any) (*evaluationStage, error) {
stage, ok := getConstantFromMap(value)
if ok {
return stage, nil
}
operator := makeLiteralStage(value)
ret := &evaluationStage{
symbol: LITERAL,
operator: operator,
}
storeVal := weak.Make(ret)
constMap.Store(value, storeVal)
return ret, nil
}
func getConstantFromMap(value any) (*evaluationStage, bool) {
stage, ok := constMap.Load(value)
if ok {
ptr, ok := stage.(weak.Pointer[evaluationStage])
if ok {
ret := ptr.Value()
if ret != nil {
return ret, true
}
constMap.Delete(value)
}
}
return nil, false
}