Skip to main content

bincode_next/features/
impl_alloc.rs

1#![allow(unsafe_code)]
2use crate::BorrowDecode;
3use crate::Config;
4use crate::config::Endianness;
5use crate::config::IntEncoding;
6use crate::config::InternalEndianConfig;
7use crate::config::InternalIntEncodingConfig;
8use crate::config::internal::InternalFingerprintGuard;
9use crate::de::BorrowDecoder;
10use crate::de::Decode;
11use crate::de::Decoder;
12use crate::de::read::Reader;
13use crate::enc::Encode;
14use crate::enc::Encoder;
15use crate::enc::write::SizeWriter;
16use crate::enc::write::Writer;
17use crate::enc::{
18    self,
19};
20use crate::error::DecodeError;
21use crate::error::EncodeError;
22use crate::impl_borrow_decode;
23use alloc::borrow::Cow;
24use alloc::borrow::ToOwned;
25use alloc::boxed::Box;
26use alloc::collections::BTreeMap;
27use alloc::collections::BTreeSet;
28use alloc::collections::BinaryHeap;
29use alloc::collections::VecDeque;
30use alloc::rc::Rc;
31use alloc::string::String;
32use alloc::vec::Vec;
33
34#[cfg(target_has_atomic = "ptr")]
35use alloc::sync::Arc;
36
37/// A writer that writes into a `Vec<u8>`.
38#[derive(Default)]
39pub struct VecWriter {
40    inner: Vec<u8>,
41}
42
43impl VecWriter {
44    /// Create a new vec writer with the given capacity
45    #[must_use]
46    pub fn with_capacity(cap: usize) -> Self {
47        Self {
48            inner: Vec::with_capacity(cap),
49        }
50    }
51
52    // May not be used in all feature combinations
53    #[allow(dead_code)]
54    pub(crate) fn collect(self) -> Vec<u8> {
55        self.inner
56    }
57}
58
59impl enc::write::Writer for VecWriter {
60    #[inline]
61    fn write(
62        &mut self,
63        bytes: &[u8],
64    ) -> Result<(), EncodeError> {
65        self.inner.extend_from_slice(bytes);
66        Ok(())
67    }
68
69    #[inline]
70    fn write_u8(
71        &mut self,
72        value: u8,
73    ) -> Result<(), EncodeError> {
74        self.inner.push(value);
75        Ok(())
76    }
77}
78
79/// Encode the given value into a `Vec<u8>` with the given `Config`. See the [config] module for more information.
80///
81/// [config]: config/index.html
82/// # Errors
83///
84/// Returns an `EncodeError` if the value cannot be encoded.
85#[inline(always)]
86#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
87pub fn encode_to_vec<E: enc::Encode, C: Config>(
88    val: E,
89    config: C,
90) -> Result<Vec<u8>, EncodeError>
91where
92    C::Mode: crate::config::InternalFingerprintGuard<E, C>,
93{
94    let size = {
95        let mut size_writer = enc::EncoderImpl::<_, C>::new(SizeWriter::default(), config);
96        val.encode(&mut size_writer)?;
97        size_writer.into_writer().bytes_written
98    };
99    // Include the 8-byte prefix size if fingerprinting is enabled, we could just do capacity + 8 to be safe
100    // but the write below handles resizing anyway.
101    let mut writer = VecWriter::with_capacity(size + 8);
102    C::Mode::encode_check(&config, &mut writer)?;
103    let mut encoder = enc::EncoderImpl::<_, C>::new(writer, config);
104    val.encode(&mut encoder)?;
105    Ok(encoder.into_writer().inner)
106}
107
108impl<Context, T> Decode<Context> for BinaryHeap<T>
109where
110    T: Decode<Context> + Ord,
111{
112    #[inline(always)]
113    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
114        Ok(Vec::<T>::decode(decoder)?.into())
115    }
116}
117impl<'de, T, Context> BorrowDecode<'de, Context> for BinaryHeap<T>
118where
119    T: BorrowDecode<'de, Context> + Ord,
120{
121    #[inline(always)]
122    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
123        decoder: &mut D
124    ) -> Result<Self, DecodeError> {
125        Ok(Vec::<T>::borrow_decode(decoder)?.into())
126    }
127}
128
129impl<T> Encode for BinaryHeap<T>
130where
131    T: Encode + Ord,
132{
133    #[inline(always)]
134    fn encode<E: Encoder>(
135        &self,
136        encoder: &mut E,
137    ) -> Result<(), EncodeError> {
138        use crate::config::Format;
139        if matches!(
140            <E::C as crate::config::InternalFormatConfig>::FORMAT,
141            Format::CborDeterministic
142        ) {
143            crate::enc::cbor::encode_slice_deterministic::<E, _, _>(encoder, self.iter())
144        } else {
145            self.as_slice().encode(encoder)
146        }
147    }
148}
149
150impl<Context, K, V> Decode<Context> for BTreeMap<K, V>
151where
152    K: Decode<Context> + Ord,
153    V: Decode<Context>,
154{
155    #[inline(always)]
156    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
157        let len = decoder.decode_map_len()?;
158        let is_bincode = matches!(
159            <D::C as crate::config::InternalFormatConfig>::FORMAT,
160            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
161        );
162        let is_deterministic = matches!(
163            <D::C as crate::config::InternalFormatConfig>::FORMAT,
164            crate::config::Format::BincodeDeterministic
165        );
166        if !is_bincode && len == usize::MAX {
167            let mut map = Self::new();
168            while decoder.reader().peek_u8() != Some(0xFF) {
169                let key = K::decode(decoder)?;
170                let value = V::decode(decoder)?;
171                map.insert(key, value);
172            }
173            decoder.reader().read_u8()?; // consume 0xFF
174            return Ok(map);
175        }
176        decoder.claim_container_read::<(K, V)>(len)?;
177
178        let mut map = Self::new();
179        for _ in 0..len {
180            decoder.unclaim_bytes_read(core::mem::size_of::<(K, V)>());
181            let key = K::decode(decoder)?;
182            let value = V::decode(decoder)?;
183            if is_deterministic {
184                if map.insert(key, value).is_some() {
185                    return crate::error::cold_decode_error_duplicate_map_key();
186                }
187            } else {
188                map.insert(key, value);
189            }
190        }
191        Ok(map)
192    }
193}
194impl<'de, K, V, Context> BorrowDecode<'de, Context> for BTreeMap<K, V>
195where
196    K: BorrowDecode<'de, Context> + Ord,
197    V: BorrowDecode<'de, Context>,
198{
199    #[inline(always)]
200    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
201        decoder: &mut D
202    ) -> Result<Self, DecodeError> {
203        let len = decoder.decode_map_len()?;
204        let is_bincode = matches!(
205            <D::C as crate::config::InternalFormatConfig>::FORMAT,
206            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
207        );
208        let is_deterministic = matches!(
209            <D::C as crate::config::InternalFormatConfig>::FORMAT,
210            crate::config::Format::BincodeDeterministic
211        );
212        if !is_bincode && len == usize::MAX {
213            let mut map = Self::new();
214            while decoder.reader().peek_u8() != Some(0xFF) {
215                let key = K::borrow_decode(decoder)?;
216                let value = V::borrow_decode(decoder)?;
217                map.insert(key, value);
218            }
219            decoder.reader().read_u8()?; // consume 0xFF
220            return Ok(map);
221        }
222        decoder.claim_container_read::<(K, V)>(len)?;
223
224        let mut map = Self::new();
225        for _ in 0..len {
226            decoder.unclaim_bytes_read(core::mem::size_of::<(K, V)>());
227            let key = K::borrow_decode(decoder)?;
228            let value = V::borrow_decode(decoder)?;
229            if is_deterministic {
230                if map.insert(key, value).is_some() {
231                    return crate::error::cold_decode_error_duplicate_map_key();
232                }
233            } else {
234                map.insert(key, value);
235            }
236        }
237        Ok(map)
238    }
239}
240
241impl<K, V> Encode for BTreeMap<K, V>
242where
243    K: Encode + Ord,
244    V: Encode,
245{
246    #[inline(always)]
247    fn encode<E: Encoder>(
248        &self,
249        encoder: &mut E,
250    ) -> Result<(), EncodeError> {
251        use crate::config::Format;
252        let format = <E::C as crate::config::InternalFormatConfig>::FORMAT;
253        if format == Format::CborDeterministic {
254            crate::enc::cbor::encode_map_deterministic::<E, _, _, _>(encoder, self.iter())
255        } else if format == Format::BincodeDeterministic {
256            #[cfg(feature = "alloc")]
257            return crate::enc::deterministic::encode_map_deterministic::<E, _, _, _>(
258                encoder,
259                self.iter(),
260            );
261            #[cfg(not(feature = "alloc"))]
262            return crate::error::cold_encode_error_other(
263                "Deterministic encoding requires the 'alloc' feature",
264            );
265        } else {
266            encoder.encode_map_len(self.len())?;
267            for (key, val) in self {
268                key.encode(encoder)?;
269                val.encode(encoder)?;
270            }
271            Ok(())
272        }
273    }
274}
275
276impl<Context, T> Decode<Context> for BTreeSet<T>
277where
278    T: Decode<Context> + Ord,
279{
280    #[inline(always)]
281    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
282        let len = decoder.decode_slice_len()?;
283        let is_bincode = matches!(
284            <D::C as crate::config::InternalFormatConfig>::FORMAT,
285            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
286        );
287        let is_deterministic = matches!(
288            <D::C as crate::config::InternalFormatConfig>::FORMAT,
289            crate::config::Format::BincodeDeterministic
290        );
291        if !is_bincode && len == usize::MAX {
292            let mut map = Self::new();
293            while decoder.reader().peek_u8() != Some(0xFF) {
294                let key = T::decode(decoder)?;
295                map.insert(key);
296            }
297            decoder.reader().read_u8()?; // consume 0xFF
298            return Ok(map);
299        }
300        decoder.claim_container_read::<T>(len)?;
301
302        let mut map = Self::new();
303        for _ in 0..len {
304            decoder.unclaim_bytes_read(core::mem::size_of::<T>());
305            let key = T::decode(decoder)?;
306            if is_deterministic {
307                if !map.insert(key) {
308                    return crate::error::cold_decode_error_duplicate_map_key();
309                }
310            } else {
311                map.insert(key);
312            }
313        }
314        Ok(map)
315    }
316}
317impl<'de, T, Context> BorrowDecode<'de, Context> for BTreeSet<T>
318where
319    T: BorrowDecode<'de, Context> + Ord,
320{
321    #[inline(always)]
322    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
323        decoder: &mut D
324    ) -> Result<Self, DecodeError> {
325        let len = decoder.decode_slice_len()?;
326        let is_bincode = matches!(
327            <D::C as crate::config::InternalFormatConfig>::FORMAT,
328            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
329        );
330        let is_deterministic = matches!(
331            <D::C as crate::config::InternalFormatConfig>::FORMAT,
332            crate::config::Format::BincodeDeterministic
333        );
334        if !is_bincode && len == usize::MAX {
335            let mut map = Self::new();
336            while decoder.reader().peek_u8() != Some(0xFF) {
337                let key = T::borrow_decode(decoder)?;
338                map.insert(key);
339            }
340            decoder.reader().read_u8()?; // consume 0xFF
341            return Ok(map);
342        }
343        decoder.claim_container_read::<T>(len)?;
344
345        let mut map = Self::new();
346        for _ in 0..len {
347            decoder.unclaim_bytes_read(core::mem::size_of::<T>());
348            let key = T::borrow_decode(decoder)?;
349            if is_deterministic {
350                if !map.insert(key) {
351                    return crate::error::cold_decode_error_duplicate_map_key();
352                }
353            } else {
354                map.insert(key);
355            }
356        }
357        Ok(map)
358    }
359}
360
361impl<T> Encode for BTreeSet<T>
362where
363    T: Encode + Ord,
364{
365    #[inline(always)]
366    fn encode<E: Encoder>(
367        &self,
368        encoder: &mut E,
369    ) -> Result<(), EncodeError> {
370        use crate::config::Format;
371        let format = <E::C as crate::config::InternalFormatConfig>::FORMAT;
372        if format == Format::CborDeterministic {
373            crate::enc::cbor::encode_slice_deterministic::<E, _, _>(encoder, self.iter())
374        } else if format == Format::BincodeDeterministic {
375            #[cfg(feature = "alloc")]
376            return crate::enc::deterministic::encode_slice_deterministic::<E, _, _>(
377                encoder,
378                self.iter(),
379            );
380            #[cfg(not(feature = "alloc"))]
381            return crate::error::cold_encode_error_other(
382                "Deterministic encoding requires the 'alloc' feature",
383            );
384        } else {
385            encoder.encode_slice_len(self.len())?;
386            for item in self {
387                item.encode(encoder)?;
388            }
389            Ok(())
390        }
391    }
392}
393
394impl<Context, T> Decode<Context> for VecDeque<T>
395where
396    T: Decode<Context>,
397{
398    #[inline(always)]
399    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
400        Ok(Vec::<T>::decode(decoder)?.into())
401    }
402}
403impl<'de, T, Context> BorrowDecode<'de, Context> for VecDeque<T>
404where
405    T: BorrowDecode<'de, Context>,
406{
407    #[inline(always)]
408    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
409        decoder: &mut D
410    ) -> Result<Self, DecodeError> {
411        Ok(Vec::<T>::borrow_decode(decoder)?.into())
412    }
413}
414
415impl<T> Encode for VecDeque<T>
416where
417    T: Encode,
418{
419    #[inline(always)]
420    fn encode<E: Encoder>(
421        &self,
422        encoder: &mut E,
423    ) -> Result<(), EncodeError> {
424        let is_u8 = unty::type_equal::<T, u8>() || unty::type_equal::<T, i8>();
425        let is_bincode = matches!(
426            <E::C as crate::config::InternalFormatConfig>::FORMAT,
427            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
428        );
429        let is_fixed = matches!(E::C::INT_ENCODING, IntEncoding::Fixed);
430        let is_native_endian = match E::C::ENDIAN {
431            | Endianness::Little => cfg!(target_endian = "little"),
432            | Endianness::Big => cfg!(target_endian = "big"),
433        };
434
435        encoder.encode_slice_len(self.len())?;
436        if is_bincode
437            && (is_u8
438                || (is_native_endian
439                    && (unty::type_equal::<T, f32>()
440                        || unty::type_equal::<T, f64>()
441                        || (is_fixed
442                            && (unty::type_equal::<T, u16>()
443                                || unty::type_equal::<T, i16>()
444                                || unty::type_equal::<T, u32>()
445                                || unty::type_equal::<T, i32>()
446                                || unty::type_equal::<T, u64>()
447                                || unty::type_equal::<T, i64>()
448                                || unty::type_equal::<T, u128>()
449                                || unty::type_equal::<T, i128>())))))
450        {
451            let slices: (&[T], &[T]) = self.as_slices();
452            // SAFETY: T is a primitive type (pod), so it's safe to copy its bytes.
453            unsafe {
454                let s1 = core::slice::from_raw_parts(
455                    slices.0.as_ptr().cast::<u8>(),
456                    core::mem::size_of_val(slices.0),
457                );
458                let s2 = core::slice::from_raw_parts(
459                    slices.1.as_ptr().cast::<u8>(),
460                    core::mem::size_of_val(slices.1),
461                );
462                encoder.writer().write(s1)?;
463                encoder.writer().write(s2)?;
464            }
465        } else {
466            for item in self {
467                item.encode(encoder)?;
468            }
469        }
470        Ok(())
471    }
472}
473
474impl<Context, T> Decode<Context> for Vec<T>
475where
476    T: Decode<Context>,
477{
478    #[inline]
479    #[allow(clippy::too_many_lines)]
480    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
481        let is_u8 = unty::type_equal::<T, u8>() || unty::type_equal::<T, i8>();
482        let (major, len) = if is_u8 {
483            decoder.decode_byte_slice_or_array_len()?
484        } else {
485            (4, decoder.decode_slice_len()?)
486        };
487
488        let is_bincode = matches!(
489            <D::C as crate::config::InternalFormatConfig>::FORMAT,
490            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
491        );
492        if !is_bincode && len == usize::MAX {
493            let mut vec = Self::new();
494            if is_u8 && major == 2 {
495                while decoder.reader().peek_u8() != Some(0xFF) {
496                    let chunk_len = decoder.decode_byte_slice_len()?;
497                    decoder.claim_bytes_read(chunk_len)?;
498                    let start = vec.len();
499                    // SAFETY: T is u8/i8, so it's safe to copy bytes into it.
500                    unsafe {
501                        vec.reserve(chunk_len);
502                        let ptr = vec.as_mut_ptr().add(start).cast::<u8>();
503                        let slice = core::slice::from_raw_parts_mut(ptr, chunk_len);
504                        decoder.reader().read(slice)?;
505                        vec.set_len(start + chunk_len);
506                    }
507                }
508            } else {
509                while decoder.reader().peek_u8() != Some(0xFF) {
510                    vec.push(T::decode(decoder)?);
511                }
512            }
513            decoder.reader().read_u8()?; // consume 0xFF
514            return Ok(vec);
515        }
516
517        decoder.claim_container_read::<T>(len)?;
518
519        let is_fixed = matches!(D::C::INT_ENCODING, IntEncoding::Fixed);
520        let is_native_endian = match D::C::ENDIAN {
521            | Endianness::Little => cfg!(target_endian = "little"),
522            | Endianness::Big => cfg!(target_endian = "big"),
523        };
524
525        let is_bincode = matches!(
526            <D::C as crate::config::InternalFormatConfig>::FORMAT,
527            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
528        );
529
530        if is_bincode
531            && (is_u8
532                || (is_fixed
533                    && is_native_endian
534                    && (unty::type_equal::<T, u16>()
535                        || unty::type_equal::<T, i16>()
536                        || unty::type_equal::<T, u32>()
537                        || unty::type_equal::<T, i32>()
538                        || unty::type_equal::<T, u64>()
539                        || unty::type_equal::<T, i64>()
540                        || unty::type_equal::<T, u128>()
541                        || unty::type_equal::<T, i128>()
542                        || unty::type_equal::<T, f32>()
543                        || unty::type_equal::<T, f64>())))
544            || (!is_bincode && is_u8 && major == 2)
545        {
546            let mut vec = Self::with_capacity(len);
547            unsafe {
548                let bytes_to_read = len * core::mem::size_of::<T>();
549                let ptr = vec.as_mut_ptr().cast::<u8>();
550                let slice = core::slice::from_raw_parts_mut(ptr, bytes_to_read);
551                decoder.reader().read(slice)?;
552                vec.set_len(len);
553            }
554            Ok(vec)
555        } else {
556            let is_varint = matches!(D::C::INT_ENCODING, IntEncoding::Variable) && is_bincode;
557            let mut vec = Self::with_capacity(len);
558            let mut i = 0;
559
560            if is_varint {
561                let max_size = if unty::type_equal::<T, u16>() || unty::type_equal::<T, i16>() {
562                    Some(3)
563                } else if unty::type_equal::<T, u32>() || unty::type_equal::<T, i32>() {
564                    Some(5)
565                } else if unty::type_equal::<T, u128>() || unty::type_equal::<T, i128>() {
566                    Some(17)
567                } else if unty::type_equal::<T, u64>()
568                    || unty::type_equal::<T, i64>()
569                    || unty::type_equal::<T, usize>()
570                    || unty::type_equal::<T, isize>()
571                {
572                    Some(9)
573                } else {
574                    None
575                };
576
577                if let Some(ms) = max_size {
578                    // Try the "Ultimate Batch" peek first.
579                    // This is extremely fast as it eliminates almost all overhead.
580                    if let Some(bytes) = decoder.reader().peek_read(len * ms) {
581                        let mut reader = crate::de::read::SliceReader::new(bytes);
582                        let endian = D::C::ENDIAN;
583
584                        macro_rules! decode_mega {
585                            ($decode_fn:ident, $type:ty) => {{
586                                let v = unsafe { &mut *(&raw mut vec).cast::<Vec<$type>>() };
587                                let ptr = v.as_mut_ptr();
588                                for j in 0..len {
589                                    // Architecture-specific prefetching for large batches
590                                    #[cfg(target_arch = "x86_64")]
591                                    unsafe {
592                                        if j % 8 == 0 && reader.slice.len() > 64 {
593                                            core::arch::x86_64::_mm_prefetch(
594                                                reader.slice.as_ptr().add(64).cast::<i8>(),
595                                                core::arch::x86_64::_MM_HINT_T0,
596                                            );
597                                        }
598                                    }
599                                    #[cfg(target_arch = "aarch64")]
600                                    unsafe {
601                                        if j % 8 == 0 && reader.slice.len() > 64 {
602                                            core::arch::asm!(
603                                                "prfm pldl1keep, [{ptr}]",
604                                                ptr = in(reg) reader.slice.as_ptr().add(64),
605                                                options(nostack, preserves_flags, readonly)
606                                            );
607                                        }
608                                    }
609
610                                    unsafe {
611                                        core::ptr::write(
612                                            ptr.add(j),
613                                            crate::varint::$decode_fn(&mut reader, endian)?,
614                                        );
615                                    }
616                                }
617                                unsafe {
618                                    v.set_len(len);
619                                }
620                            }};
621                        }
622
623                        if unty::type_equal::<T, u64>() {
624                            decode_mega!(varint_decode_u64, u64);
625                        } else if unty::type_equal::<T, i64>() {
626                            decode_mega!(varint_decode_i64, i64);
627                        } else if unty::type_equal::<T, u32>() {
628                            decode_mega!(varint_decode_u32, u32);
629                        } else if unty::type_equal::<T, i32>() {
630                            decode_mega!(varint_decode_i32, i32);
631                        } else if unty::type_equal::<T, usize>() {
632                            decode_mega!(varint_decode_usize, usize);
633                        } else if unty::type_equal::<T, isize>() {
634                            decode_mega!(varint_decode_isize, isize);
635                        } else if unty::type_equal::<T, u16>() {
636                            decode_mega!(varint_decode_u16, u16);
637                        } else if unty::type_equal::<T, i16>() {
638                            decode_mega!(varint_decode_i16, i16);
639                        } else if unty::type_equal::<T, u128>() {
640                            decode_mega!(varint_decode_u128, u128);
641                        } else if unty::type_equal::<T, i128>() {
642                            decode_mega!(varint_decode_i128, i128);
643                        }
644
645                        let consumed = bytes.len() - reader.slice.len();
646                        decoder.reader().consume(consumed);
647                        if <D::C as crate::config::InternalLimitConfig>::LIMIT.is_some() {
648                            decoder.unclaim_bytes_read(len * core::mem::size_of::<T>() - consumed);
649                        }
650                        return Ok(vec);
651                    }
652                }
653            }
654
655            if is_native_endian
656                && !is_fixed
657                && is_bincode
658                && (unty::type_equal::<T, u32>()
659                    || unty::type_equal::<T, i32>()
660                    || unty::type_equal::<T, u64>()
661                    || unty::type_equal::<T, i64>()
662                    || unty::type_equal::<T, usize>()
663                    || unty::type_equal::<T, isize>())
664                && let Some(bytes) = decoder.reader().peek_read(len)
665            {
666                let scan = crate::varint::simd::scan_single_byte_varints(bytes);
667                let to_decode = scan.single_byte_count.min(len);
668                if to_decode > 0 {
669                    macro_rules! decode_simd {
670                        ($type:ty, $cast:expr) => {{
671                            let v = unsafe { &mut *(&raw mut vec).cast::<Vec<$type>>() };
672                            let ptr = v.as_mut_ptr();
673                            for j in 0..to_decode {
674                                let b = bytes[j];
675                                unsafe {
676                                    core::ptr::write(ptr.add(j), $cast(b));
677                                }
678                            }
679                            unsafe {
680                                v.set_len(to_decode);
681                            }
682                        }};
683                    }
684                    if unty::type_equal::<T, u32>() {
685                        decode_simd!(u32, u32::from);
686                    } else if unty::type_equal::<T, i32>() {
687                        decode_simd!(i32, |b: u8| i32::from(b >> 1) ^ (-i32::from(b & 1)));
688                    } else if unty::type_equal::<T, u64>() {
689                        decode_simd!(u64, u64::from);
690                    } else if unty::type_equal::<T, i64>() {
691                        decode_simd!(i64, |b: u8| i64::from(b >> 1) ^ (-i64::from(b & 1)));
692                    } else if unty::type_equal::<T, usize>() {
693                        decode_simd!(usize, usize::from);
694                    } else if unty::type_equal::<T, isize>() {
695                        decode_simd!(isize, |b: u8| {
696                            isize::from(b >> 1) ^ (-isize::from(b & 1))
697                        });
698                    }
699
700                    decoder.reader().consume(to_decode);
701                    if <D::C as crate::config::InternalLimitConfig>::LIMIT.is_some() {
702                        decoder.unclaim_bytes_read(to_decode * core::mem::size_of::<T>());
703                    }
704                    i = to_decode;
705                }
706            }
707
708            for _ in i..len {
709                decoder.unclaim_bytes_read(core::mem::size_of::<T>());
710                vec.push(T::decode(decoder)?);
711            }
712            Ok(vec)
713        }
714    }
715}
716
717impl<'de, T, Context> BorrowDecode<'de, Context> for Vec<T>
718where
719    T: BorrowDecode<'de, Context>,
720{
721    #[inline]
722    #[allow(clippy::too_many_lines)]
723    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
724        decoder: &mut D
725    ) -> Result<Self, DecodeError> {
726        let is_u8 = unty::type_equal::<T, u8>() || unty::type_equal::<T, i8>();
727        let (major, len) = if is_u8 {
728            decoder.decode_byte_slice_or_array_len()?
729        } else {
730            (4, decoder.decode_slice_len()?)
731        };
732
733        let is_bincode = matches!(
734            <D::C as crate::config::InternalFormatConfig>::FORMAT,
735            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
736        );
737        if !is_bincode && len == usize::MAX {
738            let mut vec = Self::new();
739            if is_u8 && major == 2 {
740                while decoder.reader().peek_u8() != Some(0xFF) {
741                    let chunk_len = decoder.decode_byte_slice_len()?;
742                    decoder.claim_bytes_read(chunk_len)?;
743                    let start = vec.len();
744                    // SAFETY: T is u8/i8, so it's safe to copy bytes into it.
745                    unsafe {
746                        vec.reserve(chunk_len);
747                        let ptr = vec.as_mut_ptr().add(start).cast::<u8>();
748                        let slice = core::slice::from_raw_parts_mut(ptr, chunk_len);
749                        decoder.reader().read(slice)?;
750                        vec.set_len(start + chunk_len);
751                    }
752                }
753            } else {
754                while decoder.reader().peek_u8() != Some(0xFF) {
755                    vec.push(T::borrow_decode(decoder)?);
756                }
757            }
758            decoder.reader().read_u8()?; // consume 0xFF
759            return Ok(vec);
760        }
761
762        decoder.claim_container_read::<T>(len)?;
763
764        let is_u8 = unty::type_equal::<T, u8>() || unty::type_equal::<T, i8>();
765        let is_fixed = matches!(D::C::INT_ENCODING, IntEncoding::Fixed);
766        let is_native_endian = match D::C::ENDIAN {
767            | Endianness::Little => cfg!(target_endian = "little"),
768            | Endianness::Big => cfg!(target_endian = "big"),
769        };
770
771        let is_bincode = matches!(
772            <D::C as crate::config::InternalFormatConfig>::FORMAT,
773            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
774        );
775
776        if is_bincode
777            && (is_u8
778                || (is_fixed
779                    && is_native_endian
780                    && (unty::type_equal::<T, u16>()
781                        || unty::type_equal::<T, i16>()
782                        || unty::type_equal::<T, u32>()
783                        || unty::type_equal::<T, i32>()
784                        || unty::type_equal::<T, u64>()
785                        || unty::type_equal::<T, i64>()
786                        || unty::type_equal::<T, u128>()
787                        || unty::type_equal::<T, i128>()
788                        || unty::type_equal::<T, f32>()
789                        || unty::type_equal::<T, f64>())))
790            || (!is_bincode && is_u8 && major == 2)
791        {
792            let mut vec = Self::with_capacity(len);
793            unsafe {
794                let bytes_to_read = len * core::mem::size_of::<T>();
795                let ptr = vec.as_mut_ptr().cast::<u8>();
796                let slice = core::slice::from_raw_parts_mut(ptr, bytes_to_read);
797                decoder.reader().read(slice)?;
798                vec.set_len(len);
799            }
800            Ok(vec)
801        } else {
802            let is_varint = matches!(D::C::INT_ENCODING, IntEncoding::Variable) && is_bincode;
803            let mut vec = Self::with_capacity(len);
804            let mut i = 0;
805
806            if is_varint {
807                let max_size = if unty::type_equal::<T, u16>() || unty::type_equal::<T, i16>() {
808                    Some(3)
809                } else if unty::type_equal::<T, u32>() || unty::type_equal::<T, i32>() {
810                    Some(5)
811                } else if unty::type_equal::<T, u128>() || unty::type_equal::<T, i128>() {
812                    Some(17)
813                } else if unty::type_equal::<T, u64>()
814                    || unty::type_equal::<T, i64>()
815                    || unty::type_equal::<T, usize>()
816                    || unty::type_equal::<T, isize>()
817                {
818                    Some(9)
819                } else {
820                    None
821                };
822
823                if let Some(ms) = max_size
824                    && let Some(bytes) = decoder.reader().peek_read(len * ms)
825                {
826                    let mut reader = crate::de::read::SliceReader::new(bytes);
827                    let endian = D::C::ENDIAN;
828
829                    macro_rules! borrow_mega {
830                        ($decode_fn:ident, $type:ty) => {{
831                            let v = unsafe { &mut *(&raw mut vec).cast::<Vec<$type>>() };
832                            let ptr = v.as_mut_ptr();
833                            for j in 0..len {
834                                // Architecture-specific prefetching for large batches
835                                #[cfg(target_arch = "x86_64")]
836                                unsafe {
837                                    if j % 8 == 0 {
838                                        core::arch::x86_64::_mm_prefetch(
839                                            reader.slice.as_ptr().add(64).cast::<i8>(),
840                                            core::arch::x86_64::_MM_HINT_T0,
841                                        );
842                                    }
843                                }
844                                    #[cfg(target_arch = "aarch64")]
845                                    unsafe {
846                                        if j % 8 == 0 && reader.slice.len() > 64 {
847                                            core::arch::asm!(
848                                                "prfm pldl1keep, [{ptr}]",
849                                                ptr = in(reg) reader.slice.as_ptr().add(64),
850                                                options(nostack, preserves_flags, readonly)
851                                            );
852                                        }
853                                    }
854                                unsafe {
855                                    core::ptr::write(
856                                        ptr.add(j),
857                                        crate::varint::$decode_fn(&mut reader, endian)?,
858                                    );
859                                }
860                            }
861                            unsafe {
862                                v.set_len(len);
863                            }
864                        }};
865                    }
866
867                    if unty::type_equal::<T, u64>() {
868                        borrow_mega!(varint_decode_u64, u64);
869                    } else if unty::type_equal::<T, i64>() {
870                        borrow_mega!(varint_decode_i64, i64);
871                    } else if unty::type_equal::<T, u32>() {
872                        borrow_mega!(varint_decode_u32, u32);
873                    } else if unty::type_equal::<T, i32>() {
874                        borrow_mega!(varint_decode_i32, i32);
875                    } else if unty::type_equal::<T, usize>() {
876                        borrow_mega!(varint_decode_usize, usize);
877                    } else if unty::type_equal::<T, isize>() {
878                        borrow_mega!(varint_decode_isize, isize);
879                    } else if unty::type_equal::<T, u16>() {
880                        borrow_mega!(varint_decode_u16, u16);
881                    } else if unty::type_equal::<T, i16>() {
882                        borrow_mega!(varint_decode_i16, i16);
883                    } else if unty::type_equal::<T, u128>() {
884                        borrow_mega!(varint_decode_u128, u128);
885                    } else if unty::type_equal::<T, i128>() {
886                        borrow_mega!(varint_decode_i128, i128);
887                    }
888
889                    let consumed = bytes.len() - reader.slice.len();
890                    decoder.reader().consume(consumed);
891                    if <D::C as crate::config::InternalLimitConfig>::LIMIT.is_some() {
892                        decoder.unclaim_bytes_read(len * core::mem::size_of::<T>() - consumed);
893                    }
894                    return Ok(vec);
895                }
896            }
897
898            if is_native_endian
899                && !is_fixed
900                && (unty::type_equal::<T, u32>()
901                    || unty::type_equal::<T, i32>()
902                    || unty::type_equal::<T, u64>()
903                    || unty::type_equal::<T, i64>()
904                    || unty::type_equal::<T, usize>()
905                    || unty::type_equal::<T, isize>())
906                && let Some(bytes) = decoder.reader().peek_read(len)
907            {
908                let scan = crate::varint::simd::scan_single_byte_varints(bytes);
909                let to_decode = scan.single_byte_count.min(len);
910                if to_decode > 0 {
911                    macro_rules! borrow_simd {
912                        ($type:ty, $cast:expr) => {{
913                            let v = unsafe { &mut *(&raw mut vec).cast::<Vec<$type>>() };
914                            let ptr = v.as_mut_ptr();
915                            for j in 0..to_decode {
916                                let b = bytes[j];
917                                unsafe {
918                                    core::ptr::write(ptr.add(j), $cast(b));
919                                }
920                            }
921                            unsafe {
922                                v.set_len(to_decode);
923                            }
924                        }};
925                    }
926                    if unty::type_equal::<T, u32>() {
927                        borrow_simd!(u32, u32::from);
928                    } else if unty::type_equal::<T, i32>() {
929                        borrow_simd!(i32, |b: u8| i32::from(b >> 1) ^ (-i32::from(b & 1)));
930                    } else if unty::type_equal::<T, u64>() {
931                        borrow_simd!(u64, u64::from);
932                    } else if unty::type_equal::<T, i64>() {
933                        borrow_simd!(i64, |b: u8| i64::from(b >> 1) ^ (-i64::from(b & 1)));
934                    } else if unty::type_equal::<T, usize>() {
935                        borrow_simd!(usize, usize::from);
936                    } else if unty::type_equal::<T, isize>() {
937                        borrow_simd!(isize, |b: u8| {
938                            isize::from(b >> 1) ^ (-isize::from(b & 1))
939                        });
940                    }
941
942                    decoder.reader().consume(to_decode);
943                    if <D::C as crate::config::InternalLimitConfig>::LIMIT.is_some() {
944                        decoder.unclaim_bytes_read(to_decode * core::mem::size_of::<T>());
945                    }
946                    i = to_decode;
947                }
948            }
949
950            for _ in i..len {
951                vec.push(T::borrow_decode(decoder)?);
952            }
953            Ok(vec)
954        }
955    }
956}
957
958impl<T> Encode for Vec<T>
959where
960    T: Encode,
961{
962    #[inline]
963    fn encode<E: Encoder>(
964        &self,
965        encoder: &mut E,
966    ) -> Result<(), EncodeError> {
967        let is_u8 = unty::type_equal::<T, u8>() || unty::type_equal::<T, i8>();
968        let is_bincode = matches!(
969            <E::C as crate::config::InternalFormatConfig>::FORMAT,
970            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
971        );
972        let is_fixed = matches!(E::C::INT_ENCODING, IntEncoding::Fixed);
973        let is_native_endian = match E::C::ENDIAN {
974            | Endianness::Little => cfg!(target_endian = "little"),
975            | Endianness::Big => cfg!(target_endian = "big"),
976        };
977
978        encoder.encode_slice_len(self.len())?;
979        if is_bincode
980            && (is_u8
981                || (is_native_endian
982                    && (unty::type_equal::<T, f32>()
983                        || unty::type_equal::<T, f64>()
984                        || (is_fixed
985                            && (unty::type_equal::<T, u16>()
986                                || unty::type_equal::<T, i16>()
987                                || unty::type_equal::<T, u32>()
988                                || unty::type_equal::<T, i32>()
989                                || unty::type_equal::<T, u64>()
990                                || unty::type_equal::<T, i64>()
991                                || unty::type_equal::<T, u128>()
992                                || unty::type_equal::<T, i128>())))))
993        {
994            let bytes_to_copy = self.len() * core::mem::size_of::<T>();
995            // SAFETY: T is a primitive type (pod), so it's safe to copy its bytes.
996            unsafe {
997                let slice_ptr = self.as_ptr().cast::<u8>();
998                let slice = core::slice::from_raw_parts(slice_ptr, bytes_to_copy);
999                encoder.writer().write(slice)?;
1000            }
1001        } else {
1002            for item in self {
1003                item.encode(encoder)?;
1004            }
1005        }
1006        Ok(())
1007    }
1008}
1009
1010impl<Context> Decode<Context> for String {
1011    #[inline(always)]
1012    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
1013        let len = decoder.decode_str_len()?;
1014        let is_bincode = matches!(
1015            <D::C as crate::config::InternalFormatConfig>::FORMAT,
1016            crate::config::Format::Bincode | crate::config::Format::BincodeDeterministic
1017        );
1018        if !is_bincode && len == usize::MAX {
1019            let mut vec = Vec::new();
1020            while decoder.reader().peek_u8() != Some(0xFF) {
1021                vec.push(u8::decode(decoder)?);
1022            }
1023            decoder.reader().read_u8()?; // consume 0xFF
1024            return Self::from_utf8(vec).map_err(|e| {
1025                crate::error::cold_decode_error_utf8::<()>(e.utf8_error()).unwrap_err()
1026            });
1027        }
1028        decoder.claim_container_read::<u8>(len)?;
1029        let mut bytes = Vec::with_capacity(len);
1030        unsafe {
1031            let ptr = bytes.as_mut_ptr();
1032            decoder
1033                .reader()
1034                .read(core::slice::from_raw_parts_mut(ptr, len))?;
1035            bytes.set_len(len);
1036        }
1037        Self::from_utf8(bytes)
1038            .map_err(|e| crate::error::cold_decode_error_utf8::<()>(e.utf8_error()).unwrap_err())
1039    }
1040}
1041impl_borrow_decode!(String);
1042
1043impl<Context> Decode<Context> for Box<str> {
1044    #[inline(always)]
1045    fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
1046        String::decode(decoder).map(String::into_boxed_str)
1047    }
1048}
1049impl_borrow_decode!(Box<str>);
1050
1051impl Encode for String {
1052    #[inline(always)]
1053    fn encode<E: Encoder>(
1054        &self,
1055        encoder: &mut E,
1056    ) -> Result<(), EncodeError> {
1057        encoder.encode_str(self.as_str())
1058    }
1059}
1060
1061impl<Context, T> Decode<Context> for Box<T>
1062where
1063    T: Decode<Context>,
1064{
1065    #[inline(always)]
1066    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
1067        let t = T::decode(decoder)?;
1068        Ok(Self::new(t))
1069    }
1070}
1071impl<'de, T, Context> BorrowDecode<'de, Context> for Box<T>
1072where
1073    T: BorrowDecode<'de, Context>,
1074{
1075    #[inline(always)]
1076    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
1077        decoder: &mut D
1078    ) -> Result<Self, DecodeError> {
1079        let t = T::borrow_decode(decoder)?;
1080        Ok(Self::new(t))
1081    }
1082}
1083
1084impl<T> Encode for Box<T>
1085where
1086    T: Encode + ?Sized,
1087{
1088    #[inline(always)]
1089    fn encode<E: Encoder>(
1090        &self,
1091        encoder: &mut E,
1092    ) -> Result<(), EncodeError> {
1093        T::encode(self, encoder)
1094    }
1095}
1096
1097impl<Context, T> Decode<Context> for Box<[T]>
1098where
1099    T: Decode<Context> + 'static,
1100{
1101    #[inline(always)]
1102    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
1103        let vec = Vec::decode(decoder)?;
1104        Ok(vec.into_boxed_slice())
1105    }
1106}
1107
1108impl<'de, T, Context> BorrowDecode<'de, Context> for Box<[T]>
1109where
1110    T: BorrowDecode<'de, Context> + 'de,
1111{
1112    #[inline(always)]
1113    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
1114        decoder: &mut D
1115    ) -> Result<Self, DecodeError> {
1116        let vec = Vec::borrow_decode(decoder)?;
1117        Ok(vec.into_boxed_slice())
1118    }
1119}
1120
1121impl<Context, T> Decode<Context> for Cow<'_, T>
1122where
1123    T: ToOwned + ?Sized,
1124    <T as ToOwned>::Owned: Decode<Context>,
1125{
1126    #[inline(always)]
1127    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
1128        let t = <T as ToOwned>::Owned::decode(decoder)?;
1129        Ok(Cow::Owned(t))
1130    }
1131}
1132impl<'cow, T, Context> BorrowDecode<'cow, Context> for Cow<'cow, T>
1133where
1134    T: ToOwned + ?Sized,
1135    &'cow T: BorrowDecode<'cow, Context>,
1136{
1137    #[inline(always)]
1138    fn borrow_decode<D: BorrowDecoder<'cow, Context = Context>>(
1139        decoder: &mut D
1140    ) -> Result<Self, DecodeError> {
1141        let t = <&T>::borrow_decode(decoder)?;
1142        Ok(Cow::Borrowed(t))
1143    }
1144}
1145
1146impl<T> Encode for Cow<'_, T>
1147where
1148    T: ToOwned + ?Sized,
1149    for<'a> &'a T: Encode,
1150{
1151    #[inline(always)]
1152    fn encode<E: Encoder>(
1153        &self,
1154        encoder: &mut E,
1155    ) -> Result<(), EncodeError> {
1156        self.as_ref().encode(encoder)
1157    }
1158}
1159
1160#[test]
1161fn test_cow_round_trip() {
1162    let start = Cow::Borrowed("Foo");
1163    let encoded = crate::encode_to_vec(&start, crate::config::standard()).unwrap();
1164    let (end, _) =
1165        crate::borrow_decode_from_slice::<Cow<'_, str>, _>(&encoded, crate::config::standard())
1166            .unwrap();
1167    assert_eq!(start, end);
1168    let (end, _) =
1169        crate::decode_from_slice::<Cow<'_, str>, _>(&encoded, crate::config::standard()).unwrap();
1170    assert_eq!(start, end);
1171}
1172
1173impl<Context, T> Decode<Context> for Rc<T>
1174where
1175    T: Decode<Context>,
1176{
1177    #[inline(always)]
1178    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
1179        let t = T::decode(decoder)?;
1180        Ok(Self::new(t))
1181    }
1182}
1183
1184impl<Context> Decode<Context> for Rc<str> {
1185    #[inline(always)]
1186    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
1187        let string = String::decode(decoder)?;
1188        Ok(string.into())
1189    }
1190}
1191
1192impl<'de, T, Context> BorrowDecode<'de, Context> for Rc<T>
1193where
1194    T: BorrowDecode<'de, Context>,
1195{
1196    #[inline(always)]
1197    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
1198        decoder: &mut D
1199    ) -> Result<Self, DecodeError> {
1200        let t = T::borrow_decode(decoder)?;
1201        Ok(Self::new(t))
1202    }
1203}
1204
1205impl<'de, Context> BorrowDecode<'de, Context> for Rc<str> {
1206    #[inline(always)]
1207    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
1208        decoder: &mut D
1209    ) -> Result<Self, DecodeError> {
1210        let string = String::decode(decoder)?;
1211        Ok(string.into())
1212    }
1213}
1214
1215impl<T> Encode for Rc<T>
1216where
1217    T: Encode + ?Sized,
1218{
1219    #[inline(always)]
1220    fn encode<E: Encoder>(
1221        &self,
1222        encoder: &mut E,
1223    ) -> Result<(), EncodeError> {
1224        T::encode(self, encoder)
1225    }
1226}
1227
1228impl<Context, T> Decode<Context> for Rc<[T]>
1229where
1230    T: Decode<Context> + 'static,
1231{
1232    #[inline(always)]
1233    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
1234        let vec = Vec::decode(decoder)?;
1235        Ok(vec.into())
1236    }
1237}
1238
1239impl<'de, T, Context> BorrowDecode<'de, Context> for Rc<[T]>
1240where
1241    T: BorrowDecode<'de, Context> + 'de,
1242{
1243    #[inline(always)]
1244    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
1245        decoder: &mut D
1246    ) -> Result<Self, DecodeError> {
1247        let vec = Vec::borrow_decode(decoder)?;
1248        Ok(vec.into())
1249    }
1250}
1251
1252#[cfg(target_has_atomic = "ptr")]
1253impl<Context, T> Decode<Context> for Arc<T>
1254where
1255    T: Decode<Context>,
1256{
1257    #[inline(always)]
1258    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
1259        let t = T::decode(decoder)?;
1260        Ok(Self::new(t))
1261    }
1262}
1263
1264#[cfg(target_has_atomic = "ptr")]
1265impl<Context> Decode<Context> for Arc<str> {
1266    #[inline(always)]
1267    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
1268        let string = String::decode(decoder)?;
1269        Ok(string.into())
1270    }
1271}
1272
1273#[cfg(target_has_atomic = "ptr")]
1274impl<'de, T, Context> BorrowDecode<'de, Context> for Arc<T>
1275where
1276    T: BorrowDecode<'de, Context>,
1277{
1278    #[inline(always)]
1279    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
1280        decoder: &mut D
1281    ) -> Result<Self, DecodeError> {
1282        let t = T::borrow_decode(decoder)?;
1283        Ok(Self::new(t))
1284    }
1285}
1286
1287#[cfg(target_has_atomic = "ptr")]
1288impl<'de, Context> BorrowDecode<'de, Context> for Arc<str> {
1289    #[inline(always)]
1290    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
1291        decoder: &mut D
1292    ) -> Result<Self, DecodeError> {
1293        let string = String::decode(decoder)?;
1294        Ok(string.into())
1295    }
1296}
1297
1298#[cfg(target_has_atomic = "ptr")]
1299impl<T> Encode for Arc<T>
1300where
1301    T: Encode + ?Sized,
1302{
1303    #[inline(always)]
1304    fn encode<E: Encoder>(
1305        &self,
1306        encoder: &mut E,
1307    ) -> Result<(), EncodeError> {
1308        T::encode(self, encoder)
1309    }
1310}
1311
1312#[cfg(target_has_atomic = "ptr")]
1313impl<Context, T> Decode<Context> for Arc<[T]>
1314where
1315    T: Decode<Context> + 'static,
1316{
1317    #[inline(always)]
1318    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
1319        let vec = Vec::decode(decoder)?;
1320        Ok(vec.into())
1321    }
1322}
1323
1324#[cfg(target_has_atomic = "ptr")]
1325impl<'de, T, Context> BorrowDecode<'de, Context> for Arc<[T]>
1326where
1327    T: BorrowDecode<'de, Context> + 'de,
1328{
1329    #[inline(always)]
1330    fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
1331        decoder: &mut D
1332    ) -> Result<Self, DecodeError> {
1333        let vec = Vec::borrow_decode(decoder)?;
1334        Ok(vec.into())
1335    }
1336}