internal/encoding/json/sentinel/null.go (46 lines of code) (raw):

package sentinel import ( "github.com/anthropics/anthropic-sdk-go/internal/encoding/json/shims" "reflect" "sync" ) var nullPtrsCache sync.Map // map[reflect.Type]*T func NullPtr[T any]() *T { t := shims.TypeFor[T]() ptr, loaded := nullPtrsCache.Load(t) // avoid premature allocation if !loaded { ptr, _ = nullPtrsCache.LoadOrStore(t, new(T)) } return (ptr.(*T)) } var nullSlicesCache sync.Map // map[reflect.Type][]T func NullSlice[T any]() []T { t := shims.TypeFor[T]() slice, loaded := nullSlicesCache.Load(t) // avoid premature allocation if !loaded { slice, _ = nullSlicesCache.LoadOrStore(t, []T{}) } return slice.([]T) } func IsNullPtr[T any](ptr *T) bool { nullptr, ok := nullPtrsCache.Load(shims.TypeFor[T]()) return ok && ptr == nullptr.(*T) } func IsNullSlice[T any](slice []T) bool { nullSlice, ok := nullSlicesCache.Load(shims.TypeFor[T]()) return ok && reflect.ValueOf(slice).Pointer() == reflect.ValueOf(nullSlice).Pointer() } // internal only func IsValueNullPtr(v reflect.Value) bool { if v.Kind() != reflect.Ptr { return false } nullptr, ok := nullPtrsCache.Load(v.Type().Elem()) return ok && v.Pointer() == reflect.ValueOf(nullptr).Pointer() } // internal only func IsValueNullSlice(v reflect.Value) bool { if v.Kind() != reflect.Slice { return false } nullSlice, ok := nullSlicesCache.Load(v.Type().Elem()) return ok && v.Pointer() == reflect.ValueOf(nullSlice).Pointer() }