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#[derive(Default)]
39pub struct VecWriter {
40 inner: Vec<u8>,
41}
42
43impl VecWriter {
44 #[must_use]
46 pub fn with_capacity(cap: usize) -> Self {
47 Self {
48 inner: Vec::with_capacity(cap),
49 }
50 }
51
52 #[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#[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 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()?; 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()?; 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()?; 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()?; 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 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 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()?; 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 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 #[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 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()?; 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 #[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 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()?; 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}