feature_any_array.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package jsoniter
  2. import (
  3. "unsafe"
  4. )
  5. type arrayLazyAny struct {
  6. baseAny
  7. buf []byte
  8. iter *Iterator
  9. err error
  10. cache []Any
  11. remaining []byte
  12. }
  13. func (any *arrayLazyAny) Parse() *Iterator {
  14. iter := any.iter
  15. if iter == nil {
  16. iter = NewIterator()
  17. any.iter = iter
  18. }
  19. iter.ResetBytes(any.remaining)
  20. return iter
  21. }
  22. func (any *arrayLazyAny) fillCacheUntil(target int) Any {
  23. if any.remaining == nil {
  24. if target >= len(any.cache) {
  25. return nil
  26. }
  27. return any.cache[target]
  28. }
  29. if any.cache == nil {
  30. any.cache = make([]Any, 0, 8)
  31. }
  32. i := len(any.cache)
  33. if target < i {
  34. return any.cache[target]
  35. }
  36. iter := any.Parse()
  37. if (len(any.remaining) == len(any.buf)) {
  38. iter.head++
  39. c := iter.nextToken()
  40. if c != ']' {
  41. iter.unreadByte()
  42. element := iter.readAny(iter)
  43. any.cache = append(any.cache, element)
  44. if target == 0 {
  45. any.remaining = iter.buf[iter.head:]
  46. any.err = iter.Error
  47. return element
  48. }
  49. i = 1
  50. } else {
  51. any.remaining = nil
  52. any.err = iter.Error
  53. return nil
  54. }
  55. }
  56. for iter.nextToken() == ',' {
  57. element := iter.readAny(iter)
  58. any.cache = append(any.cache, element)
  59. if i == target {
  60. any.remaining = iter.buf[iter.head:]
  61. any.err = iter.Error
  62. return element
  63. }
  64. i++
  65. }
  66. any.remaining = nil
  67. any.err = iter.Error
  68. return nil
  69. }
  70. func (any *arrayLazyAny) fillCache() {
  71. if any.remaining == nil {
  72. return
  73. }
  74. if any.cache == nil {
  75. any.cache = make([]Any, 0, 8)
  76. }
  77. iter := any.Parse()
  78. if len(any.remaining) == len(any.buf) {
  79. iter.head++
  80. c := iter.nextToken()
  81. if c != ']' {
  82. iter.unreadByte()
  83. any.cache = append(any.cache, iter.readAny(iter))
  84. } else {
  85. any.remaining = nil
  86. any.err = iter.Error
  87. return
  88. }
  89. }
  90. for iter.nextToken() == ',' {
  91. any.cache = append(any.cache, iter.readAny(iter))
  92. }
  93. any.remaining = nil
  94. any.err = iter.Error
  95. }
  96. func (any *arrayLazyAny) LastError() error {
  97. return any.err
  98. }
  99. func (any *arrayLazyAny) ToBool() bool {
  100. if any.cache == nil {
  101. any.IterateArray() // trigger first element read
  102. }
  103. return len(any.cache) != 0
  104. }
  105. func (any *arrayLazyAny) ToInt() int {
  106. if any.cache == nil {
  107. any.IterateArray() // trigger first element read
  108. }
  109. if len(any.cache) == 0 {
  110. return 0
  111. }
  112. return 1
  113. }
  114. func (any *arrayLazyAny) ToInt32() int32 {
  115. if any.cache == nil {
  116. any.IterateArray() // trigger first element read
  117. }
  118. if len(any.cache) == 0 {
  119. return 0
  120. }
  121. return 1
  122. }
  123. func (any *arrayLazyAny) ToInt64() int64 {
  124. if any.cache == nil {
  125. any.IterateArray() // trigger first element read
  126. }
  127. if len(any.cache) == 0 {
  128. return 0
  129. }
  130. return 1
  131. }
  132. func (any *arrayLazyAny) ToFloat32() float32 {
  133. if any.cache == nil {
  134. any.IterateArray() // trigger first element read
  135. }
  136. if len(any.cache) == 0 {
  137. return 0
  138. }
  139. return 1
  140. }
  141. func (any *arrayLazyAny) ToFloat64() float64 {
  142. if any.cache == nil {
  143. any.IterateArray() // trigger first element read
  144. }
  145. if len(any.cache) == 0 {
  146. return 0
  147. }
  148. return 1
  149. }
  150. func (any *arrayLazyAny) ToString() string {
  151. if len(any.remaining) == len(any.buf) {
  152. // nothing has been parsed yet
  153. return *(*string)(unsafe.Pointer(&any.buf))
  154. } else {
  155. any.fillCache()
  156. str, err := MarshalToString(any.cache)
  157. any.err = err
  158. return str
  159. }
  160. }
  161. func (any *arrayLazyAny) Get(path ...interface{}) Any {
  162. if len(path) == 0 {
  163. return any
  164. }
  165. if len(path) == 1 {
  166. idx := path[0].(int)
  167. return any.fillCacheUntil(idx)
  168. } else {
  169. idx := path[0].(int)
  170. return any.fillCacheUntil(idx).Get(path[1:]...)
  171. }
  172. }
  173. func (any *arrayLazyAny) Size() int {
  174. any.fillCache()
  175. return len(any.cache)
  176. }
  177. func (any *arrayLazyAny) IterateArray() (func() (Any, bool), bool) {
  178. if any.cache == nil {
  179. any.cache = make([]Any, 0, 8)
  180. }
  181. remaining := any.remaining
  182. if len(remaining) == len(any.buf) {
  183. iter := any.Parse()
  184. iter.head++
  185. c := iter.nextToken()
  186. if c != ']' {
  187. iter.unreadByte()
  188. v := iter.readAny(iter)
  189. any.cache = append(any.cache, v)
  190. remaining = iter.buf[iter.head:]
  191. any.remaining = remaining
  192. } else {
  193. remaining = nil
  194. any.remaining = nil
  195. any.err = iter.Error
  196. return nil, false
  197. }
  198. }
  199. if len(any.cache) == 0 {
  200. return nil, false
  201. }
  202. arr := any.cache
  203. nextValue := arr[0]
  204. i := 1
  205. return func() (Any, bool) {
  206. value := nextValue
  207. if i < len(arr) {
  208. // read from cache
  209. nextValue = arr[i]
  210. i++
  211. return value, true
  212. } else {
  213. // read from buffer
  214. iter := any.iter
  215. if iter == nil {
  216. iter = NewIterator()
  217. any.iter = iter
  218. }
  219. iter.ResetBytes(remaining)
  220. c := iter.nextToken()
  221. if c == ',' {
  222. nextValue = iter.readAny(iter)
  223. any.cache = append(any.cache, nextValue)
  224. remaining = iter.buf[iter.head:]
  225. any.remaining = remaining
  226. any.err = iter.Error
  227. return value, true
  228. } else {
  229. remaining = nil
  230. any.remaining = nil
  231. any.err = iter.Error
  232. return value, false
  233. }
  234. }
  235. }, true
  236. }
  237. func (any *arrayLazyAny) GetArray() []Any {
  238. any.fillCache()
  239. return any.cache
  240. }
  241. func (any *arrayLazyAny) SetArray(newList []Any) bool {
  242. any.fillCache()
  243. any.cache = newList
  244. return true
  245. }
  246. func (any *arrayLazyAny) WriteTo(stream *Stream) {
  247. if len(any.remaining) == len(any.buf) {
  248. // nothing has been parsed yet
  249. stream.Write(any.buf)
  250. } else {
  251. any.fillCache()
  252. stream.WriteVal(any.cache)
  253. }
  254. }
  255. func (any *arrayLazyAny) GetInterface() interface{} {
  256. any.fillCache()
  257. return any.cache
  258. }