1 // Copyright (c) Facebook, Inc. and its affiliates.
3 // This source code is licensed under the MIT license found in the
4 // LICENSE file in the "hack" directory of this source tree.
7 use std::marker::PhantomData;
9 use bumpalo::collections::Vec as ArenaVec;
11 use serde::de::Deserializer;
12 use serde::de::SeqAccess;
13 use serde::de::Visitor;
14 use serde::Deserialize;
16 use crate::seed::ArenaSeed;
18 pub trait DeserializeInArena<'arena>: Sized {
19 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
21 D: Deserializer<'arena>;
25 macro_rules! impl_deserialize_in_arena{
26 ($ty:ident < $($lt:lifetime),* $(,)? $($tp:ident),* >) => {
27 impl<'arena, $($tp : 'arena + $crate::DeserializeInArena<'arena>),*> $crate::DeserializeInArena<'arena> for $ty<$($lt,)* $($tp,)* > {
28 fn deserialize_in_arena<__D>(
29 arena: &'arena $crate::bumpalo::Bump,
31 ) -> Result<Self, __D::Error>
33 __D: $crate::serde::Deserializer<'arena>,
36 $crate::serde::Deserialize::deserialize(deserializer)
40 impl<'arena, $($tp : $crate::DeserializeInArena<'arena>),*> $crate::DeserializeInArena<'arena> for &'arena $ty<$($lt,)* $($tp,)* > {
41 fn deserialize_in_arena<__D>(
42 arena: &'arena $crate::bumpalo::Bump,
44 ) -> Result<Self, __D::Error>
46 __D: $crate::serde::Deserializer<'arena>,
48 let value = <$ty<$($tp,)*>>::deserialize_in_arena(arena, deserializer)?;
49 Ok(arena.alloc(value))
54 impl<'arena> $crate::DeserializeInArena<'arena> for $ty {
55 fn deserialize_in_arena<__D>(
56 arena: &'arena $crate::bumpalo::Bump,
58 ) -> Result<Self, __D::Error>
60 __D: $crate::serde::Deserializer<'arena>,
63 $crate::serde::Deserialize::deserialize(deserializer)
67 impl<'arena> $crate::DeserializeInArena<'arena> for &'arena $ty {
68 fn deserialize_in_arena<__D>(
69 arena: &'arena $crate::bumpalo::Bump,
71 ) -> Result<Self, __D::Error>
73 __D: $crate::serde::Deserializer<'arena>,
75 let value = <$ty>::deserialize(deserializer)?;
76 Ok(arena.alloc(value))
82 impl_deserialize_in_arena!(());
83 impl_deserialize_in_arena!(bool);
84 impl_deserialize_in_arena!(i8);
85 impl_deserialize_in_arena!(i16);
86 impl_deserialize_in_arena!(i32);
87 impl_deserialize_in_arena!(i64);
88 impl_deserialize_in_arena!(isize);
89 impl_deserialize_in_arena!(u8);
90 impl_deserialize_in_arena!(u16);
91 impl_deserialize_in_arena!(u32);
92 impl_deserialize_in_arena!(u64);
93 impl_deserialize_in_arena!(usize);
94 impl_deserialize_in_arena!(f32);
95 impl_deserialize_in_arena!(f64);
96 impl_deserialize_in_arena!(char);
98 impl<'arena> DeserializeInArena<'arena> for &'arena str {
99 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
101 D: Deserializer<'arena>,
103 struct StrInArena<'arena> {
107 impl<'arena, 'de> Visitor<'de> for StrInArena<'arena> {
108 type Value = &'arena str;
110 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
111 formatter.write_str("a string")
114 fn visit_str<E>(self, string: &str) -> Result<Self::Value, E>
118 Ok(self.arena.alloc_str(string))
122 deserializer.deserialize_str(StrInArena { arena })
126 impl<'arena> DeserializeInArena<'arena> for &'arena bstr::BStr {
127 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
129 D: Deserializer<'arena>,
131 struct BStrVisitor<'arena> {
135 impl<'arena, 'de> Visitor<'de> for BStrVisitor<'arena> {
136 type Value = &'arena bstr::BStr;
138 fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
139 f.write_str("a borrowed byte string")
143 fn visit_seq<V: SeqAccess<'de>>(self, mut visitor: V) -> Result<Self::Value, V::Error> {
144 let len = std::cmp::min(visitor.size_hint().unwrap_or(0), 256);
145 let mut bytes = ArenaVec::with_capacity_in(len, self.arena);
146 while let Some(v) = visitor.next_element()? {
149 Ok(bytes.into_bump_slice().into())
153 fn visit_borrowed_bytes<E>(self, value: &'de [u8]) -> Result<Self::Value, E>
157 Ok((self.arena.alloc_slice_copy(value) as &[u8]).into())
161 fn visit_borrowed_str<E>(self, value: &'de str) -> Result<Self::Value, E>
165 Ok((self.arena.alloc_str(value) as &str).into())
169 fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
173 Ok((self.arena.alloc_slice_copy(value) as &[u8]).into())
177 deserializer.deserialize_bytes(BStrVisitor { arena })
181 impl<'arena, T> DeserializeInArena<'arena> for &'arena [T]
183 T: DeserializeInArena<'arena>,
185 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
187 D: Deserializer<'arena>,
189 struct SliceInArena<'arena, T> {
191 marker: PhantomData<fn() -> T>,
194 impl<'arena, T> Visitor<'arena> for SliceInArena<'arena, T>
196 T: DeserializeInArena<'arena> + 'arena,
198 type Value = &'arena [T];
200 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
201 formatter.write_str("an array")
204 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
206 A: SeqAccess<'arena>,
208 let mut vec = Vec::with_capacity(seq.size_hint().unwrap_or(0));
209 let seed = ArenaSeed::new();
210 while let Some(value) = seq.next_element_seed(seed)? {
213 Ok(self.arena.alloc_slice_fill_iter(vec))
217 deserializer.deserialize_seq(SliceInArena {
224 impl<'arena, T> DeserializeInArena<'arena> for Option<T>
226 T: DeserializeInArena<'arena>,
228 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
230 D: Deserializer<'arena>,
232 struct OptionVisitor<'arena, T> {
234 marker: PhantomData<fn() -> T>,
237 impl<'arena, T: DeserializeInArena<'arena>> Visitor<'arena> for OptionVisitor<'arena, T> {
238 type Value = Option<T>;
240 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
241 formatter.write_str("option")
245 fn visit_unit<E>(self) -> Result<Self::Value, E>
253 fn visit_none<E>(self) -> Result<Self::Value, E>
261 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
263 D: Deserializer<'arena>,
265 T::deserialize_in_arena(self.arena, deserializer).map(Some)
269 deserializer.deserialize_option(OptionVisitor {
276 impl<'arena, T> DeserializeInArena<'arena> for &'arena Option<T>
278 T: DeserializeInArena<'arena>,
280 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
282 D: Deserializer<'arena>,
284 let v = <Option<T>>::deserialize_in_arena(arena, deserializer)?;
289 macro_rules! tuple_impls {
290 ($($len:tt => ($($n:tt $name:ident)+))+) => {
292 impl<'arena, $($name: DeserializeInArena<'arena>),+> DeserializeInArena<'arena> for ($($name,)+) {
294 fn deserialize_in_arena<D>(_arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
296 D: Deserializer<'arena>,
298 struct TupleVisitor<$($name,)+> {
299 marker: PhantomData<($($name,)+)>,
302 impl<'arena, $($name: DeserializeInArena<'arena>),+> Visitor<'arena> for TupleVisitor<$($name,)+> {
303 type Value = ($($name,)+);
305 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
306 formatter.write_str(concat!("a tuple of size ", $len))
310 #[allow(non_snake_case)]
311 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
313 A: SeqAccess<'arena>,
316 let seed = ArenaSeed::new();
317 let $name = match seq.next_element_seed(seed)? {
318 Some(value) => value,
319 None => return Err(serde::de::Error::invalid_length($n, &self)),
327 deserializer.deserialize_tuple($len, TupleVisitor { marker: PhantomData })
331 impl<'arena, $($name: DeserializeInArena<'arena>),+> DeserializeInArena<'arena> for &'arena ($($name,)+) {
333 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
335 D: Deserializer<'arena>,
337 let v = <($($name,)+)>::deserialize_in_arena(arena, deserializer)?;
348 3 => (0 T0 1 T1 2 T2)
349 4 => (0 T0 1 T1 2 T2 3 T3)
350 5 => (0 T0 1 T1 2 T2 3 T3 4 T4)
351 6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)
352 7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)
353 8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)
354 9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)
355 10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)
356 11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)
357 12 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11)
358 13 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12)
359 14 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13)
360 15 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14)
361 16 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15)