diff options
Diffstat (limited to 'vendor/github.com/json-iterator/go/any_array.go')
-rw-r--r-- | vendor/github.com/json-iterator/go/any_array.go | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/vendor/github.com/json-iterator/go/any_array.go b/vendor/github.com/json-iterator/go/any_array.go new file mode 100644 index 0000000..0449e9a --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_array.go | |||
@@ -0,0 +1,278 @@ | |||
1 | package jsoniter | ||
2 | |||
3 | import ( | ||
4 | "reflect" | ||
5 | "unsafe" | ||
6 | ) | ||
7 | |||
8 | type arrayLazyAny struct { | ||
9 | baseAny | ||
10 | cfg *frozenConfig | ||
11 | buf []byte | ||
12 | err error | ||
13 | } | ||
14 | |||
15 | func (any *arrayLazyAny) ValueType() ValueType { | ||
16 | return ArrayValue | ||
17 | } | ||
18 | |||
19 | func (any *arrayLazyAny) MustBeValid() Any { | ||
20 | return any | ||
21 | } | ||
22 | |||
23 | func (any *arrayLazyAny) LastError() error { | ||
24 | return any.err | ||
25 | } | ||
26 | |||
27 | func (any *arrayLazyAny) ToBool() bool { | ||
28 | iter := any.cfg.BorrowIterator(any.buf) | ||
29 | defer any.cfg.ReturnIterator(iter) | ||
30 | return iter.ReadArray() | ||
31 | } | ||
32 | |||
33 | func (any *arrayLazyAny) ToInt() int { | ||
34 | if any.ToBool() { | ||
35 | return 1 | ||
36 | } | ||
37 | return 0 | ||
38 | } | ||
39 | |||
40 | func (any *arrayLazyAny) ToInt32() int32 { | ||
41 | if any.ToBool() { | ||
42 | return 1 | ||
43 | } | ||
44 | return 0 | ||
45 | } | ||
46 | |||
47 | func (any *arrayLazyAny) ToInt64() int64 { | ||
48 | if any.ToBool() { | ||
49 | return 1 | ||
50 | } | ||
51 | return 0 | ||
52 | } | ||
53 | |||
54 | func (any *arrayLazyAny) ToUint() uint { | ||
55 | if any.ToBool() { | ||
56 | return 1 | ||
57 | } | ||
58 | return 0 | ||
59 | } | ||
60 | |||
61 | func (any *arrayLazyAny) ToUint32() uint32 { | ||
62 | if any.ToBool() { | ||
63 | return 1 | ||
64 | } | ||
65 | return 0 | ||
66 | } | ||
67 | |||
68 | func (any *arrayLazyAny) ToUint64() uint64 { | ||
69 | if any.ToBool() { | ||
70 | return 1 | ||
71 | } | ||
72 | return 0 | ||
73 | } | ||
74 | |||
75 | func (any *arrayLazyAny) ToFloat32() float32 { | ||
76 | if any.ToBool() { | ||
77 | return 1 | ||
78 | } | ||
79 | return 0 | ||
80 | } | ||
81 | |||
82 | func (any *arrayLazyAny) ToFloat64() float64 { | ||
83 | if any.ToBool() { | ||
84 | return 1 | ||
85 | } | ||
86 | return 0 | ||
87 | } | ||
88 | |||
89 | func (any *arrayLazyAny) ToString() string { | ||
90 | return *(*string)(unsafe.Pointer(&any.buf)) | ||
91 | } | ||
92 | |||
93 | func (any *arrayLazyAny) ToVal(val interface{}) { | ||
94 | iter := any.cfg.BorrowIterator(any.buf) | ||
95 | defer any.cfg.ReturnIterator(iter) | ||
96 | iter.ReadVal(val) | ||
97 | } | ||
98 | |||
99 | func (any *arrayLazyAny) Get(path ...interface{}) Any { | ||
100 | if len(path) == 0 { | ||
101 | return any | ||
102 | } | ||
103 | switch firstPath := path[0].(type) { | ||
104 | case int: | ||
105 | iter := any.cfg.BorrowIterator(any.buf) | ||
106 | defer any.cfg.ReturnIterator(iter) | ||
107 | valueBytes := locateArrayElement(iter, firstPath) | ||
108 | if valueBytes == nil { | ||
109 | return newInvalidAny(path) | ||
110 | } | ||
111 | iter.ResetBytes(valueBytes) | ||
112 | return locatePath(iter, path[1:]) | ||
113 | case int32: | ||
114 | if '*' == firstPath { | ||
115 | iter := any.cfg.BorrowIterator(any.buf) | ||
116 | defer any.cfg.ReturnIterator(iter) | ||
117 | arr := make([]Any, 0) | ||
118 | iter.ReadArrayCB(func(iter *Iterator) bool { | ||
119 | found := iter.readAny().Get(path[1:]...) | ||
120 | if found.ValueType() != InvalidValue { | ||
121 | arr = append(arr, found) | ||
122 | } | ||
123 | return true | ||
124 | }) | ||
125 | return wrapArray(arr) | ||
126 | } | ||
127 | return newInvalidAny(path) | ||
128 | default: | ||
129 | return newInvalidAny(path) | ||
130 | } | ||
131 | } | ||
132 | |||
133 | func (any *arrayLazyAny) Size() int { | ||
134 | size := 0 | ||
135 | iter := any.cfg.BorrowIterator(any.buf) | ||
136 | defer any.cfg.ReturnIterator(iter) | ||
137 | iter.ReadArrayCB(func(iter *Iterator) bool { | ||
138 | size++ | ||
139 | iter.Skip() | ||
140 | return true | ||
141 | }) | ||
142 | return size | ||
143 | } | ||
144 | |||
145 | func (any *arrayLazyAny) WriteTo(stream *Stream) { | ||
146 | stream.Write(any.buf) | ||
147 | } | ||
148 | |||
149 | func (any *arrayLazyAny) GetInterface() interface{} { | ||
150 | iter := any.cfg.BorrowIterator(any.buf) | ||
151 | defer any.cfg.ReturnIterator(iter) | ||
152 | return iter.Read() | ||
153 | } | ||
154 | |||
155 | type arrayAny struct { | ||
156 | baseAny | ||
157 | val reflect.Value | ||
158 | } | ||
159 | |||
160 | func wrapArray(val interface{}) *arrayAny { | ||
161 | return &arrayAny{baseAny{}, reflect.ValueOf(val)} | ||
162 | } | ||
163 | |||
164 | func (any *arrayAny) ValueType() ValueType { | ||
165 | return ArrayValue | ||
166 | } | ||
167 | |||
168 | func (any *arrayAny) MustBeValid() Any { | ||
169 | return any | ||
170 | } | ||
171 | |||
172 | func (any *arrayAny) LastError() error { | ||
173 | return nil | ||
174 | } | ||
175 | |||
176 | func (any *arrayAny) ToBool() bool { | ||
177 | return any.val.Len() != 0 | ||
178 | } | ||
179 | |||
180 | func (any *arrayAny) ToInt() int { | ||
181 | if any.val.Len() == 0 { | ||
182 | return 0 | ||
183 | } | ||
184 | return 1 | ||
185 | } | ||
186 | |||
187 | func (any *arrayAny) ToInt32() int32 { | ||
188 | if any.val.Len() == 0 { | ||
189 | return 0 | ||
190 | } | ||
191 | return 1 | ||
192 | } | ||
193 | |||
194 | func (any *arrayAny) ToInt64() int64 { | ||
195 | if any.val.Len() == 0 { | ||
196 | return 0 | ||
197 | } | ||
198 | return 1 | ||
199 | } | ||
200 | |||
201 | func (any *arrayAny) ToUint() uint { | ||
202 | if any.val.Len() == 0 { | ||
203 | return 0 | ||
204 | } | ||
205 | return 1 | ||
206 | } | ||
207 | |||
208 | func (any *arrayAny) ToUint32() uint32 { | ||
209 | if any.val.Len() == 0 { | ||
210 | return 0 | ||
211 | } | ||
212 | return 1 | ||
213 | } | ||
214 | |||
215 | func (any *arrayAny) ToUint64() uint64 { | ||
216 | if any.val.Len() == 0 { | ||
217 | return 0 | ||
218 | } | ||
219 | return 1 | ||
220 | } | ||
221 | |||
222 | func (any *arrayAny) ToFloat32() float32 { | ||
223 | if any.val.Len() == 0 { | ||
224 | return 0 | ||
225 | } | ||
226 | return 1 | ||
227 | } | ||
228 | |||
229 | func (any *arrayAny) ToFloat64() float64 { | ||
230 | if any.val.Len() == 0 { | ||
231 | return 0 | ||
232 | } | ||
233 | return 1 | ||
234 | } | ||
235 | |||
236 | func (any *arrayAny) ToString() string { | ||
237 | str, _ := MarshalToString(any.val.Interface()) | ||
238 | return str | ||
239 | } | ||
240 | |||
241 | func (any *arrayAny) Get(path ...interface{}) Any { | ||
242 | if len(path) == 0 { | ||
243 | return any | ||
244 | } | ||
245 | switch firstPath := path[0].(type) { | ||
246 | case int: | ||
247 | if firstPath < 0 || firstPath >= any.val.Len() { | ||
248 | return newInvalidAny(path) | ||
249 | } | ||
250 | return Wrap(any.val.Index(firstPath).Interface()) | ||
251 | case int32: | ||
252 | if '*' == firstPath { | ||
253 | mappedAll := make([]Any, 0) | ||
254 | for i := 0; i < any.val.Len(); i++ { | ||
255 | mapped := Wrap(any.val.Index(i).Interface()).Get(path[1:]...) | ||
256 | if mapped.ValueType() != InvalidValue { | ||
257 | mappedAll = append(mappedAll, mapped) | ||
258 | } | ||
259 | } | ||
260 | return wrapArray(mappedAll) | ||
261 | } | ||
262 | return newInvalidAny(path) | ||
263 | default: | ||
264 | return newInvalidAny(path) | ||
265 | } | ||
266 | } | ||
267 | |||
268 | func (any *arrayAny) Size() int { | ||
269 | return any.val.Len() | ||
270 | } | ||
271 | |||
272 | func (any *arrayAny) WriteTo(stream *Stream) { | ||
273 | stream.WriteVal(any.val) | ||
274 | } | ||
275 | |||
276 | func (any *arrayAny) GetInterface() interface{} { | ||
277 | return any.val.Interface() | ||
278 | } | ||