cache.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright 2021 ByteDance Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package vars
  17. import (
  18. "unsafe"
  19. "github.com/bytedance/sonic/internal/rt"
  20. )
  21. type Encoder func(
  22. rb *[]byte,
  23. vp unsafe.Pointer,
  24. sb *Stack,
  25. fv uint64,
  26. ) error
  27. func FindOrCompile(vt *rt.GoType, pv bool, compiler func(*rt.GoType, ... interface{}) (interface{}, error)) (interface{}, error) {
  28. if val := programCache.Get(vt); val != nil {
  29. return val, nil
  30. } else if ret, err := programCache.Compute(vt, compiler, pv); err == nil {
  31. return ret, nil
  32. } else {
  33. return nil, err
  34. }
  35. }
  36. func GetProgram(vt *rt.GoType) (interface{}) {
  37. return programCache.Get(vt)
  38. }
  39. func ComputeProgram(vt *rt.GoType, compute func(*rt.GoType, ... interface{}) (interface{}, error), pv bool) (interface{}, error) {
  40. return programCache.Compute(vt, compute, pv)
  41. }