feature_any_array.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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. if len(path) == 0 {
  108. return any
  109. }
  110. if len(path) == 1 {
  111. idx := path[0].(int)
  112. return any.fillCacheUntil(idx)
  113. } else {
  114. idx := path[0].(int)
  115. return any.fillCacheUntil(idx).Get(path[1:]...)
  116. }
  117. }
  118. func (any *arrayLazyAny) Size() int {
  119. any.fillCache()
  120. return len(any.cache)
  121. }
  122. func (any *arrayLazyAny) IterateArray() (func() (Any, bool), bool) {
  123. remaining := any.remaining
  124. if len(remaining) == len(any.buf) {
  125. iter := any.parse()
  126. iter.head++
  127. c := iter.nextToken()
  128. if c != ']' {
  129. iter.unreadByte()
  130. v := iter.readAny(iter)
  131. any.cache = append(any.cache, v)
  132. remaining = iter.buf[iter.head:]
  133. any.remaining = remaining
  134. } else {
  135. remaining = nil
  136. any.remaining = nil
  137. return nil, false
  138. }
  139. }
  140. if len(any.cache) == 0 {
  141. return nil, false
  142. }
  143. arr := any.cache
  144. nextValue := arr[0]
  145. i := 1
  146. return func() (Any, bool) {
  147. value := nextValue
  148. if i < len(arr) {
  149. // read from cache
  150. nextValue = arr[i]
  151. i++
  152. return value, true
  153. } else {
  154. // read from buffer
  155. iter := any.iter
  156. if iter == nil {
  157. iter = NewIterator()
  158. any.iter = iter
  159. }
  160. iter.ResetBytes(remaining)
  161. c := iter.nextToken()
  162. if c == ',' {
  163. nextValue = iter.readAny(iter)
  164. any.cache = append(any.cache, nextValue)
  165. remaining = iter.buf[iter.head:]
  166. any.remaining = remaining
  167. return value, true
  168. } else {
  169. remaining = nil
  170. any.remaining = nil
  171. return value, false
  172. }
  173. }
  174. }, true
  175. }