Skip to content

Commit 53afeb4

Browse files
authored
Re-factor out different deserializers (#28)
1 parent e70a931 commit 53afeb4

File tree

2 files changed

+90
-86
lines changed

2 files changed

+90
-86
lines changed

src/value/borrowed.rs

Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ pub type Map<'v> = HashMap<Cow<'v, str>, Value<'v>>;
1818
/// As we reference parts of the input slice the resulting dom
1919
/// has the dame lifetime as the slice it was created from.
2020
pub fn to_value<'v>(s: &'v mut [u8]) -> Result<Value<'v>> {
21-
let mut deserializer = stry!(Deserializer::from_slice(s));
22-
deserializer.parse_value_borrowed_root()
21+
let de = stry!(Deserializer::from_slice(s));
22+
BorrowDeserializer::from_deserializer(de).parse()
2323
}
2424

2525
#[derive(Debug, PartialEq, Clone)]
@@ -170,72 +170,79 @@ impl<'v> Default for Value<'v> {
170170
}
171171
}
172172

173-
impl<'de> Deserializer<'de> {
173+
struct BorrowDeserializer<'de> {
174+
de: Deserializer<'de>,
175+
}
176+
impl<'de> BorrowDeserializer<'de> {
177+
pub fn from_deserializer(de: Deserializer<'de>) -> Self {
178+
Self { de }
179+
}
180+
174181
#[cfg_attr(not(feature = "no-inline"), inline(always))]
175-
pub fn parse_value_borrowed_root(&mut self) -> Result<Value<'de>> {
176-
match self.next_() {
182+
pub fn parse(&mut self) -> Result<Value<'de>> {
183+
match self.de.next_() {
177184
b'"' => {
178-
if self.count_elements() < 32 {
179-
return self.parse_short_str_().map(Value::from);
185+
if self.de.count_elements() < 32 {
186+
return self.de.parse_short_str_().map(Value::from);
180187
}
181-
self.parse_str_().map(Value::from)
188+
self.de.parse_str_().map(Value::from)
182189
}
183-
b'-' => self.parse_number_root(true).map(Value::from),
184-
b'0'..=b'9' => self.parse_number_root(false).map(Value::from),
190+
b'-' => self.de.parse_number_root(true).map(Value::from),
191+
b'0'..=b'9' => self.de.parse_number_root(false).map(Value::from),
185192
b'n' => Ok(Value::Null),
186193
b't' => Ok(Value::Bool(true)),
187194
b'f' => Ok(Value::Bool(false)),
188-
b'[' => self.parse_array_borrowed(),
189-
b'{' => self.parse_map_borrowed(),
190-
_c => Err(self.error(ErrorType::UnexpectedCharacter)),
195+
b'[' => self.parse_array(),
196+
b'{' => self.parse_map(),
197+
_c => Err(self.de.error(ErrorType::UnexpectedCharacter)),
191198
}
192199
}
193200

194201
#[cfg_attr(not(feature = "no-inline"), inline(always))]
195-
fn parse_value_borrowed(&mut self) -> Result<Value<'de>> {
196-
match self.next_() {
202+
fn parse_value(&mut self) -> Result<Value<'de>> {
203+
match self.de.next_() {
197204
b'"' => {
198205
// We can only have entered this by being in an object so we know there is
199206
// something following as we made sure during checking for sizes.;
200-
if self.count_elements() < 32 {
201-
return self.parse_short_str_().map(Value::from);
207+
if self.de.count_elements() < 32 {
208+
return self.de.parse_short_str_().map(Value::from);
202209
}
203-
self.parse_str_().map(Value::from)
210+
self.de.parse_str_().map(Value::from)
204211
}
205-
b'-' => self.parse_number_(true).map(Value::from),
206-
b'0'..=b'9' => self.parse_number_(false).map(Value::from),
212+
b'-' => self.de.parse_number_(true).map(Value::from),
213+
b'0'..=b'9' => self.de.parse_number_(false).map(Value::from),
207214
b'n' => Ok(Value::Null),
208215
b't' => Ok(Value::Bool(true)),
209216
b'f' => Ok(Value::Bool(false)),
210-
b'[' => self.parse_array_borrowed(),
211-
b'{' => self.parse_map_borrowed(),
212-
_c => Err(self.error(ErrorType::UnexpectedCharacter)),
217+
b'[' => self.parse_array(),
218+
b'{' => self.parse_map(),
219+
_c => Err(self.de.error(ErrorType::UnexpectedCharacter)),
213220
}
214221
}
215222

216223
#[cfg_attr(not(feature = "no-inline"), inline(always))]
217-
fn parse_array_borrowed(&mut self) -> Result<Value<'de>> {
218-
let es = self.count_elements();
224+
fn parse_array(&mut self) -> Result<Value<'de>> {
225+
let es = self.de.count_elements();
219226
if unlikely!(es == 0) {
220-
self.skip();
227+
self.de.skip();
221228
return Ok(Value::Array(Vec::new()));
222229
}
223230
let mut res = Vec::with_capacity(es);
224231

225232
for _i in 0..es {
226-
res.push(stry!(self.parse_value_borrowed()));
227-
self.skip();
233+
res.push(stry!(self.parse_value()));
234+
self.de.skip();
228235
}
229236
Ok(Value::Array(res))
230237
}
231238

232239
#[cfg_attr(not(feature = "no-inline"), inline(always))]
233-
fn parse_map_borrowed(&mut self) -> Result<Value<'de>> {
240+
fn parse_map(&mut self) -> Result<Value<'de>> {
234241
// We short cut for empty arrays
235-
let es = self.count_elements();
242+
let es = self.de.count_elements();
236243

237244
if unlikely!(es == 0) {
238-
self.skip();
245+
self.de.skip();
239246
return Ok(Value::Object(Map::new()));
240247
}
241248

@@ -245,13 +252,13 @@ impl<'de> Deserializer<'de> {
245252
// element so we eat this
246253

247254
for _ in 0..es {
248-
self.skip();
249-
let key = stry!(self.parse_short_str_());
255+
self.de.skip();
256+
let key = stry!(self.de.parse_short_str_());
250257
// We have to call parse short str twice since parse_short_str
251258
// does not move the cursor forward
252-
self.skip();
253-
res.insert_nocheck(key.into(), stry!(self.parse_value_borrowed()));
254-
self.skip();
259+
self.de.skip();
260+
res.insert_nocheck(key.into(), stry!(self.parse_value()));
261+
self.de.skip();
255262
}
256263
Ok(Value::Object(res))
257264
}

src/value/owned.rs

Lines changed: 47 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ pub type Map = HashMap<String, Value>;
1818
/// owned memory whereever required thus returning a value without
1919
/// a lifetime.
2020
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()
2323
}
2424

2525
#[derive(Debug, PartialEq, Clone)]
@@ -170,84 +170,81 @@ impl Default for Value {
170170
}
171171
}
172172

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+
}
174181
#[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_() {
183184
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);
187189
}
188-
self.parse_str_().map(Value::from)
190+
self.de.parse_str_().map(Value::from)
189191
}
190192
b'n' => Ok(Value::Null),
191193
b't' => Ok(Value::Bool(true)),
192194
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)),
198200
}
199201
}
200202

201203
#[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_() {
210206
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);
214211
}
215-
self.parse_str_().map(Value::from)
212+
self.de.parse_str_().map(Value::from)
216213
}
217214
b'n' => Ok(Value::Null),
218215
b't' => Ok(Value::Bool(true)),
219216
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)),
225222
}
226223
}
227224

228225
#[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();
231228
if unlikely!(es == 0) {
232-
self.skip();
229+
self.de.skip();
233230
return Ok(Value::Array(Vec::new()));
234231
}
235232
let mut res = Vec::with_capacity(es);
236233

237234
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();
240237
}
241238
Ok(Value::Array(res))
242239
}
243240

244241
#[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> {
246243
// We short cut for empty arrays
247-
let es = self.count_elements();
244+
let es = self.de.count_elements();
248245

249246
if unlikely!(es == 0) {
250-
self.skip();
247+
self.de.skip();
251248
return Ok(Value::Object(Map::new()));
252249
}
253250

@@ -257,13 +254,13 @@ impl<'de> Deserializer<'de> {
257254
// element so we eat this
258255

259256
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_());
262259
// We have to call parse short str twice since parse_short_str
263260
// 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();
267264
}
268265
Ok(Value::Object(res))
269266
}

0 commit comments

Comments
 (0)