reflect_optional.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. dePtr := *((*unsafe.Pointer)(ptr))
  79. if dePtr == nil {
  80. return true
  81. }
  82. return encoder.ValueEncoder.IsEmpty(dePtr)
  83. }
  84. func (encoder *dereferenceEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool {
  85. deReferenced := *((*unsafe.Pointer)(ptr))
  86. if deReferenced == nil {
  87. return true
  88. }
  89. isEmbeddedPtrNil, converted := encoder.ValueEncoder.(IsEmbeddedPtrNil)
  90. if !converted {
  91. return false
  92. }
  93. fieldPtr := unsafe.Pointer(deReferenced)
  94. return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr)
  95. }
  96. type referenceEncoder struct {
  97. encoder ValEncoder
  98. }
  99. func (encoder *referenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  100. encoder.encoder.Encode(unsafe.Pointer(&ptr), stream)
  101. }
  102. func (encoder *referenceEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  103. return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr))
  104. }
  105. type referenceDecoder struct {
  106. decoder ValDecoder
  107. }
  108. func (decoder *referenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  109. decoder.decoder.Decode(unsafe.Pointer(&ptr), iter)
  110. }