feature_reflect_object.go 30 KB

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