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

Method extend_bool_trusted_len

arrow-buffer/src/buffer/mutable.rs:721–838  ·  view source on GitHub ↗
(
        &mut self,
        mut iter: I,
        offset: usize,
    )

Source from the content-addressed store, hash-verified

719 /// Callers must ensure that `iter` reports an exact size via `size_hint`.
720 #[inline]
721 pub unsafe fn extend_bool_trusted_len<I: Iterator<Item = bool>>(
722 &mut self,
723 mut iter: I,
724 offset: usize,
725 ) {
726 let (lower, upper) = iter.size_hint();
727 let len = upper.expect("Iterator must have exact size_hint");
728 assert_eq!(lower, len, "Iterator must have exact size_hint");
729 debug_assert!(
730 offset <= self.len * 8,
731 "offset must be <= buffer length in bits"
732 );
733
734 if len == 0 {
735 return;
736 }
737
738 let start_len = offset;
739 let end_bit = start_len + len;
740
741 // SAFETY: we will initialize all newly exposed bytes before they are read
742 let new_len_bytes = bit_util::ceil(end_bit, 8);
743 if new_len_bytes > self.len {
744 self.reserve(new_len_bytes - self.len);
745 // SAFETY: caller will initialize all newly exposed bytes before they are read
746 unsafe { self.set_len(new_len_bytes) };
747 }
748
749 let slice = self.as_slice_mut();
750
751 let mut bit_idx = start_len;
752
753 // ---- Unaligned prefix: advance to the next 64-bit boundary ----
754 let misalignment = bit_idx & 63;
755 let prefix_bits = if misalignment == 0 {
756 0
757 } else {
758 (64 - misalignment).min(end_bit - bit_idx)
759 };
760
761 if prefix_bits != 0 {
762 let byte_start = bit_idx / 8;
763 let byte_end = bit_util::ceil(bit_idx + prefix_bits, 8);
764 let bit_offset = bit_idx % 8;
765
766 // Clear any newly-visible bits in the existing partial byte
767 if bit_offset != 0 {
768 let keep_mask = (1u8 << bit_offset).wrapping_sub(1);
769 slice[byte_start] &= keep_mask;
770 }
771
772 // Zero any new bytes we will partially fill in this prefix
773 let zero_from = if bit_offset == 0 {
774 byte_start
775 } else {
776 byte_start + 1
777 };
778 if byte_end > zero_from {

Callers 1

extend_trusted_lenMethod · 0.80

Calls 8

set_lenMethod · 0.80
ceilFunction · 0.50
size_hintMethod · 0.45
reserveMethod · 0.45
as_slice_mutMethod · 0.45
wrapping_subMethod · 0.45
nextMethod · 0.45
to_le_bytesMethod · 0.45

Tested by

no test coverage detected