reflect_map.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "sort"
  5. "unsafe"
  6. "github.com/v2pro/plz/reflect2"
  7. "fmt"
  8. )
  9. func decoderOfMap(ctx *ctx, typ reflect2.Type) ValDecoder {
  10. mapType := typ.(*reflect2.UnsafeMapType)
  11. keyDecoder := decoderOfMapKey(ctx.append("[mapKey]"), mapType.Key())
  12. elemDecoder := decoderOfType(ctx.append("[mapElem]"), mapType.Elem())
  13. return &mapDecoder{
  14. mapType: mapType,
  15. keyType: mapType.Key(),
  16. elemType: mapType.Elem(),
  17. keyDecoder: keyDecoder,
  18. elemDecoder: elemDecoder,
  19. }
  20. }
  21. func encoderOfMap(ctx *ctx, typ reflect2.Type) ValEncoder {
  22. mapType := typ.(*reflect2.UnsafeMapType)
  23. if ctx.sortMapKeys {
  24. return &sortKeysMapEncoder{
  25. mapType: mapType,
  26. keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()),
  27. elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()),
  28. }
  29. }
  30. return &mapEncoder{
  31. mapType: mapType,
  32. keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()),
  33. elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()),
  34. }
  35. }
  36. func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder {
  37. switch typ.Kind() {
  38. case reflect.String:
  39. return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
  40. case reflect.Bool,
  41. reflect.Uint8, reflect.Int8,
  42. reflect.Uint16, reflect.Int16,
  43. reflect.Uint32, reflect.Int32,
  44. reflect.Uint64, reflect.Int64,
  45. reflect.Uint, reflect.Int,
  46. reflect.Float32, reflect.Float64,
  47. reflect.Uintptr:
  48. typ = reflect2.DefaultTypeOfKind(typ.Kind())
  49. return &numericMapKeyDecoder{decoderOfType(ctx, typ)}
  50. default:
  51. ptrType := reflect2.PtrTo(typ)
  52. if ptrType.Implements(textMarshalerType) {
  53. return &referenceDecoder{
  54. &textUnmarshalerDecoder{
  55. valType: ptrType,
  56. },
  57. }
  58. }
  59. if typ.Implements(textMarshalerType) {
  60. return &textUnmarshalerDecoder{
  61. valType: typ,
  62. }
  63. }
  64. return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)}
  65. }
  66. }
  67. func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
  68. switch typ.Kind() {
  69. case reflect.String:
  70. return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
  71. case reflect.Bool,
  72. reflect.Uint8, reflect.Int8,
  73. reflect.Uint16, reflect.Int16,
  74. reflect.Uint32, reflect.Int32,
  75. reflect.Uint64, reflect.Int64,
  76. reflect.Uint, reflect.Int,
  77. reflect.Float32, reflect.Float64,
  78. reflect.Uintptr:
  79. typ = reflect2.DefaultTypeOfKind(typ.Kind())
  80. return &numericMapKeyEncoder{encoderOfType(ctx, typ)}
  81. default:
  82. if typ == textMarshalerType {
  83. return &directTextMarshalerEncoder{
  84. stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
  85. }
  86. }
  87. if typ.Implements(textMarshalerType) {
  88. return &textMarshalerEncoder{
  89. valType: typ,
  90. stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
  91. }
  92. }
  93. return &lazyErrorEncoder{err: fmt.Errorf("unsupported map key type: %v", typ)}
  94. }
  95. }
  96. type mapDecoder struct {
  97. mapType *reflect2.UnsafeMapType
  98. keyType reflect2.Type
  99. elemType reflect2.Type
  100. keyDecoder ValDecoder
  101. elemDecoder ValDecoder
  102. }
  103. func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  104. mapType := decoder.mapType
  105. c := iter.nextToken()
  106. if c == 'n' {
  107. iter.skipThreeBytes('u', 'l', 'l')
  108. *(*unsafe.Pointer)(ptr) = nil
  109. mapType.UnsafeSet(ptr, mapType.UnsafeNew())
  110. return
  111. }
  112. if mapType.UnsafeIsNil(ptr) {
  113. mapType.UnsafeSet(ptr, mapType.UnsafeMakeMap(0))
  114. }
  115. if c != '{' {
  116. iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c}))
  117. return
  118. }
  119. c = iter.nextToken()
  120. if c == '}' {
  121. return
  122. }
  123. if c != '"' {
  124. iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c}))
  125. return
  126. }
  127. iter.unreadByte()
  128. key := decoder.keyType.UnsafeNew()
  129. decoder.keyDecoder.Decode(key, iter)
  130. c = iter.nextToken()
  131. if c != ':' {
  132. iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c}))
  133. return
  134. }
  135. elem := decoder.elemType.UnsafeNew()
  136. decoder.elemDecoder.Decode(elem, iter)
  137. decoder.mapType.UnsafeSetIndex(ptr, key, elem)
  138. for c = iter.nextToken(); c == ','; c = iter.nextToken() {
  139. key := decoder.keyType.UnsafeNew()
  140. decoder.keyDecoder.Decode(key, iter)
  141. c = iter.nextToken()
  142. if c != ':' {
  143. iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c}))
  144. return
  145. }
  146. elem := decoder.elemType.UnsafeNew()
  147. decoder.elemDecoder.Decode(elem, iter)
  148. decoder.mapType.UnsafeSetIndex(ptr, key, elem)
  149. }
  150. if c != '}' {
  151. iter.ReportError("ReadMapCB", `expect }, but found `+string([]byte{c}))
  152. }
  153. }
  154. type numericMapKeyDecoder struct {
  155. decoder ValDecoder
  156. }
  157. func (decoder *numericMapKeyDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  158. c := iter.nextToken()
  159. if c != '"' {
  160. iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c}))
  161. return
  162. }
  163. decoder.decoder.Decode(ptr, iter)
  164. c = iter.nextToken()
  165. if c != '"' {
  166. iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c}))
  167. return
  168. }
  169. }
  170. type numericMapKeyEncoder struct {
  171. encoder ValEncoder
  172. }
  173. func (encoder *numericMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  174. stream.writeByte('"')
  175. encoder.encoder.Encode(ptr, stream)
  176. stream.writeByte('"')
  177. }
  178. func (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  179. return false
  180. }
  181. type mapEncoder struct {
  182. mapType *reflect2.UnsafeMapType
  183. keyEncoder ValEncoder
  184. elemEncoder ValEncoder
  185. }
  186. func (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  187. stream.WriteObjectStart()
  188. iter := encoder.mapType.UnsafeIterate(ptr)
  189. for i := 0; iter.HasNext(); i++ {
  190. if i != 0 {
  191. stream.WriteMore()
  192. }
  193. key, elem := iter.UnsafeNext()
  194. encoder.keyEncoder.Encode(key, stream)
  195. if stream.indention > 0 {
  196. stream.writeTwoBytes(byte(':'), byte(' '))
  197. } else {
  198. stream.writeByte(':')
  199. }
  200. encoder.elemEncoder.Encode(elem, stream)
  201. }
  202. stream.WriteObjectEnd()
  203. }
  204. func (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  205. iter := encoder.mapType.UnsafeIterate(ptr)
  206. return !iter.HasNext()
  207. }
  208. type sortKeysMapEncoder struct {
  209. mapType *reflect2.UnsafeMapType
  210. keyEncoder ValEncoder
  211. elemEncoder ValEncoder
  212. }
  213. func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  214. if *(*unsafe.Pointer)(ptr) == nil {
  215. stream.WriteNil()
  216. return
  217. }
  218. stream.WriteObjectStart()
  219. mapIter := encoder.mapType.UnsafeIterate(ptr)
  220. subStream := stream.cfg.BorrowStream(nil)
  221. subIter := stream.cfg.BorrowIterator(nil)
  222. keyValues := encodedKeyValues{}
  223. for mapIter.HasNext() {
  224. subStream.buf = make([]byte, 0, 64)
  225. key, elem := mapIter.UnsafeNext()
  226. encoder.keyEncoder.Encode(key, subStream)
  227. encodedKey := subStream.Buffer()
  228. subIter.ResetBytes(encodedKey)
  229. decodedKey := subIter.ReadString()
  230. if stream.indention > 0 {
  231. subStream.writeTwoBytes(byte(':'), byte(' '))
  232. } else {
  233. subStream.writeByte(':')
  234. }
  235. encoder.elemEncoder.Encode(elem, subStream)
  236. keyValues = append(keyValues, encodedKV{
  237. key: decodedKey,
  238. keyValue: subStream.Buffer(),
  239. })
  240. }
  241. sort.Sort(keyValues)
  242. for i, keyValue := range keyValues {
  243. if i != 0 {
  244. stream.WriteMore()
  245. }
  246. stream.Write(keyValue.keyValue)
  247. }
  248. stream.WriteObjectEnd()
  249. stream.cfg.ReturnStream(subStream)
  250. stream.cfg.ReturnIterator(subIter)
  251. }
  252. func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  253. iter := encoder.mapType.UnsafeIterate(ptr)
  254. return !iter.HasNext()
  255. }
  256. type encodedKeyValues []encodedKV
  257. type encodedKV struct {
  258. key string
  259. keyValue []byte
  260. }
  261. func (sv encodedKeyValues) Len() int { return len(sv) }
  262. func (sv encodedKeyValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] }
  263. func (sv encodedKeyValues) Less(i, j int) bool { return sv[i].key < sv[j].key }