(
&mut self,
i: I,
)
| 78 | /// Copy fixed size slices. Much faster than memcpy. |
| 79 | #[inline(never)] |
| 80 | fn encode_vectored_max_len<'a, I: Iterator<Item = &'a [T]> + Clone, const N: usize>( |
| 81 | &mut self, |
| 82 | i: I, |
| 83 | ) where |
| 84 | T: 'a, |
| 85 | { |
| 86 | unsafe { |
| 87 | let primitives = self.elements.as_primitive().unwrap(); |
| 88 | primitives.reserve(i.size_hint().1.unwrap() * N); |
| 89 | |
| 90 | let mut dst = primitives.end_ptr(); |
| 91 | if self.lengths.encode_vectored_max_len::<_, N>( |
| 92 | i.clone(), |
| 93 | #[inline(always)] |
| 94 | |s| { |
| 95 | let src = s.as_ptr(); |
| 96 | let n = s.len(); |
| 97 | // Safety: encode_vectored_max_len skips len == 0 and ensures len <= N. |
| 98 | // `dst` has enough space for `[T; N]` because we've reserved size_hint * N. |
| 99 | unsafe_wild_copy!([T; N], src, dst, n); |
| 100 | dst = dst.add(n); |
| 101 | }, |
| 102 | ) { |
| 103 | // Use fallback for impls that copy more than 64 bytes. |
| 104 | let size = std::mem::size_of::<T>(); |
| 105 | self.vectored_impl = std::mem::transmute(match N { |
| 106 | 1 if size <= 32 => Self::encode_vectored_max_len::<I, 2>, |
| 107 | 2 if size <= 16 => Self::encode_vectored_max_len::<I, 4>, |
| 108 | 4 if size <= 8 => Self::encode_vectored_max_len::<I, 8>, |
| 109 | 8 if size <= 4 => Self::encode_vectored_max_len::<I, 16>, |
| 110 | 16 if size <= 2 => Self::encode_vectored_max_len::<I, 32>, |
| 111 | 32 if size <= 1 => Self::encode_vectored_max_len::<I, 64>, |
| 112 | _ => Self::encode_vectored_fallback::<I>, |
| 113 | } as fn(&mut Self, I)); |
| 114 | let f: fn(&mut Self, I) = std::mem::transmute(self.vectored_impl); |
| 115 | f(self, i); |
| 116 | return; |
| 117 | } |
| 118 | primitives.set_end_ptr(dst); |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | /// Fallback for when length > [`Self::encode_vectored_max_len`]'s max_len. |
| 123 | #[inline(never)] |
nothing calls this directly
no test coverage detected