feature_reflect_map.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package jsoniter
  2. import (
  3. "unsafe"
  4. "reflect"
  5. )
  6. type mapDecoder struct {
  7. mapType reflect.Type
  8. elemType reflect.Type
  9. elemDecoder Decoder
  10. mapInterface emptyInterface
  11. }
  12. func (decoder *mapDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  13. // dark magic to cast unsafe.Pointer back to interface{} using reflect.Type
  14. mapInterface := decoder.mapInterface
  15. mapInterface.word = ptr
  16. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  17. realVal := reflect.ValueOf(*realInterface).Elem()
  18. if realVal.IsNil() {
  19. realVal.Set(reflect.MakeMap(realVal.Type()))
  20. }
  21. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  22. elem := reflect.New(decoder.elemType)
  23. decoder.elemDecoder.decode(unsafe.Pointer(elem.Pointer()), iter)
  24. // to put into map, we have to use reflection
  25. realVal.SetMapIndex(reflect.ValueOf(string([]byte(field))), elem.Elem())
  26. }
  27. }
  28. type mapEncoder struct {
  29. mapType reflect.Type
  30. elemType reflect.Type
  31. elemEncoder Encoder
  32. mapInterface emptyInterface
  33. }
  34. func (encoder *mapEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  35. mapInterface := encoder.mapInterface
  36. mapInterface.word = ptr
  37. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  38. realVal := reflect.ValueOf(*realInterface)
  39. stream.WriteObjectStart()
  40. for i, key := range realVal.MapKeys() {
  41. if i != 0 {
  42. stream.WriteMore()
  43. }
  44. stream.WriteObjectField(key.String())
  45. val := realVal.MapIndex(key).Interface()
  46. encoder.elemEncoder.encodeInterface(val, stream)
  47. }
  48. stream.WriteObjectEnd()
  49. }
  50. func (encoder *mapEncoder) encodeInterface(val interface{}, stream *Stream) {
  51. writeToStream(val, stream, encoder)
  52. }
  53. func (encoder *mapEncoder) isEmpty(ptr unsafe.Pointer) bool {
  54. mapInterface := encoder.mapInterface
  55. mapInterface.word = ptr
  56. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  57. realVal := reflect.ValueOf(*realInterface)
  58. return realVal.Len() == 0
  59. }
  60. type mapInterfaceEncoder struct {
  61. mapType reflect.Type
  62. elemType reflect.Type
  63. elemEncoder Encoder
  64. mapInterface emptyInterface
  65. }
  66. func (encoder *mapInterfaceEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  67. mapInterface := encoder.mapInterface
  68. mapInterface.word = ptr
  69. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  70. realVal := reflect.ValueOf(*realInterface)
  71. stream.WriteObjectStart()
  72. for i, key := range realVal.MapKeys() {
  73. if i != 0 {
  74. stream.WriteMore()
  75. }
  76. stream.WriteObjectField(key.String())
  77. val := realVal.MapIndex(key).Interface()
  78. encoder.elemEncoder.encode(unsafe.Pointer(&val), stream)
  79. }
  80. stream.WriteObjectEnd()
  81. }
  82. func (encoder *mapInterfaceEncoder) encodeInterface(val interface{}, stream *Stream) {
  83. writeToStream(val, stream, encoder)
  84. }
  85. func (encoder *mapInterfaceEncoder) isEmpty(ptr unsafe.Pointer) bool {
  86. mapInterface := encoder.mapInterface
  87. mapInterface.word = ptr
  88. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  89. realVal := reflect.ValueOf(*realInterface)
  90. return realVal.Len() == 0
  91. }