• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![allow(
2     clippy::cast_lossless,
3     clippy::let_underscore_untyped,
4     clippy::uninlined_format_args
5 )]
6 
7 use quote::quote;
8 
9 #[allow(unused_macros)]
10 macro_rules! benchmark {
11     (|$ident:ident| $quote:expr) => {
12         mod timer;
13 
14         use proc_macro::TokenStream;
15         use proc_macro2::Ident;
16 
17         #[proc_macro]
18         pub fn run_quote_benchmark(input: TokenStream) -> TokenStream {
19             let input = proc_macro2::TokenStream::from(input);
20             let span = input.into_iter().next().unwrap().span();
21             let $ident = Ident::new("Response", span);
22             timer::time("macro", || proc_macro::TokenStream::from($quote));
23             TokenStream::new()
24         }
25     };
26 }
27 
28 #[allow(unused_imports)]
29 use benchmark;
30 
31 crate::benchmark! {
32     |ident| quote! {
33         impl<'de> _serde::Deserialize<'de> for #ident {
34             fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
35             where
36                 __D: _serde::Deserializer<'de>,
37             {
38                 #[allow(non_camel_case_types)]
39                 enum __Field {
40                     __field0,
41                     __field1,
42                     __ignore,
43                 }
44                 struct __FieldVisitor;
45                 impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
46                     type Value = __Field;
47                     fn expecting(
48                         &self,
49                         __formatter: &mut _serde::export::Formatter,
50                     ) -> _serde::export::fmt::Result {
51                         _serde::export::Formatter::write_str(__formatter, "field identifier")
52                     }
53                     fn visit_u64<__E>(self, __value: u64) -> _serde::export::Result<Self::Value, __E>
54                     where
55                         __E: _serde::de::Error,
56                     {
57                         match __value {
58                             0u64 => _serde::export::Ok(__Field::__field0),
59                             1u64 => _serde::export::Ok(__Field::__field1),
60                             _ => _serde::export::Err(_serde::de::Error::invalid_value(
61                                 _serde::de::Unexpected::Unsigned(__value),
62                                 &"field index 0 <= i < 2",
63                             )),
64                         }
65                     }
66                     fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E>
67                     where
68                         __E: _serde::de::Error,
69                     {
70                         match __value {
71                             "id" => _serde::export::Ok(__Field::__field0),
72                             "s" => _serde::export::Ok(__Field::__field1),
73                             _ => _serde::export::Ok(__Field::__ignore),
74                         }
75                     }
76                     fn visit_bytes<__E>(
77                         self,
78                         __value: &[u8],
79                     ) -> _serde::export::Result<Self::Value, __E>
80                     where
81                         __E: _serde::de::Error,
82                     {
83                         match __value {
84                             b"id" => _serde::export::Ok(__Field::__field0),
85                             b"s" => _serde::export::Ok(__Field::__field1),
86                             _ => _serde::export::Ok(__Field::__ignore),
87                         }
88                     }
89                 }
90                 impl<'de> _serde::Deserialize<'de> for __Field {
91                     #[inline]
92                     fn deserialize<__D>(__deserializer: __D) -> _serde::export::Result<Self, __D::Error>
93                     where
94                         __D: _serde::Deserializer<'de>,
95                     {
96                         _serde::Deserializer::deserialize_identifier(__deserializer, __FieldVisitor)
97                     }
98                 }
99                 struct __Visitor<'de> {
100                     marker: _serde::export::PhantomData<#ident>,
101                     lifetime: _serde::export::PhantomData<&'de ()>,
102                 }
103                 impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
104                     type Value = #ident;
105                     fn expecting(
106                         &self,
107                         __formatter: &mut _serde::export::Formatter,
108                     ) -> _serde::export::fmt::Result {
109                         _serde::export::Formatter::write_str(__formatter, "struct")
110                     }
111                     #[inline]
112                     fn visit_seq<__A>(
113                         self,
114                         mut __seq: __A,
115                     ) -> _serde::export::Result<Self::Value, __A::Error>
116                     where
117                         __A: _serde::de::SeqAccess<'de>,
118                     {
119                         let __field0 =
120                             match try!(_serde::de::SeqAccess::next_element::<u64>(&mut __seq)) {
121                                 _serde::export::Some(__value) => __value,
122                                 _serde::export::None => {
123                                     return _serde::export::Err(_serde::de::Error::invalid_length(
124                                         0usize,
125                                         &"struct with 2 elements",
126                                     ));
127                                 }
128                             };
129                         let __field1 =
130                             match try!(_serde::de::SeqAccess::next_element::<String>(&mut __seq)) {
131                                 _serde::export::Some(__value) => __value,
132                                 _serde::export::None => {
133                                     return _serde::export::Err(_serde::de::Error::invalid_length(
134                                         1usize,
135                                         &"struct with 2 elements",
136                                     ));
137                                 }
138                             };
139                         _serde::export::Ok(#ident {
140                             id: __field0,
141                             s: __field1,
142                         })
143                     }
144                     #[inline]
145                     fn visit_map<__A>(
146                         self,
147                         mut __map: __A,
148                     ) -> _serde::export::Result<Self::Value, __A::Error>
149                     where
150                         __A: _serde::de::MapAccess<'de>,
151                     {
152                         let mut __field0: _serde::export::Option<u64> = _serde::export::None;
153                         let mut __field1: _serde::export::Option<String> = _serde::export::None;
154                         while let _serde::export::Some(__key) =
155                             try!(_serde::de::MapAccess::next_key::<__Field>(&mut __map))
156                         {
157                             match __key {
158                                 __Field::__field0 => {
159                                     if _serde::export::Option::is_some(&__field0) {
160                                         return _serde::export::Err(
161                                             <__A::Error as _serde::de::Error>::duplicate_field("id"),
162                                         );
163                                     }
164                                     __field0 = _serde::export::Some(
165                                         try!(_serde::de::MapAccess::next_value::<u64>(&mut __map)),
166                                     );
167                                 }
168                                 __Field::__field1 => {
169                                     if _serde::export::Option::is_some(&__field1) {
170                                         return _serde::export::Err(
171                                             <__A::Error as _serde::de::Error>::duplicate_field("s"),
172                                         );
173                                     }
174                                     __field1 = _serde::export::Some(
175                                         try!(_serde::de::MapAccess::next_value::<String>(&mut __map)),
176                                     );
177                                 }
178                                 _ => {
179                                     let _ = try!(_serde::de::MapAccess::next_value::<
180                                         _serde::de::IgnoredAny,
181                                     >(&mut __map));
182                                 }
183                             }
184                         }
185                         let __field0 = match __field0 {
186                             _serde::export::Some(__field0) => __field0,
187                             _serde::export::None => try!(_serde::private::de::missing_field("id")),
188                         };
189                         let __field1 = match __field1 {
190                             _serde::export::Some(__field1) => __field1,
191                             _serde::export::None => try!(_serde::private::de::missing_field("s")),
192                         };
193                         _serde::export::Ok(#ident {
194                             id: __field0,
195                             s: __field1,
196                         })
197                     }
198                 }
199                 const FIELDS: &'static [&'static str] = &["id", "s"];
200                 _serde::Deserializer::deserialize_struct(
201                     __deserializer,
202                     stringify!(#ident),
203                     FIELDS,
204                     __Visitor {
205                         marker: _serde::export::PhantomData::<#ident>,
206                         lifetime: _serde::export::PhantomData,
207                     },
208                 )
209             }
210         }
211     }
212 }
213