reflect_map.go 7.7 KB

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