@@ -18,8 +18,8 @@ pub type Map = HashMap<String, Value>;
18
18
/// owned memory whereever required thus returning a value without
19
19
/// a lifetime.
20
20
pub fn to_value ( s : & mut [ u8 ] ) -> Result < Value > {
21
- let mut deserializer = stry ! ( Deserializer :: from_slice( s) ) ;
22
- deserializer . parse_value_owned_root ( )
21
+ let de = stry ! ( Deserializer :: from_slice( s) ) ;
22
+ OwnedDeserializer :: from_deserializer ( de ) . parse ( )
23
23
}
24
24
25
25
#[ derive( Debug , PartialEq , Clone ) ]
@@ -170,84 +170,81 @@ impl Default for Value {
170
170
}
171
171
}
172
172
173
- impl < ' de > Deserializer < ' de > {
173
+ struct OwnedDeserializer < ' de > {
174
+ de : Deserializer < ' de > ,
175
+ }
176
+
177
+ impl < ' de > OwnedDeserializer < ' de > {
178
+ pub fn from_deserializer ( de : Deserializer < ' de > ) -> Self {
179
+ Self { de }
180
+ }
174
181
#[ cfg_attr( not( feature = "no-inline" ) , inline( always) ) ]
175
- pub fn parse_value_owned_root ( & mut self ) -> Result < Value > {
176
- #[ cfg( feature = "paranoid" ) ]
177
- {
178
- if self . idx + 1 > self . structural_indexes . len ( ) {
179
- return Err ( self . error ( ErrorType :: UnexpectedEnd ) ) ;
180
- }
181
- }
182
- match self . next_ ( ) {
182
+ pub fn parse ( & mut self ) -> Result < Value > {
183
+ match self . de . next_ ( ) {
183
184
b'"' => {
184
- let next = unsafe { * self . structural_indexes . get_unchecked ( self . idx + 1 ) as usize } ;
185
- if next - self . iidx < 32 {
186
- return self . parse_short_str_ ( ) . map ( Value :: from) ;
185
+ let next =
186
+ unsafe { * self . de . structural_indexes . get_unchecked ( self . de . idx + 1 ) as usize } ;
187
+ if next - self . de . iidx < 32 {
188
+ return self . de . parse_short_str_ ( ) . map ( Value :: from) ;
187
189
}
188
- self . parse_str_ ( ) . map ( Value :: from)
190
+ self . de . parse_str_ ( ) . map ( Value :: from)
189
191
}
190
192
b'n' => Ok ( Value :: Null ) ,
191
193
b't' => Ok ( Value :: Bool ( true ) ) ,
192
194
b'f' => Ok ( Value :: Bool ( false ) ) ,
193
- b'-' => self . parse_number_root ( true ) . map ( Value :: from) ,
194
- b'0' ..=b'9' => self . parse_number_root ( false ) . map ( Value :: from) ,
195
- b'[' => self . parse_array_owned ( ) ,
196
- b'{' => self . parse_map_owned ( ) ,
197
- _c => Err ( self . error ( ErrorType :: UnexpectedCharacter ) ) ,
195
+ b'-' => self . de . parse_number_root ( true ) . map ( Value :: from) ,
196
+ b'0' ..=b'9' => self . de . parse_number_root ( false ) . map ( Value :: from) ,
197
+ b'[' => self . parse_array ( ) ,
198
+ b'{' => self . parse_map ( ) ,
199
+ _c => Err ( self . de . error ( ErrorType :: UnexpectedCharacter ) ) ,
198
200
}
199
201
}
200
202
201
203
#[ cfg_attr( not( feature = "no-inline" ) , inline( always) ) ]
202
- fn parse_value_owned ( & mut self ) -> Result < Value > {
203
- #[ cfg( feature = "paranoid" ) ]
204
- {
205
- if self . idx + 1 > self . structural_indexes . len ( ) {
206
- return Err ( self . error ( ErrorType :: UnexpectedEnd ) ) ;
207
- }
208
- }
209
- match self . next_ ( ) {
204
+ fn parse_value ( & mut self ) -> Result < Value > {
205
+ match self . de . next_ ( ) {
210
206
b'"' => {
211
- let next = unsafe { * self . structural_indexes . get_unchecked ( self . idx + 1 ) as usize } ;
212
- if next - self . iidx < 32 {
213
- return self . parse_short_str_ ( ) . map ( Value :: from) ;
207
+ let next =
208
+ unsafe { * self . de . structural_indexes . get_unchecked ( self . de . idx + 1 ) as usize } ;
209
+ if next - self . de . iidx < 32 {
210
+ return self . de . parse_short_str_ ( ) . map ( Value :: from) ;
214
211
}
215
- self . parse_str_ ( ) . map ( Value :: from)
212
+ self . de . parse_str_ ( ) . map ( Value :: from)
216
213
}
217
214
b'n' => Ok ( Value :: Null ) ,
218
215
b't' => Ok ( Value :: Bool ( true ) ) ,
219
216
b'f' => Ok ( Value :: Bool ( false ) ) ,
220
- b'-' => self . parse_number ( true ) . map ( Value :: from) ,
221
- b'0' ..=b'9' => self . parse_number ( false ) . map ( Value :: from) ,
222
- b'[' => self . parse_array_owned ( ) ,
223
- b'{' => self . parse_map_owned ( ) ,
224
- _c => Err ( self . error ( ErrorType :: UnexpectedCharacter ) ) ,
217
+ b'-' => self . de . parse_number ( true ) . map ( Value :: from) ,
218
+ b'0' ..=b'9' => self . de . parse_number ( false ) . map ( Value :: from) ,
219
+ b'[' => self . parse_array ( ) ,
220
+ b'{' => self . parse_map ( ) ,
221
+ _c => Err ( self . de . error ( ErrorType :: UnexpectedCharacter ) ) ,
225
222
}
226
223
}
227
224
228
225
#[ cfg_attr( not( feature = "no-inline" ) , inline( always) ) ]
229
- fn parse_array_owned ( & mut self ) -> Result < Value > {
230
- let es = self . count_elements ( ) ;
226
+ fn parse_array ( & mut self ) -> Result < Value > {
227
+ let es = self . de . count_elements ( ) ;
231
228
if unlikely ! ( es == 0 ) {
232
- self . skip ( ) ;
229
+ self . de . skip ( ) ;
233
230
return Ok ( Value :: Array ( Vec :: new ( ) ) ) ;
234
231
}
235
232
let mut res = Vec :: with_capacity ( es) ;
236
233
237
234
for _i in 0 ..es {
238
- res. push ( stry ! ( self . parse_value_owned ( ) ) ) ;
239
- self . skip ( ) ;
235
+ res. push ( stry ! ( self . parse_value ( ) ) ) ;
236
+ self . de . skip ( ) ;
240
237
}
241
238
Ok ( Value :: Array ( res) )
242
239
}
243
240
244
241
#[ cfg_attr( not( feature = "no-inline" ) , inline( always) ) ]
245
- fn parse_map_owned ( & mut self ) -> Result < Value > {
242
+ fn parse_map ( & mut self ) -> Result < Value > {
246
243
// We short cut for empty arrays
247
- let es = self . count_elements ( ) ;
244
+ let es = self . de . count_elements ( ) ;
248
245
249
246
if unlikely ! ( es == 0 ) {
250
- self . skip ( ) ;
247
+ self . de . skip ( ) ;
251
248
return Ok ( Value :: Object ( Map :: new ( ) ) ) ;
252
249
}
253
250
@@ -257,13 +254,13 @@ impl<'de> Deserializer<'de> {
257
254
// element so we eat this
258
255
259
256
for _ in 0 ..es {
260
- self . skip ( ) ;
261
- let key = stry ! ( self . parse_short_str_( ) ) ;
257
+ self . de . skip ( ) ;
258
+ let key = stry ! ( self . de . parse_short_str_( ) ) ;
262
259
// We have to call parse short str twice since parse_short_str
263
260
// does not move the cursor forward
264
- self . skip ( ) ;
265
- res. insert_nocheck ( key. into ( ) , stry ! ( self . parse_value_owned ( ) ) ) ;
266
- self . skip ( ) ;
261
+ self . de . skip ( ) ;
262
+ res. insert_nocheck ( key. into ( ) , stry ! ( self . parse_value ( ) ) ) ;
263
+ self . de . skip ( ) ;
267
264
}
268
265
Ok ( Value :: Object ( res) )
269
266
}
0 commit comments