feature_any_object.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  1. package jsoniter
  2. import (
  3. "unsafe"
  4. "fmt"
  5. "reflect"
  6. )
  7. type objectLazyAny struct {
  8. baseAny
  9. buf []byte
  10. iter *Iterator
  11. err error
  12. cache map[string]Any
  13. remaining []byte
  14. }
  15. func (any *objectLazyAny) ValueType() ValueType {
  16. return Object
  17. }
  18. func (any *objectLazyAny) Parse() *Iterator {
  19. iter := any.iter
  20. if iter == nil {
  21. iter = NewIterator()
  22. any.iter = iter
  23. }
  24. iter.ResetBytes(any.remaining)
  25. return iter
  26. }
  27. func (any *objectLazyAny) fillCacheUntil(target string) Any {
  28. if any.remaining == nil {
  29. return any.cache[target]
  30. }
  31. if any.cache == nil {
  32. any.cache = map[string]Any{}
  33. }
  34. val := any.cache[target]
  35. if val != nil {
  36. return val
  37. }
  38. iter := any.Parse()
  39. if len(any.remaining) == len(any.buf) {
  40. iter.head++
  41. c := iter.nextToken()
  42. if c != '}' {
  43. iter.unreadByte()
  44. k := string(iter.readObjectFieldAsBytes())
  45. v := iter.readAny(iter)
  46. any.cache[k] = v
  47. if target == k {
  48. any.remaining = iter.buf[iter.head:]
  49. any.err = iter.Error
  50. return v
  51. }
  52. } else {
  53. any.remaining = nil
  54. any.err = iter.Error
  55. return nil
  56. }
  57. }
  58. for iter.nextToken() == ',' {
  59. k := string(iter.readObjectFieldAsBytes())
  60. v := iter.readAny(iter)
  61. any.cache[k] = v
  62. if target == k {
  63. any.remaining = iter.buf[iter.head:]
  64. any.err = iter.Error
  65. return v
  66. }
  67. }
  68. any.remaining = nil
  69. any.err = iter.Error
  70. return nil
  71. }
  72. func (any *objectLazyAny) fillCache() {
  73. if any.remaining == nil {
  74. return
  75. }
  76. if any.cache == nil {
  77. any.cache = map[string]Any{}
  78. }
  79. iter := any.Parse()
  80. if len(any.remaining) == len(any.buf) {
  81. iter.head++
  82. c := iter.nextToken()
  83. if c != '}' {
  84. iter.unreadByte()
  85. k := string(iter.readObjectFieldAsBytes())
  86. v := iter.readAny(iter)
  87. any.cache[k] = v
  88. } else {
  89. any.remaining = nil
  90. any.err = iter.Error
  91. return
  92. }
  93. }
  94. for iter.nextToken() == ',' {
  95. k := string(iter.readObjectFieldAsBytes())
  96. v := iter.readAny(iter)
  97. any.cache[k] = v
  98. }
  99. any.remaining = nil
  100. any.err = iter.Error
  101. return
  102. }
  103. func (any *objectLazyAny) LastError() error {
  104. return any.err
  105. }
  106. func (any *objectLazyAny) ToBool() bool {
  107. if any.cache == nil {
  108. any.IterateObject() // trigger first value read
  109. }
  110. return len(any.cache) != 0
  111. }
  112. func (any *objectLazyAny) ToInt() int {
  113. if any.cache == nil {
  114. any.IterateObject() // trigger first value read
  115. }
  116. if len(any.cache) == 0 {
  117. return 0
  118. }
  119. return 1
  120. }
  121. func (any *objectLazyAny) ToInt32() int32 {
  122. if any.cache == nil {
  123. any.IterateObject() // trigger first value read
  124. }
  125. if len(any.cache) == 0 {
  126. return 0
  127. }
  128. return 1
  129. }
  130. func (any *objectLazyAny) ToInt64() int64 {
  131. if any.cache == nil {
  132. any.IterateObject() // trigger first value read
  133. }
  134. if len(any.cache) == 0 {
  135. return 0
  136. }
  137. return 1
  138. }
  139. func (any *objectLazyAny) ToUint() uint {
  140. if any.cache == nil {
  141. any.IterateObject() // trigger first value read
  142. }
  143. if len(any.cache) == 0 {
  144. return 0
  145. }
  146. return 1
  147. }
  148. func (any *objectLazyAny) ToUint32() uint32 {
  149. if any.cache == nil {
  150. any.IterateObject() // trigger first value read
  151. }
  152. if len(any.cache) == 0 {
  153. return 0
  154. }
  155. return 1
  156. }
  157. func (any *objectLazyAny) ToUint64() uint64 {
  158. if any.cache == nil {
  159. any.IterateObject() // trigger first value read
  160. }
  161. if len(any.cache) == 0 {
  162. return 0
  163. }
  164. return 1
  165. }
  166. func (any *objectLazyAny) ToFloat32() float32 {
  167. if any.cache == nil {
  168. any.IterateObject() // trigger first value read
  169. }
  170. if len(any.cache) == 0 {
  171. return 0
  172. }
  173. return 1
  174. }
  175. func (any *objectLazyAny) ToFloat64() float64 {
  176. if any.cache == nil {
  177. any.IterateObject() // trigger first value read
  178. }
  179. if len(any.cache) == 0 {
  180. return 0
  181. }
  182. return 1
  183. }
  184. func (any *objectLazyAny) ToString() string {
  185. if len(any.remaining) == len(any.buf) {
  186. // nothing has been parsed yet
  187. return *(*string)(unsafe.Pointer(&any.buf))
  188. } else {
  189. any.fillCache()
  190. str, err := MarshalToString(any.cache)
  191. any.err = err
  192. return str
  193. }
  194. }
  195. func (any *objectLazyAny) Get(path ...interface{}) Any {
  196. if len(path) == 0 {
  197. return any
  198. }
  199. var element Any
  200. key, ok := path[0].(string)
  201. if ok {
  202. element = any.fillCacheUntil(key)
  203. if element == nil {
  204. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", key, any.cache)}
  205. }
  206. } else {
  207. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", key, any.cache)}
  208. }
  209. if len(path) == 1 {
  210. return element
  211. } else {
  212. return element.Get(path[1:]...)
  213. }
  214. }
  215. func (any *objectLazyAny) Keys() []string {
  216. any.fillCache()
  217. keys := make([]string, 0, len(any.cache))
  218. for key := range any.cache {
  219. keys = append(keys, key)
  220. }
  221. return keys
  222. }
  223. func (any *objectLazyAny) Size() int {
  224. any.fillCache()
  225. return len(any.cache)
  226. }
  227. func (any *objectLazyAny) IterateObject() (func() (string, Any, bool), bool) {
  228. if any.cache == nil {
  229. any.cache = map[string]Any{}
  230. }
  231. remaining := any.remaining
  232. if len(remaining) == len(any.buf) {
  233. iter := any.Parse()
  234. iter.head++
  235. c := iter.nextToken()
  236. if c != '}' {
  237. iter.unreadByte()
  238. k := string(iter.readObjectFieldAsBytes())
  239. v := iter.readAny(iter)
  240. any.cache[k] = v
  241. remaining = iter.buf[iter.head:]
  242. any.remaining = remaining
  243. } else {
  244. remaining = nil
  245. any.remaining = nil
  246. any.err = iter.Error
  247. return nil, false
  248. }
  249. }
  250. if len(any.cache) == 0 {
  251. return nil, false
  252. }
  253. keys := make([]string, 0, len(any.cache))
  254. values := make([]Any, 0, len(any.cache))
  255. for key, value := range any.cache {
  256. keys = append(keys, key)
  257. values = append(values, value)
  258. }
  259. nextKey := keys[0]
  260. nextValue := values[0]
  261. i := 1
  262. return func() (string, Any, bool) {
  263. key := nextKey
  264. value := nextValue
  265. if i < len(keys) {
  266. // read from cache
  267. nextKey = keys[i]
  268. nextValue = values[i]
  269. i++
  270. return key, value, true
  271. } else {
  272. // read from buffer
  273. iter := any.iter
  274. if iter == nil {
  275. iter = NewIterator()
  276. any.iter = iter
  277. }
  278. iter.ResetBytes(remaining)
  279. c := iter.nextToken()
  280. if c == ',' {
  281. nextKey = string(iter.readObjectFieldAsBytes())
  282. nextValue = iter.readAny(iter)
  283. any.cache[nextKey] = nextValue
  284. remaining = iter.buf[iter.head:]
  285. any.remaining = remaining
  286. any.err = iter.Error
  287. return key, value, true
  288. } else {
  289. remaining = nil
  290. any.remaining = nil
  291. any.err = iter.Error
  292. return key, value, false
  293. }
  294. }
  295. }, true
  296. }
  297. func (any *objectLazyAny) GetObject() map[string]Any {
  298. any.fillCache()
  299. return any.cache
  300. }
  301. func (any *objectLazyAny) SetObject(val map[string]Any) bool {
  302. any.fillCache()
  303. any.cache = val
  304. return true
  305. }
  306. func (any *objectLazyAny) WriteTo(stream *Stream) {
  307. if len(any.remaining) == len(any.buf) {
  308. // nothing has been parsed yet
  309. stream.Write(any.buf)
  310. } else {
  311. any.fillCache()
  312. stream.WriteVal(any.cache)
  313. }
  314. }
  315. func (any *objectLazyAny) GetInterface() interface{} {
  316. any.fillCache()
  317. return any.cache
  318. }
  319. type objectAny struct {
  320. baseAny
  321. err error
  322. cache map[string]Any
  323. val reflect.Value
  324. }
  325. func wrapStruct(val interface{}) *objectAny {
  326. return &objectAny{baseAny{}, nil, nil, reflect.ValueOf(val)}
  327. }
  328. func (any *objectAny) ValueType() ValueType {
  329. return Object
  330. }
  331. func (any *objectAny) Parse() *Iterator {
  332. return nil
  333. }
  334. func (any *objectAny) fillCacheUntil(target string) Any {
  335. if any.cache == nil {
  336. any.cache = map[string]Any{}
  337. }
  338. element, found := any.cache[target]
  339. if found {
  340. return element
  341. }
  342. for i := len(any.cache); i < any.val.NumField(); i++ {
  343. field := any.val.Field(i)
  344. fieldName := any.val.Type().Field(i).Name
  345. var element Any
  346. if field.CanInterface() {
  347. element = Wrap(field.Interface())
  348. } else {
  349. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", fieldName, any.cache)}
  350. }
  351. any.cache[fieldName] = element
  352. if fieldName == target {
  353. return element
  354. }
  355. }
  356. return nil
  357. }
  358. func (any *objectAny) fillCache() {
  359. if any.cache == nil {
  360. any.cache = map[string]Any{}
  361. }
  362. if len(any.cache) == any.val.NumField() {
  363. return
  364. }
  365. for i := 0; i < any.val.NumField(); i++ {
  366. field := any.val.Field(i)
  367. fieldName := any.val.Type().Field(i).Name
  368. var element Any
  369. if field.CanInterface() {
  370. element = Wrap(field.Interface())
  371. } else {
  372. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", fieldName, any.cache)}
  373. }
  374. any.cache[fieldName] = element
  375. }
  376. }
  377. func (any *objectAny) LastError() error {
  378. return any.err
  379. }
  380. func (any *objectAny) ToBool() bool {
  381. return any.val.NumField() != 0
  382. }
  383. func (any *objectAny) ToInt() int {
  384. if any.val.NumField() == 0 {
  385. return 0
  386. }
  387. return 1
  388. }
  389. func (any *objectAny) ToInt32() int32 {
  390. if any.val.NumField() == 0 {
  391. return 0
  392. }
  393. return 1
  394. }
  395. func (any *objectAny) ToInt64() int64 {
  396. if any.val.NumField() == 0 {
  397. return 0
  398. }
  399. return 1
  400. }
  401. func (any *objectAny) ToUint() uint {
  402. if any.val.NumField() == 0 {
  403. return 0
  404. }
  405. return 1
  406. }
  407. func (any *objectAny) ToUint32() uint32 {
  408. if any.val.NumField() == 0 {
  409. return 0
  410. }
  411. return 1
  412. }
  413. func (any *objectAny) ToUint64() uint64 {
  414. if any.val.NumField() == 0 {
  415. return 0
  416. }
  417. return 1
  418. }
  419. func (any *objectAny) ToFloat32() float32 {
  420. if any.val.NumField() == 0 {
  421. return 0
  422. }
  423. return 1
  424. }
  425. func (any *objectAny) ToFloat64() float64 {
  426. if any.val.NumField() == 0 {
  427. return 0
  428. }
  429. return 1
  430. }
  431. func (any *objectAny) ToString() string {
  432. if len(any.cache) == 0 {
  433. str, err := MarshalToString(any.val)
  434. any.err = err
  435. return str
  436. } else {
  437. any.fillCache()
  438. str, err := MarshalToString(any.cache)
  439. any.err = err
  440. return str
  441. }
  442. }
  443. func (any *objectAny) Get(path ...interface{}) Any {
  444. if len(path) == 0 {
  445. return any
  446. }
  447. var element Any
  448. key, ok := path[0].(string)
  449. if ok {
  450. element = any.fillCacheUntil(key)
  451. if element == nil {
  452. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", key, any.cache)}
  453. }
  454. } else {
  455. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", key, any.cache)}
  456. }
  457. if len(path) == 1 {
  458. return element
  459. } else {
  460. return element.Get(path[1:]...)
  461. }
  462. }
  463. func (any *objectAny) Keys() []string {
  464. any.fillCache()
  465. keys := make([]string, 0, len(any.cache))
  466. for key := range any.cache {
  467. keys = append(keys, key)
  468. }
  469. return keys
  470. }
  471. func (any *objectAny) Size() int {
  472. any.fillCache()
  473. return len(any.cache)
  474. }
  475. func (any *objectAny) IterateObject() (func() (string, Any, bool), bool) {
  476. if any.cache == nil {
  477. any.cache = map[string]Any{}
  478. }
  479. if any.val.NumField() == 0 {
  480. return nil, false
  481. }
  482. cacheKeys := make([]string, len(any.cache))
  483. i := 0
  484. for key := range any.cache {
  485. cacheKeys[i] = key
  486. i++
  487. }
  488. i = 0
  489. return func() (string, Any, bool) {
  490. if i == any.val.NumField() {
  491. return "", nil, false
  492. }
  493. var fieldName string
  494. var fieldValueAsAny Any
  495. if i == len(cacheKeys) {
  496. fieldName = any.val.Type().Field(i).Name
  497. fmt.Println(fieldName)
  498. cacheKeys = append(cacheKeys, fieldName)
  499. fieldValue := any.val.Field(i)
  500. if fieldValue.CanInterface() {
  501. fieldValueAsAny = Wrap(fieldValue.Interface())
  502. any.cache[fieldName] = fieldValueAsAny
  503. } else {
  504. fieldValueAsAny = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", fieldName, any.cache)}
  505. any.cache[fieldName] = fieldValueAsAny
  506. }
  507. } else {
  508. fieldName = cacheKeys[i]
  509. fieldValueAsAny = any.cache[fieldName]
  510. }
  511. i++
  512. return fieldName, fieldValueAsAny, i != any.val.NumField()
  513. }, true
  514. }
  515. func (any *objectAny) GetObject() map[string]Any {
  516. any.fillCache()
  517. return any.cache
  518. }
  519. func (any *objectAny) SetObject(val map[string]Any) bool {
  520. any.fillCache()
  521. any.cache = val
  522. return true
  523. }
  524. func (any *objectAny) WriteTo(stream *Stream) {
  525. if len(any.cache) == 0 {
  526. // nothing has been parsed yet
  527. stream.WriteVal(any.val)
  528. } else {
  529. any.fillCache()
  530. stream.WriteVal(any.cache)
  531. }
  532. }
  533. func (any *objectAny) GetInterface() interface{} {
  534. any.fillCache()
  535. return any.cache
  536. }
  537. type mapAny struct {
  538. baseAny
  539. err error
  540. cache map[string]Any
  541. val reflect.Value
  542. }
  543. func wrapMap(val interface{}) *mapAny {
  544. return &mapAny{baseAny{}, nil, nil, reflect.ValueOf(val)}
  545. }
  546. func (any *mapAny) ValueType() ValueType {
  547. return Object
  548. }
  549. func (any *mapAny) Parse() *Iterator {
  550. return nil
  551. }
  552. func (any *mapAny) fillCacheUntil(target string) Any {
  553. if any.cache == nil {
  554. any.cache = map[string]Any{}
  555. }
  556. element, found := any.cache[target]
  557. if found {
  558. return element
  559. }
  560. for _, key := range any.val.MapKeys() {
  561. keyAsStr := key.String()
  562. _, found := any.cache[keyAsStr]
  563. if found {
  564. continue
  565. }
  566. element := Wrap(any.val.MapIndex(key).Interface())
  567. any.cache[keyAsStr] = element
  568. if keyAsStr == target {
  569. return element
  570. }
  571. }
  572. return nil
  573. }
  574. func (any *mapAny) fillCache() {
  575. if any.cache == nil {
  576. any.cache = map[string]Any{}
  577. }
  578. if len(any.cache) == any.val.Len() {
  579. return
  580. }
  581. for _, key := range any.val.MapKeys() {
  582. keyAsStr := key.String()
  583. element := Wrap(any.val.MapIndex(key).Interface())
  584. any.cache[keyAsStr] = element
  585. }
  586. }
  587. func (any *mapAny) LastError() error {
  588. return any.err
  589. }
  590. func (any *mapAny) ToBool() bool {
  591. return any.val.Len() != 0
  592. }
  593. func (any *mapAny) ToInt() int {
  594. if any.val.Len() == 0 {
  595. return 0
  596. }
  597. return 1
  598. }
  599. func (any *mapAny) ToInt32() int32 {
  600. if any.val.Len() == 0 {
  601. return 0
  602. }
  603. return 1
  604. }
  605. func (any *mapAny) ToInt64() int64 {
  606. if any.val.Len() == 0 {
  607. return 0
  608. }
  609. return 1
  610. }
  611. func (any *mapAny) ToUint() uint {
  612. if any.val.Len() == 0 {
  613. return 0
  614. }
  615. return 1
  616. }
  617. func (any *mapAny) ToUint32() uint32 {
  618. if any.val.Len() == 0 {
  619. return 0
  620. }
  621. return 1
  622. }
  623. func (any *mapAny) ToUint64() uint64 {
  624. if any.val.Len() == 0 {
  625. return 0
  626. }
  627. return 1
  628. }
  629. func (any *mapAny) ToFloat32() float32 {
  630. if any.val.Len() == 0 {
  631. return 0
  632. }
  633. return 1
  634. }
  635. func (any *mapAny) ToFloat64() float64 {
  636. if any.val.Len() == 0 {
  637. return 0
  638. }
  639. return 1
  640. }
  641. func (any *mapAny) ToString() string {
  642. if len(any.cache) == 0 {
  643. str, err := MarshalToString(any.val)
  644. any.err = err
  645. return str
  646. } else {
  647. any.fillCache()
  648. str, err := MarshalToString(any.cache)
  649. any.err = err
  650. return str
  651. }
  652. }
  653. func (any *mapAny) Get(path ...interface{}) Any {
  654. if len(path) == 0 {
  655. return any
  656. }
  657. var element Any
  658. key, ok := path[0].(string)
  659. if ok {
  660. element = any.fillCacheUntil(key)
  661. if element == nil {
  662. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", key, any.cache)}
  663. }
  664. } else {
  665. element = &invalidAny{baseAny{}, fmt.Errorf("%v not found in %v", key, any.cache)}
  666. }
  667. if len(path) == 1 {
  668. return element
  669. } else {
  670. return element.Get(path[1:]...)
  671. }
  672. }
  673. func (any *mapAny) Keys() []string {
  674. any.fillCache()
  675. keys := make([]string, 0, len(any.cache))
  676. for key := range any.cache {
  677. keys = append(keys, key)
  678. }
  679. return keys
  680. }
  681. func (any *mapAny) Size() int {
  682. any.fillCache()
  683. return len(any.cache)
  684. }
  685. func (any *mapAny) IterateObject() (func() (string, Any, bool), bool) {
  686. any.fillCache()
  687. if len(any.cache) == 0 {
  688. return nil, false
  689. }
  690. keys := make([]string, len(any.cache))
  691. values := make([]Any, len(any.cache))
  692. i := 0
  693. for k, v := range any.cache {
  694. keys[i] = k
  695. values[i] = v
  696. i++
  697. }
  698. i = 0
  699. return func() (string, Any, bool) {
  700. if i == len(keys) {
  701. return "", nil, false
  702. }
  703. k := keys[i]
  704. v := values[i]
  705. i++
  706. return k, v, i != len(keys)
  707. }, true
  708. }
  709. func (any *mapAny) GetObject() map[string]Any {
  710. any.fillCache()
  711. return any.cache
  712. }
  713. func (any *mapAny) SetObject(val map[string]Any) bool {
  714. any.fillCache()
  715. any.cache = val
  716. return true
  717. }
  718. func (any *mapAny) WriteTo(stream *Stream) {
  719. if len(any.cache) == 0 {
  720. // nothing has been parsed yet
  721. stream.WriteVal(any.val)
  722. } else {
  723. any.fillCache()
  724. stream.WriteVal(any.cache)
  725. }
  726. }
  727. func (any *mapAny) GetInterface() interface{} {
  728. any.fillCache()
  729. return any.cache
  730. }