| 900 | impl MutableBuffer { |
| 901 | #[inline] |
| 902 | pub(super) fn extend_from_iter<T: ArrowNativeType, I: Iterator<Item = T>>( |
| 903 | &mut self, |
| 904 | mut iterator: I, |
| 905 | ) { |
| 906 | let item_size = std::mem::size_of::<T>(); |
| 907 | let (lower, _) = iterator.size_hint(); |
| 908 | let additional = lower * item_size; |
| 909 | self.reserve(additional); |
| 910 | |
| 911 | // this is necessary because of https://github.com/rust-lang/rust/issues/32155 |
| 912 | let mut len = SetLenOnDrop::new(&mut self.len); |
| 913 | let mut dst = unsafe { self.data.as_ptr().add(len.local_len) }; |
| 914 | let capacity = self.layout.size(); |
| 915 | |
| 916 | while len.local_len + item_size <= capacity { |
| 917 | if let Some(item) = iterator.next() { |
| 918 | unsafe { |
| 919 | let src = item.to_byte_slice().as_ptr(); |
| 920 | std::ptr::copy_nonoverlapping(src, dst, item_size); |
| 921 | dst = dst.add(item_size); |
| 922 | } |
| 923 | len.local_len += item_size; |
| 924 | } else { |
| 925 | break; |
| 926 | } |
| 927 | } |
| 928 | drop(len); |
| 929 | |
| 930 | iterator.for_each(|item| self.push(item)); |
| 931 | } |
| 932 | |
| 933 | /// Creates a [`MutableBuffer`] from an [`Iterator`] with a trusted (upper) length. |
| 934 | /// Prefer this to `collect` whenever possible, as it is faster ~60% faster. |