Eliminate additional allocations for flattening aliases

This commit is contained in:
Mingun
2023-05-19 22:32:07 +05:00
parent 7ca7720262
commit 855acaf112
+9 -10
View File
@@ -2216,17 +2216,16 @@ fn deserialize_identifier(
collect_other_fields: bool, collect_other_fields: bool,
expecting: Option<&str>, expecting: Option<&str>,
) -> Fragment { ) -> Fragment {
let mut flat_fields = Vec::new(); let str_mapping = fields.iter().map(|(_, ident, aliases)| {
for (_, ident, aliases) in fields { // `aliases` also contains a main name
flat_fields.extend(aliases.iter().map(|alias| (alias, ident))); quote!(#(#aliases)|* => _serde::__private::Ok(#this_value::#ident))
}
let str_mapping = flat_fields.iter().map(|(name, ident)| {
quote!(#name => _serde::__private::Ok(#this_value::#ident))
}); });
let bytes_mapping = flat_fields.iter().map(|(name, ident)| { let bytes_mapping = fields.iter().map(|(_, ident, aliases)| {
let name = Literal::byte_string(name.as_bytes()); // `aliases` also contains a main name
quote!(#name => _serde::__private::Ok(#this_value::#ident)) let aliases = aliases
.iter()
.map(|alias| Literal::byte_string(alias.as_bytes()));
quote!(#(#aliases)|* => _serde::__private::Ok(#this_value::#ident))
}); });
let main_constructors: &Vec<_> = &fields let main_constructors: &Vec<_> = &fields