71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package codec
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"go_dreamfactory/lego/utils/codec/codecore"
|
|
"go_dreamfactory/lego/utils/codec/factory"
|
|
|
|
"github.com/modern-go/reflect2"
|
|
)
|
|
|
|
var decoderCache = new(sync.Map)
|
|
var encoderCache = new(sync.Map)
|
|
|
|
func AddDecoder(cacheKey uintptr, decoder codecore.IDecoder) {
|
|
decoderCache.Store(cacheKey, decoder)
|
|
}
|
|
func AddEncoder(cacheKey uintptr, encoder codecore.IEncoder) {
|
|
encoderCache.Store(cacheKey, encoder)
|
|
}
|
|
func GetEncoder(cacheKey uintptr) codecore.IEncoder {
|
|
encoder, found := encoderCache.Load(cacheKey)
|
|
if found {
|
|
return encoder.(codecore.IEncoder)
|
|
}
|
|
return nil
|
|
}
|
|
func GetDecoder(cacheKey uintptr) codecore.IDecoder {
|
|
decoder, found := decoderCache.Load(cacheKey)
|
|
if found {
|
|
return decoder.(codecore.IDecoder)
|
|
}
|
|
return nil
|
|
}
|
|
func EncoderOf(typ reflect2.Type, config *codecore.Config) codecore.IEncoder {
|
|
cacheKey := typ.RType()
|
|
encoder := GetEncoder(cacheKey)
|
|
if encoder != nil {
|
|
return encoder
|
|
}
|
|
ctx := &codecore.Ctx{
|
|
Config: config,
|
|
Prefix: "",
|
|
Decoders: map[reflect2.Type]codecore.IDecoder{},
|
|
Encoders: map[reflect2.Type]codecore.IEncoder{},
|
|
}
|
|
encoder = factory.EncoderOfType(ctx, typ)
|
|
if typ.LikePtr() {
|
|
encoder = factory.NewonePtrEncoder(encoder)
|
|
}
|
|
AddEncoder(cacheKey, encoder)
|
|
return encoder
|
|
}
|
|
func DecoderOf(typ reflect2.Type, config *codecore.Config) codecore.IDecoder {
|
|
cacheKey := typ.RType()
|
|
decoder := GetDecoder(cacheKey)
|
|
if decoder != nil {
|
|
return decoder
|
|
}
|
|
ctx := &codecore.Ctx{
|
|
Config: config,
|
|
Prefix: "",
|
|
Decoders: map[reflect2.Type]codecore.IDecoder{},
|
|
Encoders: map[reflect2.Type]codecore.IEncoder{},
|
|
}
|
|
ptrType := typ.(*reflect2.UnsafePtrType)
|
|
decoder = factory.DecoderOfType(ctx, ptrType.Elem())
|
|
AddDecoder(cacheKey, decoder)
|
|
return decoder
|
|
}
|