feature_any_array.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package jsoniter
  2. type arrayLazyAny struct {
  3. baseAny
  4. buf []byte
  5. iter *Iterator
  6. err error
  7. cache []Any
  8. remaining []byte
  9. }
  10. func (any *arrayLazyAny) parse() *Iterator {
  11. iter := any.iter
  12. if iter == nil {
  13. iter = NewIterator()
  14. any.iter = iter
  15. }
  16. iter.ResetBytes(any.remaining)
  17. return iter
  18. }
  19. func (any *arrayLazyAny) fillCacheUntil(target int) Any {
  20. if any.remaining == nil {
  21. if target >= len(any.cache) {
  22. return nil
  23. }
  24. return any.cache[target]
  25. }
  26. i := len(any.cache)
  27. if target < i {
  28. return any.cache[target]
  29. }
  30. iter := any.parse()
  31. if (len(any.remaining) == len(any.buf)) {
  32. iter.head++
  33. c := iter.nextToken()
  34. if c != ']' {
  35. iter.unreadByte()
  36. element := iter.readAny(iter)
  37. any.cache = append(any.cache, element)
  38. if target == 0 {
  39. any.remaining = iter.buf[iter.head:]
  40. return element
  41. }
  42. i = 1
  43. } else {
  44. any.remaining = nil
  45. return nil
  46. }
  47. }
  48. for iter.nextToken() == ',' {
  49. element := iter.readAny(iter)
  50. any.cache = append(any.cache, element)
  51. if i == target {
  52. any.remaining = iter.buf[iter.head:]
  53. return element
  54. }
  55. i++
  56. }
  57. any.remaining = nil
  58. return nil
  59. }
  60. func (any *arrayLazyAny) fillCache() {
  61. if any.remaining == nil {
  62. return
  63. }
  64. iter := any.parse()
  65. if len(any.remaining) == len(any.buf) {
  66. iter.head++
  67. c := iter.nextToken()
  68. if c != ']' {
  69. iter.unreadByte()
  70. any.cache = append(any.cache, iter.readAny(iter))
  71. } else {
  72. any.remaining = nil
  73. return
  74. }
  75. }
  76. for iter.nextToken() == ',' {
  77. any.cache = append(any.cache, iter.readAny(iter))
  78. }
  79. any.remaining = nil
  80. return
  81. }
  82. func (any *arrayLazyAny) LastError() error {
  83. return nil
  84. }
  85. func (any *arrayLazyAny) ToBool() bool {
  86. return false
  87. }
  88. func (any *arrayLazyAny) ToInt() int {
  89. return 0
  90. }
  91. func (any *arrayLazyAny) ToInt32() int32 {
  92. return 0
  93. }
  94. func (any *arrayLazyAny) ToInt64() int64 {
  95. return 0
  96. }
  97. func (any *arrayLazyAny) ToFloat32() float32 {
  98. return 0
  99. }
  100. func (any *arrayLazyAny) ToFloat64() float64 {
  101. return 0
  102. }
  103. func (any *arrayLazyAny) ToString() string {
  104. return ""
  105. }
  106. func (any *arrayLazyAny) Get(path ...interface{}) Any {
  107. idx := path[0].(int)
  108. return any.fillCacheUntil(idx)
  109. }
  110. func (any *arrayLazyAny) Size() int {
  111. any.fillCache()
  112. return len(any.cache)
  113. }
  114. func (any *arrayLazyAny) IterateArray() (func() (Any, bool), bool) {
  115. remaining := any.remaining
  116. if len(remaining) == len(any.buf) {
  117. iter := any.parse()
  118. iter.head++
  119. c := iter.nextToken()
  120. if c != ']' {
  121. iter.unreadByte()
  122. v := iter.readAny(iter)
  123. any.cache = append(any.cache, v)
  124. remaining = iter.buf[iter.head:]
  125. any.remaining = remaining
  126. } else {
  127. remaining = nil
  128. any.remaining = nil
  129. return nil, false
  130. }
  131. }
  132. if len(any.cache) == 0 {
  133. return nil, false
  134. }
  135. arr := any.cache
  136. nextValue := arr[0]
  137. i := 1
  138. return func() (Any, bool) {
  139. value := nextValue
  140. if i < len(arr) {
  141. // read from cache
  142. nextValue = arr[i]
  143. i++
  144. return value, true
  145. } else {
  146. // read from buffer
  147. iter := any.iter
  148. if iter == nil {
  149. iter = NewIterator()
  150. any.iter = iter
  151. }
  152. iter.ResetBytes(remaining)
  153. c := iter.nextToken()
  154. if c == ',' {
  155. nextValue = iter.readAny(iter)
  156. any.cache = append(any.cache, nextValue)
  157. remaining = iter.buf[iter.head:]
  158. any.remaining = remaining
  159. return value, true
  160. } else {
  161. remaining = nil
  162. any.remaining = nil
  163. return value, false
  164. }
  165. }
  166. }, true
  167. }