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