(mut self, tuple_len: usize, v: V)
| 302 | |
| 303 | #[inline(always)] |
| 304 | fn deserialize_tuple<V>(mut self, tuple_len: usize, v: V) -> Result<V::Value> |
| 305 | where |
| 306 | V: Visitor<'de>, |
| 307 | { |
| 308 | // Fast path: avoid overhead of tuple for 1 element. |
| 309 | if tuple_len == 1 { |
| 310 | return v.visit_seq(Access { |
| 311 | decoders: std::slice::from_mut(self.decoder), |
| 312 | input: self.input, |
| 313 | index: 0, |
| 314 | }); |
| 315 | } |
| 316 | |
| 317 | // Copy of specify! macro that takes an additional tuple_len parameter to cold. |
| 318 | match &mut self.decoder { |
| 319 | SerdeDecoder::Tuple(_) => (), |
| 320 | _ => { |
| 321 | #[cold] |
| 322 | fn cold<'de>( |
| 323 | decoder: &mut SerdeDecoder<'de>, |
| 324 | input: &mut &'de [u8], |
| 325 | tuple_len: usize, |
| 326 | ) -> Result<()> { |
| 327 | let &mut SerdeDecoder::Unspecified { length } = decoder else { |
| 328 | type_changed!(); |
| 329 | }; |
| 330 | *decoder = SerdeDecoder::Tuple(default_box_slice(tuple_len)); |
| 331 | decoder.populate(input, length) |
| 332 | } |
| 333 | cold(&mut *self.decoder, &mut *self.input, tuple_len)?; |
| 334 | } |
| 335 | } |
| 336 | let SerdeDecoder::Tuple(decoders) = &mut *self.decoder else { |
| 337 | // Safety: see specify! macro which this is based on. |
| 338 | unsafe { std::hint::unreachable_unchecked() }; |
| 339 | }; |
| 340 | if decoders.len() != tuple_len { |
| 341 | type_changed!(); // Removes multiple bounds checks. |
| 342 | } |
| 343 | |
| 344 | struct Access<'a, 'de> { |
| 345 | decoders: &'a mut [SerdeDecoder<'de>], |
| 346 | input: &'a mut &'de [u8], |
| 347 | index: usize, |
| 348 | } |
| 349 | impl<'de> SeqAccess<'de> for Access<'_, 'de> { |
| 350 | type Error = Error; |
| 351 | |
| 352 | #[inline(always)] |
| 353 | fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>> |
| 354 | where |
| 355 | T: DeserializeSeed<'de>, |
| 356 | { |
| 357 | if let Some(decoder) = self.decoders.get_mut(self.index) { |
| 358 | self.index += 1; |
| 359 | Ok(Some(DeserializeSeed::deserialize( |
| 360 | seed, |
| 361 | DecoderWrapper { |
no test coverage detected