MCPcopy Create free account
hub / github.com/apache/arrow-rs / extend_from_iter

Method extend_from_iter

arrow-buffer/src/buffer/mutable.rs:902–931  ·  view source on GitHub ↗
(
        &mut self,
        mut iterator: I,
    )

Source from the content-addressed store, hash-verified

900impl 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.

Callers 2

extendMethod · 0.45
from_iterMethod · 0.45

Calls 8

to_byte_sliceMethod · 0.80
size_hintMethod · 0.45
reserveMethod · 0.45
addMethod · 0.45
as_ptrMethod · 0.45
sizeMethod · 0.45
nextMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected