Skip to content

Commit af7ab88

Browse files
committed
fix: SmallVec deserialization without Vec alloc
1 parent 530cd9c commit af7ab88

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

src/internal/small_vec.rs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,36 @@ impl<T: serde::Serialize> serde::Serialize for SmallVec<T> {
126126
#[cfg(feature = "serde")]
127127
impl<'de, T: serde::Deserialize<'de>> serde::Deserialize<'de> for SmallVec<T> {
128128
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
129-
let items: Vec<T> = serde::Deserialize::deserialize(d)?;
129+
struct SmallVecVisitor<T> {
130+
marker: std::marker::PhantomData<T>,
131+
}
132+
133+
impl<'de, T> serde::de::Visitor<'de> for SmallVecVisitor<T>
134+
where
135+
T: serde::Deserialize<'de>,
136+
{
137+
type Value = SmallVec<T>;
138+
139+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
140+
formatter.write_str("a sequence")
141+
}
130142

131-
let mut v = Self::empty();
132-
for item in items {
133-
v.push(item);
143+
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
144+
where
145+
A: serde::de::SeqAccess<'de>,
146+
{
147+
let mut values = SmallVec::empty();
148+
while let Some(value) = seq.next_element()? {
149+
values.push(value);
150+
}
151+
Ok(values)
152+
}
134153
}
135-
Ok(v)
154+
155+
let visitor = SmallVecVisitor {
156+
marker: Default::default(),
157+
};
158+
d.deserialize_seq(visitor)
136159
}
137160
}
138161

0 commit comments

Comments
 (0)