1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use crate::{Deserialize, Serialize};
use simd_json::{BorrowedValue, Node, OwnedValue};
use value_trait::Writable;
impl Serialize for OwnedValue {
fn json_write<W>(&self, writer: &mut W) -> crate::Result
where
W: std::io::Write,
{
self.write(writer)
}
}
impl<'value> Serialize for BorrowedValue<'value> {
fn json_write<W>(&self, writer: &mut W) -> crate::Result
where
W: std::io::Write,
{
self.write(writer)
}
}
struct OwnedDeser<'input, 'tape>(&'tape mut crate::Tape<'input>);
impl<'input, 'tape> OwnedDeser<'input, 'tape> {
#[inline(always)]
fn parse(&mut self) -> simd_json::Result<OwnedValue> {
match self.0.next() {
Some(Node::Static(s)) => Ok(OwnedValue::Static(s)),
Some(Node::String(s)) => Ok(OwnedValue::from(s)),
Some(Node::Array(len, _)) => Ok(self.parse_array(len)),
Some(Node::Object(len, _)) => Ok(self.parse_map(len)),
None => Err(simd_json::Error::generic(simd_json::ErrorType::EOF)),
}
}
#[inline(always)]
fn parse_array(&mut self, len: usize) -> OwnedValue {
let mut res = Vec::with_capacity(len);
unsafe {
res.set_len(len);
for i in 0..len {
std::ptr::write(res.get_unchecked_mut(i), self.parse().unwrap());
}
}
OwnedValue::Array(res)
}
#[inline(always)]
fn parse_map(&mut self, len: usize) -> OwnedValue {
let mut res = simd_json::value::owned::Object::with_capacity(len);
for _ in 0..len {
if let Node::String(key) = self.0.next().unwrap() {
res.insert_nocheck(key.into(), self.parse().unwrap());
} else {
unreachable!()
}
}
OwnedValue::from(res)
}
}
impl<'input> Deserialize<'input> for OwnedValue {
fn from_tape(tape: &mut crate::Tape<'input>) -> simd_json::Result<Self>
where
Self: Sized + 'input,
{
OwnedDeser(tape).parse()
}
}
struct BorrowedDeser<'input, 'tape>(&'tape mut crate::Tape<'input>);
impl<'input, 'tape> BorrowedDeser<'input, 'tape> {
#[inline(always)]
fn parse(&mut self) -> simd_json::Result<BorrowedValue<'input>> {
match self.0.next() {
Some(Node::Static(s)) => Ok(BorrowedValue::Static(s)),
Some(Node::String(s)) => Ok(BorrowedValue::from(s)),
Some(Node::Array(len, _)) => Ok(self.parse_array(len)),
Some(Node::Object(len, _)) => Ok(self.parse_map(len)),
None => Err(simd_json::Error::generic(simd_json::ErrorType::EOF)),
}
}
#[inline(always)]
fn parse_array(&mut self, len: usize) -> BorrowedValue<'input> {
let mut res = Vec::with_capacity(len);
unsafe {
res.set_len(len);
for i in 0..len {
std::ptr::write(res.get_unchecked_mut(i), self.parse().unwrap());
}
}
BorrowedValue::Array(res)
}
#[inline(always)]
fn parse_map(&mut self, len: usize) -> BorrowedValue<'input> {
let mut res = simd_json::value::borrowed::Object::with_capacity(len);
for _ in 0..len {
if let Node::String(key) = self.0.next().unwrap() {
res.insert_nocheck(key.into(), self.parse().unwrap());
} else {
unreachable!()
}
}
BorrowedValue::from(res)
}
}
impl<'input> Deserialize<'input> for BorrowedValue<'input> {
fn from_tape(tape: &mut crate::Tape<'input>) -> simd_json::Result<Self>
where
Self: Sized + 'input,
{
BorrowedDeser(tape).parse()
}
}