MCPcopy Create free account
hub / github.com/SoftbearStudios/bitcode / deserialize_tuple

Method deserialize_tuple

src/serde/de.rs:304–382  ·  view source on GitHub ↗
(mut self, tuple_len: usize, v: V)

Source from the content-addressed store, hash-verified

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 {

Callers 4

deserialize_structMethod · 0.80
tuple_variantMethod · 0.80
struct_variantMethod · 0.80

Calls 2

coldFunction · 0.85
lenMethod · 0.45

Tested by

no test coverage detected