(
&self,
output: [TokenStream; Item::COUNT],
ident: Ident,
mut generics: Generics,
)
| 230 | } |
| 231 | |
| 232 | fn derive_impl( |
| 233 | &self, |
| 234 | output: [TokenStream; Item::COUNT], |
| 235 | ident: Ident, |
| 236 | mut generics: Generics, |
| 237 | ) -> TokenStream { |
| 238 | let input_generics = generics.clone(); |
| 239 | let (impl_generics, input_generics, where_clause) = input_generics.split_for_impl(); |
| 240 | let input_ty = quote! { #ident #input_generics }; |
| 241 | |
| 242 | // Encoder can't contain any lifetimes from input (which would limit reuse of encoder). |
| 243 | remove_lifetimes(&mut generics); |
| 244 | let (encoder_impl_generics, encoder_generics, encoder_where_clause) = |
| 245 | generics.split_for_impl(); |
| 246 | |
| 247 | let [type_body, default_body, encode_body, encode_vectored_body, collect_into_body, reserve_body] = |
| 248 | output; |
| 249 | let encoder_ident = Ident::new(&format!("{ident}Encoder"), Span::call_site()); |
| 250 | let encoder_ty = quote! { #encoder_ident #encoder_generics }; |
| 251 | let private = private(); |
| 252 | |
| 253 | quote! { |
| 254 | const _: () = { |
| 255 | impl #impl_generics #private::Encode for #input_ty #where_clause { |
| 256 | type Encoder = #encoder_ty; |
| 257 | } |
| 258 | |
| 259 | #[allow(non_snake_case)] |
| 260 | pub struct #encoder_ident #encoder_impl_generics #encoder_where_clause { |
| 261 | #type_body |
| 262 | } |
| 263 | |
| 264 | // Avoids bounding #impl_generics: Default. |
| 265 | impl #encoder_impl_generics std::default::Default for #encoder_ty #encoder_where_clause { |
| 266 | fn default() -> Self { |
| 267 | Self { |
| 268 | #default_body |
| 269 | } |
| 270 | } |
| 271 | } |
| 272 | |
| 273 | impl #impl_generics #private::Encoder<#input_ty> for #encoder_ty #where_clause { |
| 274 | #[cfg_attr(not(debug_assertions), inline(always))] |
| 275 | fn encode(&mut self, v: &#input_ty) { |
| 276 | #[allow(unused_imports)] |
| 277 | use #private::Buffer as _; |
| 278 | #encode_body |
| 279 | } |
| 280 | |
| 281 | // #[cfg_attr(not(debug_assertions), inline(always))] |
| 282 | // #[inline(never)] |
| 283 | fn encode_vectored<'__v>(&mut self, i: impl Iterator<Item = &'__v #input_ty> + Clone) where #input_ty: '__v { |
| 284 | #[allow(unused_imports)] |
| 285 | use #private::Buffer as _; |
| 286 | #encode_vectored_body |
| 287 | } |
| 288 | } |
| 289 |
no test coverage detected