feature_reflect_object.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104
  1. package jsoniter
  2. import (
  3. "io"
  4. "fmt"
  5. "reflect"
  6. "unsafe"
  7. "strings"
  8. )
  9. func encoderOfStruct(typ reflect.Type) (Encoder, error) {
  10. structEncoder_ := &structEncoder{}
  11. for i := 0; i < typ.NumField(); i++ {
  12. field := typ.Field(i)
  13. var fieldNames []string
  14. for _, extension := range extensions {
  15. alternativeFieldNames, _ := extension(typ, &field)
  16. if alternativeFieldNames != nil {
  17. fieldNames = alternativeFieldNames
  18. }
  19. }
  20. tagParts := strings.Split(field.Tag.Get("json"), ",")
  21. // if fieldNames set by extension, use theirs, otherwise try tags
  22. if fieldNames == nil {
  23. /// tagParts[0] always present, even if no tags
  24. switch tagParts[0] {
  25. case "":
  26. fieldNames = []string{field.Name}
  27. case "-":
  28. fieldNames = []string{}
  29. default:
  30. fieldNames = []string{tagParts[0]}
  31. }
  32. }
  33. omitempty := false
  34. for _, tagPart := range tagParts {
  35. if tagPart == "omitempty" {
  36. omitempty = true
  37. }
  38. }
  39. var encoder Encoder
  40. var err error
  41. if len(fieldNames) > 0 {
  42. encoder, err = encoderOfType(field.Type)
  43. if err != nil {
  44. return prefix(fmt.Sprintf("{%s}", field.Name)).addToEncoder(encoder, err)
  45. }
  46. // map is stored as pointer in the struct
  47. // but if struct only has one map, it is inlined
  48. if field.Type.Kind() == reflect.Map && typ.NumField() > 1 {
  49. encoder = &optionalEncoder{encoder}
  50. }
  51. // one field pointer field will be inlined
  52. if field.Type.Kind() == reflect.Ptr && typ.NumField() == 1 {
  53. encoder = (encoder.(*optionalEncoder)).valueEncoder
  54. }
  55. }
  56. for _, fieldName := range fieldNames {
  57. structEncoder_.fields = append(structEncoder_.fields,
  58. &structFieldEncoder{&field, fieldName, encoder, omitempty})
  59. }
  60. }
  61. if len(structEncoder_.fields) == 0 {
  62. return &emptyStructEncoder{}, nil
  63. }
  64. return structEncoder_, nil
  65. }
  66. func decoderOfStruct(typ reflect.Type) (Decoder, error) {
  67. fields := map[string]*structFieldDecoder{}
  68. for i := 0; i < typ.NumField(); i++ {
  69. field := typ.Field(i)
  70. fieldDecoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
  71. var fieldNames []string
  72. for _, extension := range extensions {
  73. alternativeFieldNames, fun := extension(typ, &field)
  74. if alternativeFieldNames != nil {
  75. fieldNames = alternativeFieldNames
  76. }
  77. if fun != nil {
  78. fieldDecoders[fieldDecoderKey] = &funcDecoder{fun}
  79. }
  80. }
  81. decoder := fieldDecoders[fieldDecoderKey]
  82. tagParts := strings.Split(field.Tag.Get("json"), ",")
  83. // if fieldNames set by extension, use theirs, otherwise try tags
  84. if fieldNames == nil {
  85. /// tagParts[0] always present, even if no tags
  86. switch tagParts[0] {
  87. case "":
  88. fieldNames = []string{field.Name}
  89. case "-":
  90. fieldNames = []string{}
  91. default:
  92. fieldNames = []string{tagParts[0]}
  93. }
  94. }
  95. if decoder == nil && len(fieldNames) > 0 {
  96. var err error
  97. decoder, err = decoderOfType(field.Type)
  98. if err != nil {
  99. return prefix(fmt.Sprintf("{%s}", field.Name)).addToDecoder(decoder, err)
  100. }
  101. }
  102. if len(tagParts) > 1 && tagParts[1] == "string" {
  103. decoder = &stringNumberDecoder{decoder}
  104. }
  105. for _, fieldName := range fieldNames {
  106. fields[fieldName] = &structFieldDecoder{&field, decoder}
  107. }
  108. }
  109. return createStructDecoder(typ, fields)
  110. }
  111. func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder) (Decoder, error) {
  112. knownHash := map[int32]struct{}{
  113. 0: struct{}{},
  114. }
  115. switch len(fields) {
  116. case 0:
  117. return &skipDecoder{typ}, nil
  118. case 1:
  119. for fieldName, fieldDecoder := range fields {
  120. fieldHash := calcHash(fieldName)
  121. _, known := knownHash[fieldHash]
  122. if known {
  123. return &generalStructDecoder{typ, fields}, nil
  124. } else {
  125. knownHash[fieldHash] = struct{}{}
  126. }
  127. return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder}, nil
  128. }
  129. case 2:
  130. var fieldHash1 int32
  131. var fieldHash2 int32
  132. var fieldDecoder1 *structFieldDecoder
  133. var fieldDecoder2 *structFieldDecoder
  134. for fieldName, fieldDecoder := range fields {
  135. fieldHash := calcHash(fieldName)
  136. _, known := knownHash[fieldHash]
  137. if known {
  138. return &generalStructDecoder{typ, fields}, nil
  139. } else {
  140. knownHash[fieldHash] = struct{}{}
  141. }
  142. if fieldHash1 == 0 {
  143. fieldHash1 = fieldHash
  144. fieldDecoder1 = fieldDecoder
  145. } else {
  146. fieldHash2 = fieldHash
  147. fieldDecoder2 = fieldDecoder
  148. }
  149. }
  150. return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2}, nil
  151. case 3:
  152. var fieldName1 int32
  153. var fieldName2 int32
  154. var fieldName3 int32
  155. var fieldDecoder1 *structFieldDecoder
  156. var fieldDecoder2 *structFieldDecoder
  157. var fieldDecoder3 *structFieldDecoder
  158. for fieldName, fieldDecoder := range fields {
  159. fieldHash := calcHash(fieldName)
  160. _, known := knownHash[fieldHash]
  161. if known {
  162. return &generalStructDecoder{typ, fields}, nil
  163. } else {
  164. knownHash[fieldHash] = struct{}{}
  165. }
  166. if fieldName1 == 0 {
  167. fieldName1 = fieldHash
  168. fieldDecoder1 = fieldDecoder
  169. } else if fieldName2 == 0 {
  170. fieldName2 = fieldHash
  171. fieldDecoder2 = fieldDecoder
  172. } else {
  173. fieldName3 = fieldHash
  174. fieldDecoder3 = fieldDecoder
  175. }
  176. }
  177. return &threeFieldsStructDecoder{typ,
  178. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
  179. case 4:
  180. var fieldName1 int32
  181. var fieldName2 int32
  182. var fieldName3 int32
  183. var fieldName4 int32
  184. var fieldDecoder1 *structFieldDecoder
  185. var fieldDecoder2 *structFieldDecoder
  186. var fieldDecoder3 *structFieldDecoder
  187. var fieldDecoder4 *structFieldDecoder
  188. for fieldName, fieldDecoder := range fields {
  189. fieldHash := calcHash(fieldName)
  190. _, known := knownHash[fieldHash]
  191. if known {
  192. return &generalStructDecoder{typ, fields}, nil
  193. } else {
  194. knownHash[fieldHash] = struct{}{}
  195. }
  196. if fieldName1 == 0 {
  197. fieldName1 = fieldHash
  198. fieldDecoder1 = fieldDecoder
  199. } else if fieldName2 == 0 {
  200. fieldName2 = fieldHash
  201. fieldDecoder2 = fieldDecoder
  202. } else if fieldName3 == 0 {
  203. fieldName3 = fieldHash
  204. fieldDecoder3 = fieldDecoder
  205. } else {
  206. fieldName4 = fieldHash
  207. fieldDecoder4 = fieldDecoder
  208. }
  209. }
  210. return &fourFieldsStructDecoder{typ,
  211. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  212. fieldName4, fieldDecoder4}, nil
  213. case 5:
  214. var fieldName1 int32
  215. var fieldName2 int32
  216. var fieldName3 int32
  217. var fieldName4 int32
  218. var fieldName5 int32
  219. var fieldDecoder1 *structFieldDecoder
  220. var fieldDecoder2 *structFieldDecoder
  221. var fieldDecoder3 *structFieldDecoder
  222. var fieldDecoder4 *structFieldDecoder
  223. var fieldDecoder5 *structFieldDecoder
  224. for fieldName, fieldDecoder := range fields {
  225. fieldHash := calcHash(fieldName)
  226. _, known := knownHash[fieldHash]
  227. if known {
  228. return &generalStructDecoder{typ, fields}, nil
  229. } else {
  230. knownHash[fieldHash] = struct{}{}
  231. }
  232. if fieldName1 == 0 {
  233. fieldName1 = fieldHash
  234. fieldDecoder1 = fieldDecoder
  235. } else if fieldName2 == 0 {
  236. fieldName2 = fieldHash
  237. fieldDecoder2 = fieldDecoder
  238. } else if fieldName3 == 0 {
  239. fieldName3 = fieldHash
  240. fieldDecoder3 = fieldDecoder
  241. } else if fieldName4 == 0 {
  242. fieldName4 = fieldHash
  243. fieldDecoder4 = fieldDecoder
  244. } else {
  245. fieldName5 = fieldHash
  246. fieldDecoder5 = fieldDecoder
  247. }
  248. }
  249. return &fiveFieldsStructDecoder{typ,
  250. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  251. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5}, nil
  252. case 6:
  253. var fieldName1 int32
  254. var fieldName2 int32
  255. var fieldName3 int32
  256. var fieldName4 int32
  257. var fieldName5 int32
  258. var fieldName6 int32
  259. var fieldDecoder1 *structFieldDecoder
  260. var fieldDecoder2 *structFieldDecoder
  261. var fieldDecoder3 *structFieldDecoder
  262. var fieldDecoder4 *structFieldDecoder
  263. var fieldDecoder5 *structFieldDecoder
  264. var fieldDecoder6 *structFieldDecoder
  265. for fieldName, fieldDecoder := range fields {
  266. fieldHash := calcHash(fieldName)
  267. _, known := knownHash[fieldHash]
  268. if known {
  269. return &generalStructDecoder{typ, fields}, nil
  270. } else {
  271. knownHash[fieldHash] = struct{}{}
  272. }
  273. if fieldName1 == 0 {
  274. fieldName1 = fieldHash
  275. fieldDecoder1 = fieldDecoder
  276. } else if fieldName2 == 0 {
  277. fieldName2 = fieldHash
  278. fieldDecoder2 = fieldDecoder
  279. } else if fieldName3 == 0 {
  280. fieldName3 = fieldHash
  281. fieldDecoder3 = fieldDecoder
  282. } else if fieldName4 == 0 {
  283. fieldName4 = fieldHash
  284. fieldDecoder4 = fieldDecoder
  285. } else if fieldName5 == 0 {
  286. fieldName5 = fieldHash
  287. fieldDecoder5 = fieldDecoder
  288. } else {
  289. fieldName6 = fieldHash
  290. fieldDecoder6 = fieldDecoder
  291. }
  292. }
  293. return &sixFieldsStructDecoder{typ,
  294. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  295. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6}, nil
  296. case 7:
  297. var fieldName1 int32
  298. var fieldName2 int32
  299. var fieldName3 int32
  300. var fieldName4 int32
  301. var fieldName5 int32
  302. var fieldName6 int32
  303. var fieldName7 int32
  304. var fieldDecoder1 *structFieldDecoder
  305. var fieldDecoder2 *structFieldDecoder
  306. var fieldDecoder3 *structFieldDecoder
  307. var fieldDecoder4 *structFieldDecoder
  308. var fieldDecoder5 *structFieldDecoder
  309. var fieldDecoder6 *structFieldDecoder
  310. var fieldDecoder7 *structFieldDecoder
  311. for fieldName, fieldDecoder := range fields {
  312. fieldHash := calcHash(fieldName)
  313. _, known := knownHash[fieldHash]
  314. if known {
  315. return &generalStructDecoder{typ, fields}, nil
  316. } else {
  317. knownHash[fieldHash] = struct{}{}
  318. }
  319. if fieldName1 == 0 {
  320. fieldName1 = fieldHash
  321. fieldDecoder1 = fieldDecoder
  322. } else if fieldName2 == 0 {
  323. fieldName2 = fieldHash
  324. fieldDecoder2 = fieldDecoder
  325. } else if fieldName3 == 0 {
  326. fieldName3 = fieldHash
  327. fieldDecoder3 = fieldDecoder
  328. } else if fieldName4 == 0 {
  329. fieldName4 = fieldHash
  330. fieldDecoder4 = fieldDecoder
  331. } else if fieldName5 == 0 {
  332. fieldName5 = fieldHash
  333. fieldDecoder5 = fieldDecoder
  334. } else if fieldName6 == 0 {
  335. fieldName6 = fieldHash
  336. fieldDecoder6 = fieldDecoder
  337. } else {
  338. fieldName7 = fieldHash
  339. fieldDecoder7 = fieldDecoder
  340. }
  341. }
  342. return &sevenFieldsStructDecoder{typ,
  343. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  344. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  345. fieldName7, fieldDecoder7}, nil
  346. case 8:
  347. var fieldName1 int32
  348. var fieldName2 int32
  349. var fieldName3 int32
  350. var fieldName4 int32
  351. var fieldName5 int32
  352. var fieldName6 int32
  353. var fieldName7 int32
  354. var fieldName8 int32
  355. var fieldDecoder1 *structFieldDecoder
  356. var fieldDecoder2 *structFieldDecoder
  357. var fieldDecoder3 *structFieldDecoder
  358. var fieldDecoder4 *structFieldDecoder
  359. var fieldDecoder5 *structFieldDecoder
  360. var fieldDecoder6 *structFieldDecoder
  361. var fieldDecoder7 *structFieldDecoder
  362. var fieldDecoder8 *structFieldDecoder
  363. for fieldName, fieldDecoder := range fields {
  364. fieldHash := calcHash(fieldName)
  365. _, known := knownHash[fieldHash]
  366. if known {
  367. return &generalStructDecoder{typ, fields}, nil
  368. } else {
  369. knownHash[fieldHash] = struct{}{}
  370. }
  371. if fieldName1 == 0 {
  372. fieldName1 = fieldHash
  373. fieldDecoder1 = fieldDecoder
  374. } else if fieldName2 == 0 {
  375. fieldName2 = fieldHash
  376. fieldDecoder2 = fieldDecoder
  377. } else if fieldName3 == 0 {
  378. fieldName3 = fieldHash
  379. fieldDecoder3 = fieldDecoder
  380. } else if fieldName4 == 0 {
  381. fieldName4 = fieldHash
  382. fieldDecoder4 = fieldDecoder
  383. } else if fieldName5 == 0 {
  384. fieldName5 = fieldHash
  385. fieldDecoder5 = fieldDecoder
  386. } else if fieldName6 == 0 {
  387. fieldName6 = fieldHash
  388. fieldDecoder6 = fieldDecoder
  389. } else if fieldName7 == 0 {
  390. fieldName7 = fieldHash
  391. fieldDecoder7 = fieldDecoder
  392. } else {
  393. fieldName8 = fieldHash
  394. fieldDecoder8 = fieldDecoder
  395. }
  396. }
  397. return &eightFieldsStructDecoder{typ,
  398. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  399. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  400. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8}, nil
  401. case 9:
  402. var fieldName1 int32
  403. var fieldName2 int32
  404. var fieldName3 int32
  405. var fieldName4 int32
  406. var fieldName5 int32
  407. var fieldName6 int32
  408. var fieldName7 int32
  409. var fieldName8 int32
  410. var fieldName9 int32
  411. var fieldDecoder1 *structFieldDecoder
  412. var fieldDecoder2 *structFieldDecoder
  413. var fieldDecoder3 *structFieldDecoder
  414. var fieldDecoder4 *structFieldDecoder
  415. var fieldDecoder5 *structFieldDecoder
  416. var fieldDecoder6 *structFieldDecoder
  417. var fieldDecoder7 *structFieldDecoder
  418. var fieldDecoder8 *structFieldDecoder
  419. var fieldDecoder9 *structFieldDecoder
  420. for fieldName, fieldDecoder := range fields {
  421. fieldHash := calcHash(fieldName)
  422. _, known := knownHash[fieldHash]
  423. if known {
  424. return &generalStructDecoder{typ, fields}, nil
  425. } else {
  426. knownHash[fieldHash] = struct{}{}
  427. }
  428. if fieldName1 == 0 {
  429. fieldName1 = fieldHash
  430. fieldDecoder1 = fieldDecoder
  431. } else if fieldName2 == 0 {
  432. fieldName2 = fieldHash
  433. fieldDecoder2 = fieldDecoder
  434. } else if fieldName3 == 0 {
  435. fieldName3 = fieldHash
  436. fieldDecoder3 = fieldDecoder
  437. } else if fieldName4 == 0 {
  438. fieldName4 = fieldHash
  439. fieldDecoder4 = fieldDecoder
  440. } else if fieldName5 == 0 {
  441. fieldName5 = fieldHash
  442. fieldDecoder5 = fieldDecoder
  443. } else if fieldName6 == 0 {
  444. fieldName6 = fieldHash
  445. fieldDecoder6 = fieldDecoder
  446. } else if fieldName7 == 0 {
  447. fieldName7 = fieldHash
  448. fieldDecoder7 = fieldDecoder
  449. } else if fieldName8 == 0 {
  450. fieldName8 = fieldHash
  451. fieldDecoder8 = fieldDecoder
  452. } else {
  453. fieldName9 = fieldHash
  454. fieldDecoder9 = fieldDecoder
  455. }
  456. }
  457. return &nineFieldsStructDecoder{typ,
  458. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  459. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  460. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9}, nil
  461. case 10:
  462. var fieldName1 int32
  463. var fieldName2 int32
  464. var fieldName3 int32
  465. var fieldName4 int32
  466. var fieldName5 int32
  467. var fieldName6 int32
  468. var fieldName7 int32
  469. var fieldName8 int32
  470. var fieldName9 int32
  471. var fieldName10 int32
  472. var fieldDecoder1 *structFieldDecoder
  473. var fieldDecoder2 *structFieldDecoder
  474. var fieldDecoder3 *structFieldDecoder
  475. var fieldDecoder4 *structFieldDecoder
  476. var fieldDecoder5 *structFieldDecoder
  477. var fieldDecoder6 *structFieldDecoder
  478. var fieldDecoder7 *structFieldDecoder
  479. var fieldDecoder8 *structFieldDecoder
  480. var fieldDecoder9 *structFieldDecoder
  481. var fieldDecoder10 *structFieldDecoder
  482. for fieldName, fieldDecoder := range fields {
  483. fieldHash := calcHash(fieldName)
  484. _, known := knownHash[fieldHash]
  485. if known {
  486. return &generalStructDecoder{typ, fields}, nil
  487. } else {
  488. knownHash[fieldHash] = struct{}{}
  489. }
  490. if fieldName1 == 0 {
  491. fieldName1 = fieldHash
  492. fieldDecoder1 = fieldDecoder
  493. } else if fieldName2 == 0 {
  494. fieldName2 = fieldHash
  495. fieldDecoder2 = fieldDecoder
  496. } else if fieldName3 == 0 {
  497. fieldName3 = fieldHash
  498. fieldDecoder3 = fieldDecoder
  499. } else if fieldName4 == 0 {
  500. fieldName4 = fieldHash
  501. fieldDecoder4 = fieldDecoder
  502. } else if fieldName5 == 0 {
  503. fieldName5 = fieldHash
  504. fieldDecoder5 = fieldDecoder
  505. } else if fieldName6 == 0 {
  506. fieldName6 = fieldHash
  507. fieldDecoder6 = fieldDecoder
  508. } else if fieldName7 == 0 {
  509. fieldName7 = fieldHash
  510. fieldDecoder7 = fieldDecoder
  511. } else if fieldName8 == 0 {
  512. fieldName8 = fieldHash
  513. fieldDecoder8 = fieldDecoder
  514. } else if fieldName9 == 0 {
  515. fieldName9 = fieldHash
  516. fieldDecoder9 = fieldDecoder
  517. } else {
  518. fieldName10 = fieldHash
  519. fieldDecoder10 = fieldDecoder
  520. }
  521. }
  522. return &tenFieldsStructDecoder{typ,
  523. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  524. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  525. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9,
  526. fieldName10, fieldDecoder10}, nil
  527. }
  528. return &generalStructDecoder{typ, fields}, nil
  529. }
  530. type generalStructDecoder struct {
  531. typ reflect.Type
  532. fields map[string]*structFieldDecoder
  533. }
  534. func (decoder *generalStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  535. if !iter.readObjectStart() {
  536. return
  537. }
  538. fieldBytes := iter.readObjectFieldAsBytes()
  539. field := *(*string)(unsafe.Pointer(&fieldBytes))
  540. fieldDecoder := decoder.fields[field]
  541. if fieldDecoder == nil {
  542. iter.Skip()
  543. } else {
  544. fieldDecoder.decode(ptr, iter)
  545. }
  546. for iter.nextToken() == ',' {
  547. fieldBytes = iter.readObjectFieldAsBytes()
  548. field = *(*string)(unsafe.Pointer(&fieldBytes))
  549. fieldDecoder = decoder.fields[field]
  550. if fieldDecoder == nil {
  551. iter.Skip()
  552. } else {
  553. fieldDecoder.decode(ptr, iter)
  554. }
  555. }
  556. if iter.Error != nil && iter.Error != io.EOF {
  557. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  558. }
  559. }
  560. type skipDecoder struct {
  561. typ reflect.Type
  562. }
  563. func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  564. iter.Skip()
  565. if iter.Error != nil && iter.Error != io.EOF {
  566. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  567. }
  568. }
  569. type oneFieldStructDecoder struct {
  570. typ reflect.Type
  571. fieldHash int32
  572. fieldDecoder *structFieldDecoder
  573. }
  574. func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  575. if !iter.readObjectStart() {
  576. return
  577. }
  578. for {
  579. if iter.readFieldHash() == decoder.fieldHash {
  580. decoder.fieldDecoder.decode(ptr, iter)
  581. } else {
  582. iter.Skip()
  583. }
  584. if iter.nextToken() != ',' {
  585. break
  586. }
  587. }
  588. if iter.Error != nil && iter.Error != io.EOF {
  589. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  590. }
  591. }
  592. type twoFieldsStructDecoder struct {
  593. typ reflect.Type
  594. fieldHash1 int32
  595. fieldDecoder1 *structFieldDecoder
  596. fieldHash2 int32
  597. fieldDecoder2 *structFieldDecoder
  598. }
  599. func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  600. if !iter.readObjectStart() {
  601. return
  602. }
  603. for {
  604. switch iter.readFieldHash() {
  605. case decoder.fieldHash1:
  606. decoder.fieldDecoder1.decode(ptr, iter)
  607. case decoder.fieldHash2:
  608. decoder.fieldDecoder2.decode(ptr, iter)
  609. default:
  610. iter.Skip()
  611. }
  612. if iter.nextToken() != ',' {
  613. break
  614. }
  615. }
  616. if iter.Error != nil && iter.Error != io.EOF {
  617. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  618. }
  619. }
  620. type threeFieldsStructDecoder struct {
  621. typ reflect.Type
  622. fieldHash1 int32
  623. fieldDecoder1 *structFieldDecoder
  624. fieldHash2 int32
  625. fieldDecoder2 *structFieldDecoder
  626. fieldHash3 int32
  627. fieldDecoder3 *structFieldDecoder
  628. }
  629. func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  630. if !iter.readObjectStart() {
  631. return
  632. }
  633. for {
  634. switch iter.readFieldHash() {
  635. case decoder.fieldHash1:
  636. decoder.fieldDecoder1.decode(ptr, iter)
  637. case decoder.fieldHash2:
  638. decoder.fieldDecoder2.decode(ptr, iter)
  639. case decoder.fieldHash3:
  640. decoder.fieldDecoder3.decode(ptr, iter)
  641. default:
  642. iter.Skip()
  643. }
  644. if iter.nextToken() != ',' {
  645. break
  646. }
  647. }
  648. if iter.Error != nil && iter.Error != io.EOF {
  649. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  650. }
  651. }
  652. type fourFieldsStructDecoder struct {
  653. typ reflect.Type
  654. fieldHash1 int32
  655. fieldDecoder1 *structFieldDecoder
  656. fieldHash2 int32
  657. fieldDecoder2 *structFieldDecoder
  658. fieldHash3 int32
  659. fieldDecoder3 *structFieldDecoder
  660. fieldHash4 int32
  661. fieldDecoder4 *structFieldDecoder
  662. }
  663. func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  664. if !iter.readObjectStart() {
  665. return
  666. }
  667. for {
  668. switch iter.readFieldHash() {
  669. case decoder.fieldHash1:
  670. decoder.fieldDecoder1.decode(ptr, iter)
  671. case decoder.fieldHash2:
  672. decoder.fieldDecoder2.decode(ptr, iter)
  673. case decoder.fieldHash3:
  674. decoder.fieldDecoder3.decode(ptr, iter)
  675. case decoder.fieldHash4:
  676. decoder.fieldDecoder4.decode(ptr, iter)
  677. default:
  678. iter.Skip()
  679. }
  680. if iter.nextToken() != ',' {
  681. break
  682. }
  683. }
  684. if iter.Error != nil && iter.Error != io.EOF {
  685. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  686. }
  687. }
  688. type fiveFieldsStructDecoder struct {
  689. typ reflect.Type
  690. fieldHash1 int32
  691. fieldDecoder1 *structFieldDecoder
  692. fieldHash2 int32
  693. fieldDecoder2 *structFieldDecoder
  694. fieldHash3 int32
  695. fieldDecoder3 *structFieldDecoder
  696. fieldHash4 int32
  697. fieldDecoder4 *structFieldDecoder
  698. fieldHash5 int32
  699. fieldDecoder5 *structFieldDecoder
  700. }
  701. func (decoder *fiveFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  702. if !iter.readObjectStart() {
  703. return
  704. }
  705. for {
  706. switch iter.readFieldHash() {
  707. case decoder.fieldHash1:
  708. decoder.fieldDecoder1.decode(ptr, iter)
  709. case decoder.fieldHash2:
  710. decoder.fieldDecoder2.decode(ptr, iter)
  711. case decoder.fieldHash3:
  712. decoder.fieldDecoder3.decode(ptr, iter)
  713. case decoder.fieldHash4:
  714. decoder.fieldDecoder4.decode(ptr, iter)
  715. case decoder.fieldHash5:
  716. decoder.fieldDecoder5.decode(ptr, iter)
  717. default:
  718. iter.Skip()
  719. }
  720. if iter.nextToken() != ',' {
  721. break
  722. }
  723. }
  724. if iter.Error != nil && iter.Error != io.EOF {
  725. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  726. }
  727. }
  728. type sixFieldsStructDecoder struct {
  729. typ reflect.Type
  730. fieldHash1 int32
  731. fieldDecoder1 *structFieldDecoder
  732. fieldHash2 int32
  733. fieldDecoder2 *structFieldDecoder
  734. fieldHash3 int32
  735. fieldDecoder3 *structFieldDecoder
  736. fieldHash4 int32
  737. fieldDecoder4 *structFieldDecoder
  738. fieldHash5 int32
  739. fieldDecoder5 *structFieldDecoder
  740. fieldHash6 int32
  741. fieldDecoder6 *structFieldDecoder
  742. }
  743. func (decoder *sixFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  744. if !iter.readObjectStart() {
  745. return
  746. }
  747. for {
  748. switch iter.readFieldHash() {
  749. case decoder.fieldHash1:
  750. decoder.fieldDecoder1.decode(ptr, iter)
  751. case decoder.fieldHash2:
  752. decoder.fieldDecoder2.decode(ptr, iter)
  753. case decoder.fieldHash3:
  754. decoder.fieldDecoder3.decode(ptr, iter)
  755. case decoder.fieldHash4:
  756. decoder.fieldDecoder4.decode(ptr, iter)
  757. case decoder.fieldHash5:
  758. decoder.fieldDecoder5.decode(ptr, iter)
  759. case decoder.fieldHash6:
  760. decoder.fieldDecoder6.decode(ptr, iter)
  761. default:
  762. iter.Skip()
  763. }
  764. if iter.nextToken() != ',' {
  765. break
  766. }
  767. }
  768. if iter.Error != nil && iter.Error != io.EOF {
  769. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  770. }
  771. }
  772. type sevenFieldsStructDecoder struct {
  773. typ reflect.Type
  774. fieldHash1 int32
  775. fieldDecoder1 *structFieldDecoder
  776. fieldHash2 int32
  777. fieldDecoder2 *structFieldDecoder
  778. fieldHash3 int32
  779. fieldDecoder3 *structFieldDecoder
  780. fieldHash4 int32
  781. fieldDecoder4 *structFieldDecoder
  782. fieldHash5 int32
  783. fieldDecoder5 *structFieldDecoder
  784. fieldHash6 int32
  785. fieldDecoder6 *structFieldDecoder
  786. fieldHash7 int32
  787. fieldDecoder7 *structFieldDecoder
  788. }
  789. func (decoder *sevenFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  790. if !iter.readObjectStart() {
  791. return
  792. }
  793. for {
  794. switch iter.readFieldHash() {
  795. case decoder.fieldHash1:
  796. decoder.fieldDecoder1.decode(ptr, iter)
  797. case decoder.fieldHash2:
  798. decoder.fieldDecoder2.decode(ptr, iter)
  799. case decoder.fieldHash3:
  800. decoder.fieldDecoder3.decode(ptr, iter)
  801. case decoder.fieldHash4:
  802. decoder.fieldDecoder4.decode(ptr, iter)
  803. case decoder.fieldHash5:
  804. decoder.fieldDecoder5.decode(ptr, iter)
  805. case decoder.fieldHash6:
  806. decoder.fieldDecoder6.decode(ptr, iter)
  807. case decoder.fieldHash7:
  808. decoder.fieldDecoder7.decode(ptr, iter)
  809. default:
  810. iter.Skip()
  811. }
  812. if iter.nextToken() != ',' {
  813. break
  814. }
  815. }
  816. if iter.Error != nil && iter.Error != io.EOF {
  817. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  818. }
  819. }
  820. type eightFieldsStructDecoder struct {
  821. typ reflect.Type
  822. fieldHash1 int32
  823. fieldDecoder1 *structFieldDecoder
  824. fieldHash2 int32
  825. fieldDecoder2 *structFieldDecoder
  826. fieldHash3 int32
  827. fieldDecoder3 *structFieldDecoder
  828. fieldHash4 int32
  829. fieldDecoder4 *structFieldDecoder
  830. fieldHash5 int32
  831. fieldDecoder5 *structFieldDecoder
  832. fieldHash6 int32
  833. fieldDecoder6 *structFieldDecoder
  834. fieldHash7 int32
  835. fieldDecoder7 *structFieldDecoder
  836. fieldHash8 int32
  837. fieldDecoder8 *structFieldDecoder
  838. }
  839. func (decoder *eightFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  840. if !iter.readObjectStart() {
  841. return
  842. }
  843. for {
  844. switch iter.readFieldHash() {
  845. case decoder.fieldHash1:
  846. decoder.fieldDecoder1.decode(ptr, iter)
  847. case decoder.fieldHash2:
  848. decoder.fieldDecoder2.decode(ptr, iter)
  849. case decoder.fieldHash3:
  850. decoder.fieldDecoder3.decode(ptr, iter)
  851. case decoder.fieldHash4:
  852. decoder.fieldDecoder4.decode(ptr, iter)
  853. case decoder.fieldHash5:
  854. decoder.fieldDecoder5.decode(ptr, iter)
  855. case decoder.fieldHash6:
  856. decoder.fieldDecoder6.decode(ptr, iter)
  857. case decoder.fieldHash7:
  858. decoder.fieldDecoder7.decode(ptr, iter)
  859. case decoder.fieldHash8:
  860. decoder.fieldDecoder8.decode(ptr, iter)
  861. default:
  862. iter.Skip()
  863. }
  864. if iter.nextToken() != ',' {
  865. break
  866. }
  867. }
  868. if iter.Error != nil && iter.Error != io.EOF {
  869. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  870. }
  871. }
  872. type nineFieldsStructDecoder struct {
  873. typ reflect.Type
  874. fieldHash1 int32
  875. fieldDecoder1 *structFieldDecoder
  876. fieldHash2 int32
  877. fieldDecoder2 *structFieldDecoder
  878. fieldHash3 int32
  879. fieldDecoder3 *structFieldDecoder
  880. fieldHash4 int32
  881. fieldDecoder4 *structFieldDecoder
  882. fieldHash5 int32
  883. fieldDecoder5 *structFieldDecoder
  884. fieldHash6 int32
  885. fieldDecoder6 *structFieldDecoder
  886. fieldHash7 int32
  887. fieldDecoder7 *structFieldDecoder
  888. fieldHash8 int32
  889. fieldDecoder8 *structFieldDecoder
  890. fieldHash9 int32
  891. fieldDecoder9 *structFieldDecoder
  892. }
  893. func (decoder *nineFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  894. if !iter.readObjectStart() {
  895. return
  896. }
  897. for {
  898. switch iter.readFieldHash() {
  899. case decoder.fieldHash1:
  900. decoder.fieldDecoder1.decode(ptr, iter)
  901. case decoder.fieldHash2:
  902. decoder.fieldDecoder2.decode(ptr, iter)
  903. case decoder.fieldHash3:
  904. decoder.fieldDecoder3.decode(ptr, iter)
  905. case decoder.fieldHash4:
  906. decoder.fieldDecoder4.decode(ptr, iter)
  907. case decoder.fieldHash5:
  908. decoder.fieldDecoder5.decode(ptr, iter)
  909. case decoder.fieldHash6:
  910. decoder.fieldDecoder6.decode(ptr, iter)
  911. case decoder.fieldHash7:
  912. decoder.fieldDecoder7.decode(ptr, iter)
  913. case decoder.fieldHash8:
  914. decoder.fieldDecoder8.decode(ptr, iter)
  915. case decoder.fieldHash9:
  916. decoder.fieldDecoder9.decode(ptr, iter)
  917. default:
  918. iter.Skip()
  919. }
  920. if iter.nextToken() != ',' {
  921. break
  922. }
  923. }
  924. if iter.Error != nil && iter.Error != io.EOF {
  925. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  926. }
  927. }
  928. type tenFieldsStructDecoder struct {
  929. typ reflect.Type
  930. fieldHash1 int32
  931. fieldDecoder1 *structFieldDecoder
  932. fieldHash2 int32
  933. fieldDecoder2 *structFieldDecoder
  934. fieldHash3 int32
  935. fieldDecoder3 *structFieldDecoder
  936. fieldHash4 int32
  937. fieldDecoder4 *structFieldDecoder
  938. fieldHash5 int32
  939. fieldDecoder5 *structFieldDecoder
  940. fieldHash6 int32
  941. fieldDecoder6 *structFieldDecoder
  942. fieldHash7 int32
  943. fieldDecoder7 *structFieldDecoder
  944. fieldHash8 int32
  945. fieldDecoder8 *structFieldDecoder
  946. fieldHash9 int32
  947. fieldDecoder9 *structFieldDecoder
  948. fieldHash10 int32
  949. fieldDecoder10 *structFieldDecoder
  950. }
  951. func (decoder *tenFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  952. if !iter.readObjectStart() {
  953. return
  954. }
  955. for {
  956. switch iter.readFieldHash() {
  957. case decoder.fieldHash1:
  958. decoder.fieldDecoder1.decode(ptr, iter)
  959. case decoder.fieldHash2:
  960. decoder.fieldDecoder2.decode(ptr, iter)
  961. case decoder.fieldHash3:
  962. decoder.fieldDecoder3.decode(ptr, iter)
  963. case decoder.fieldHash4:
  964. decoder.fieldDecoder4.decode(ptr, iter)
  965. case decoder.fieldHash5:
  966. decoder.fieldDecoder5.decode(ptr, iter)
  967. case decoder.fieldHash6:
  968. decoder.fieldDecoder6.decode(ptr, iter)
  969. case decoder.fieldHash7:
  970. decoder.fieldDecoder7.decode(ptr, iter)
  971. case decoder.fieldHash8:
  972. decoder.fieldDecoder8.decode(ptr, iter)
  973. case decoder.fieldHash9:
  974. decoder.fieldDecoder9.decode(ptr, iter)
  975. case decoder.fieldHash10:
  976. decoder.fieldDecoder10.decode(ptr, iter)
  977. default:
  978. iter.Skip()
  979. }
  980. if iter.nextToken() != ',' {
  981. break
  982. }
  983. }
  984. if iter.Error != nil && iter.Error != io.EOF {
  985. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  986. }
  987. }
  988. type structFieldDecoder struct {
  989. field *reflect.StructField
  990. fieldDecoder Decoder
  991. }
  992. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  993. fieldPtr := uintptr(ptr) + decoder.field.Offset
  994. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  995. if iter.Error != nil && iter.Error != io.EOF {
  996. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  997. }
  998. }
  999. type structFieldEncoder struct {
  1000. field *reflect.StructField
  1001. fieldName string
  1002. fieldEncoder Encoder
  1003. omitempty bool
  1004. }
  1005. func (encoder *structFieldEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  1006. fieldPtr := uintptr(ptr) + encoder.field.Offset
  1007. stream.WriteObjectField(encoder.fieldName)
  1008. encoder.fieldEncoder.encode(unsafe.Pointer(fieldPtr), stream)
  1009. if stream.Error != nil && stream.Error != io.EOF {
  1010. stream.Error = fmt.Errorf("%s: %s", encoder.field.Name, stream.Error.Error())
  1011. }
  1012. }
  1013. func (encoder *structFieldEncoder) encodeInterface(val interface{}, stream *Stream) {
  1014. WriteToStream(val, stream, encoder)
  1015. }
  1016. func (encoder *structFieldEncoder) isEmpty(ptr unsafe.Pointer) bool {
  1017. fieldPtr := uintptr(ptr) + encoder.field.Offset
  1018. return encoder.fieldEncoder.isEmpty(unsafe.Pointer(fieldPtr))
  1019. }
  1020. type structEncoder struct {
  1021. fields []*structFieldEncoder
  1022. }
  1023. func (encoder *structEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  1024. stream.WriteObjectStart()
  1025. isNotFirst := false
  1026. for _, field := range encoder.fields {
  1027. if field.omitempty && field.isEmpty(ptr) {
  1028. continue
  1029. }
  1030. if isNotFirst {
  1031. stream.WriteMore()
  1032. }
  1033. field.encode(ptr, stream)
  1034. isNotFirst = true
  1035. }
  1036. stream.WriteObjectEnd()
  1037. }
  1038. func (encoder *structEncoder) encodeInterface(val interface{}, stream *Stream) {
  1039. WriteToStream(val, stream, encoder)
  1040. }
  1041. func (encoder *structEncoder) isEmpty(ptr unsafe.Pointer) bool {
  1042. for _, field := range encoder.fields {
  1043. if !field.isEmpty(ptr) {
  1044. return false
  1045. }
  1046. }
  1047. return true
  1048. }
  1049. type emptyStructEncoder struct {
  1050. }
  1051. func (encoder *emptyStructEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  1052. stream.WriteEmptyObject()
  1053. }
  1054. func (encoder *emptyStructEncoder) encodeInterface(val interface{}, stream *Stream) {
  1055. WriteToStream(val, stream, encoder)
  1056. }
  1057. func (encoder *emptyStructEncoder) isEmpty(ptr unsafe.Pointer) bool {
  1058. return true
  1059. }