feature_any_array.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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. if any.cache == nil {
  27. any.cache = make([]Any, 0, 8)
  28. }
  29. i := len(any.cache)
  30. if target < i {
  31. return any.cache[target]
  32. }
  33. iter := any.parse()
  34. if (len(any.remaining) == len(any.buf)) {
  35. iter.head++
  36. c := iter.nextToken()
  37. if c != ']' {
  38. iter.unreadByte()
  39. element := iter.readAny(iter)
  40. any.cache = append(any.cache, element)
  41. if target == 0 {
  42. any.remaining = iter.buf[iter.head:]
  43. return element
  44. }
  45. i = 1
  46. } else {
  47. any.remaining = nil
  48. return nil
  49. }
  50. }
  51. for iter.nextToken() == ',' {
  52. element := iter.readAny(iter)
  53. any.cache = append(any.cache, element)
  54. if i == target {
  55. any.remaining = iter.buf[iter.head:]
  56. return element
  57. }
  58. i++
  59. }
  60. any.remaining = nil
  61. return nil
  62. }
  63. func (any *arrayLazyAny) fillCache() {
  64. if any.remaining == nil {
  65. return
  66. }
  67. if any.cache == nil {
  68. any.cache = make([]Any, 0, 8)
  69. }
  70. iter := any.parse()
  71. if len(any.remaining) == len(any.buf) {
  72. iter.head++
  73. c := iter.nextToken()
  74. if c != ']' {
  75. iter.unreadByte()
  76. any.cache = append(any.cache, iter.readAny(iter))
  77. } else {
  78. any.remaining = nil
  79. return
  80. }
  81. }
  82. for iter.nextToken() == ',' {
  83. any.cache = append(any.cache, iter.readAny(iter))
  84. }
  85. any.remaining = nil
  86. return
  87. }
  88. func (any *arrayLazyAny) LastError() error {
  89. return nil
  90. }
  91. func (any *arrayLazyAny) ToBool() bool {
  92. if any.cache == nil {
  93. any.IterateArray() // trigger first element read
  94. }
  95. return len(any.cache) != 0
  96. }
  97. func (any *arrayLazyAny) ToInt() int {
  98. if any.cache == nil {
  99. any.IterateArray() // trigger first element read
  100. }
  101. if len(any.cache) == 0 {
  102. return 0
  103. }
  104. return 1
  105. }
  106. func (any *arrayLazyAny) ToInt32() int32 {
  107. if any.cache == nil {
  108. any.IterateArray() // trigger first element read
  109. }
  110. if len(any.cache) == 0 {
  111. return 0
  112. }
  113. return 1
  114. }
  115. func (any *arrayLazyAny) ToInt64() int64 {
  116. if any.cache == nil {
  117. any.IterateArray() // trigger first element read
  118. }
  119. if len(any.cache) == 0 {
  120. return 0
  121. }
  122. return 1
  123. }
  124. func (any *arrayLazyAny) ToFloat32() float32 {
  125. if any.cache == nil {
  126. any.IterateArray() // trigger first element read
  127. }
  128. if len(any.cache) == 0 {
  129. return 0
  130. }
  131. return 1
  132. }
  133. func (any *arrayLazyAny) ToFloat64() float64 {
  134. if any.cache == nil {
  135. any.IterateArray() // trigger first element read
  136. }
  137. if len(any.cache) == 0 {
  138. return 0
  139. }
  140. return 1
  141. }
  142. func (any *arrayLazyAny) ToString() string {
  143. return ""
  144. }
  145. func (any *arrayLazyAny) Get(path ...interface{}) Any {
  146. if len(path) == 0 {
  147. return any
  148. }
  149. if len(path) == 1 {
  150. idx := path[0].(int)
  151. return any.fillCacheUntil(idx)
  152. } else {
  153. idx := path[0].(int)
  154. return any.fillCacheUntil(idx).Get(path[1:]...)
  155. }
  156. }
  157. func (any *arrayLazyAny) Size() int {
  158. any.fillCache()
  159. return len(any.cache)
  160. }
  161. func (any *arrayLazyAny) IterateArray() (func() (Any, bool), bool) {
  162. if any.cache == nil {
  163. any.cache = make([]Any, 0, 8)
  164. }
  165. remaining := any.remaining
  166. if len(remaining) == len(any.buf) {
  167. iter := any.parse()
  168. iter.head++
  169. c := iter.nextToken()
  170. if c != ']' {
  171. iter.unreadByte()
  172. v := iter.readAny(iter)
  173. any.cache = append(any.cache, v)
  174. remaining = iter.buf[iter.head:]
  175. any.remaining = remaining
  176. } else {
  177. remaining = nil
  178. any.remaining = nil
  179. return nil, false
  180. }
  181. }
  182. if len(any.cache) == 0 {
  183. return nil, false
  184. }
  185. arr := any.cache
  186. nextValue := arr[0]
  187. i := 1
  188. return func() (Any, bool) {
  189. value := nextValue
  190. if i < len(arr) {
  191. // read from cache
  192. nextValue = arr[i]
  193. i++
  194. return value, true
  195. } else {
  196. // read from buffer
  197. iter := any.iter
  198. if iter == nil {
  199. iter = NewIterator()
  200. any.iter = iter
  201. }
  202. iter.ResetBytes(remaining)
  203. c := iter.nextToken()
  204. if c == ',' {
  205. nextValue = iter.readAny(iter)
  206. any.cache = append(any.cache, nextValue)
  207. remaining = iter.buf[iter.head:]
  208. any.remaining = remaining
  209. return value, true
  210. } else {
  211. remaining = nil
  212. any.remaining = nil
  213. return value, false
  214. }
  215. }
  216. }, true
  217. }