feature_reflect_optional.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "unsafe"
  5. )
  6. func decoderOfOptional(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
  7. elemType := typ.Elem()
  8. decoder := decoderOfType(cfg, prefix, elemType)
  9. return &OptionalDecoder{elemType, decoder}
  10. }
  11. func encoderOfOptional(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  12. elemType := typ.Elem()
  13. elemEncoder := encoderOfType(cfg, prefix, elemType)
  14. encoder := &OptionalEncoder{elemEncoder}
  15. return encoder
  16. }
  17. type OptionalDecoder struct {
  18. ValueType reflect.Type
  19. ValueDecoder ValDecoder
  20. }
  21. func (decoder *OptionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  22. if iter.ReadNil() {
  23. *((*unsafe.Pointer)(ptr)) = nil
  24. } else {
  25. if *((*unsafe.Pointer)(ptr)) == nil {
  26. //pointer to null, we have to allocate memory to hold the value
  27. value := reflect.New(decoder.ValueType)
  28. newPtr := extractInterface(value.Interface()).word
  29. decoder.ValueDecoder.Decode(newPtr, iter)
  30. *((*uintptr)(ptr)) = uintptr(newPtr)
  31. } else {
  32. //reuse existing instance
  33. decoder.ValueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter)
  34. }
  35. }
  36. }
  37. type dereferenceDecoder struct {
  38. // only to deference a pointer
  39. valueType reflect.Type
  40. valueDecoder ValDecoder
  41. }
  42. func (decoder *dereferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  43. if *((*unsafe.Pointer)(ptr)) == nil {
  44. //pointer to null, we have to allocate memory to hold the value
  45. value := reflect.New(decoder.valueType)
  46. newPtr := extractInterface(value.Interface()).word
  47. decoder.valueDecoder.Decode(newPtr, iter)
  48. *((*uintptr)(ptr)) = uintptr(newPtr)
  49. } else {
  50. //reuse existing instance
  51. decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter)
  52. }
  53. }
  54. type OptionalEncoder struct {
  55. ValueEncoder ValEncoder
  56. }
  57. func (encoder *OptionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  58. if *((*unsafe.Pointer)(ptr)) == nil {
  59. stream.WriteNil()
  60. } else {
  61. encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream)
  62. }
  63. }
  64. func (encoder *OptionalEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  65. return *((*unsafe.Pointer)(ptr)) == nil
  66. }
  67. type dereferenceEncoder struct {
  68. ValueEncoder ValEncoder
  69. }
  70. func (encoder *dereferenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  71. if *((*unsafe.Pointer)(ptr)) == nil {
  72. stream.WriteNil()
  73. } else {
  74. encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream)
  75. }
  76. }
  77. func (encoder *dereferenceEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  78. return encoder.ValueEncoder.IsEmpty(*((*unsafe.Pointer)(ptr)))
  79. }