1use std::alloc::Layout;
19use std::fmt::Debug;
20use std::ptr::NonNull;
21use std::sync::Arc;
22
23use crate::BufferBuilder;
24use crate::alloc::{Allocation, Deallocation};
25use crate::util::bit_chunk_iterator::{BitChunks, UnalignedBitChunk};
26use crate::{bit_util, bytes::Bytes, native::ArrowNativeType};
27
28#[cfg(feature = "pool")]
29use crate::pool::MemoryPool;
30
31use super::{MutableBuffer, ScalarBuffer};
32
33#[derive(Clone, Debug)]
83pub struct Buffer {
84 data: Arc<Bytes>,
86
87 ptr: *const u8,
92
93 length: usize,
97}
98
99impl Default for Buffer {
100 #[inline]
101 fn default() -> Self {
102 MutableBuffer::default().into()
103 }
104}
105
106impl PartialEq for Buffer {
107 fn eq(&self, other: &Self) -> bool {
108 self.as_slice().eq(other.as_slice())
109 }
110}
111
112impl Eq for Buffer {}
113
114unsafe impl Send for Buffer where Bytes: Send {}
115unsafe impl Sync for Buffer where Bytes: Sync {}
116
117impl Buffer {
118 pub fn ptr_offset(&self) -> usize {
122 unsafe { self.ptr.offset_from(self.data.ptr().as_ptr()) as usize }
124 }
125
126 pub fn data_ptr(&self) -> NonNull<u8> {
128 self.data.ptr()
129 }
130
131 pub fn strong_count(&self) -> usize {
137 Arc::strong_count(&self.data)
138 }
139
140 #[inline]
142 pub fn from_vec<T: ArrowNativeType>(vec: Vec<T>) -> Self {
143 MutableBuffer::from(vec).into()
144 }
145
146 pub fn from_slice_ref<U: ArrowNativeType, T: AsRef<[U]>>(items: T) -> Self {
148 let slice = items.as_ref();
149 let capacity = std::mem::size_of_val(slice);
150 let mut buffer = MutableBuffer::with_capacity(capacity);
151 buffer.extend_from_slice(slice);
152 buffer.into()
153 }
154
155 pub unsafe fn from_custom_allocation(
171 ptr: NonNull<u8>,
172 len: usize,
173 owner: Arc<dyn Allocation>,
174 ) -> Self {
175 unsafe { Buffer::build_with_arguments(ptr, len, Deallocation::Custom(owner, len)) }
176 }
177
178 unsafe fn build_with_arguments(
180 ptr: NonNull<u8>,
181 len: usize,
182 deallocation: Deallocation,
183 ) -> Self {
184 let bytes = unsafe { Bytes::new(ptr, len, deallocation) };
185 let ptr = bytes.as_ptr();
186 Buffer {
187 ptr,
188 data: Arc::new(bytes),
189 length: len,
190 }
191 }
192
193 #[inline]
195 pub fn len(&self) -> usize {
196 self.length
197 }
198
199 #[inline]
202 pub fn capacity(&self) -> usize {
203 self.data.capacity()
204 }
205
206 pub fn shrink_to_fit(&mut self) {
216 let offset = self.ptr_offset();
217 let is_empty = self.is_empty();
218 let desired_capacity = if is_empty {
219 0
220 } else {
221 offset + self.len()
223 };
224 if desired_capacity < self.capacity()
225 && let Some(bytes) = Arc::get_mut(&mut self.data)
226 {
227 if bytes.try_realloc(desired_capacity).is_ok() {
228 self.ptr = if is_empty {
230 bytes.as_ptr()
231 } else {
232 unsafe { bytes.as_ptr().add(offset) }
234 }
235 } else {
236 }
238 }
239 }
240
241 #[inline]
243 pub fn is_empty(&self) -> bool {
244 self.length == 0
245 }
246
247 pub fn as_slice(&self) -> &[u8] {
249 unsafe { std::slice::from_raw_parts(self.ptr, self.length) }
250 }
251
252 pub(crate) fn deallocation(&self) -> &Deallocation {
253 self.data.deallocation()
254 }
255
256 pub fn slice(&self, offset: usize) -> Self {
265 let mut s = self.clone();
266 s.advance(offset);
267 s
268 }
269
270 #[inline]
276 pub fn advance(&mut self, offset: usize) {
277 assert!(
278 offset <= self.length,
279 "the offset of the new Buffer cannot exceed the existing length: offset={} length={}",
280 offset,
281 self.length
282 );
283 self.length -= offset;
284 self.ptr = unsafe { self.ptr.add(offset) };
289 }
290
291 pub fn slice_with_length(&self, offset: usize, length: usize) -> Self {
300 assert!(
301 offset.saturating_add(length) <= self.length,
302 "the offset of the new Buffer cannot exceed the existing length: slice offset={offset} length={length} selflen={}",
303 self.length
304 );
305 let ptr = unsafe { self.ptr.add(offset) };
308 Self {
309 data: self.data.clone(),
310 ptr,
311 length,
312 }
313 }
314
315 #[inline]
320 pub fn as_ptr(&self) -> *const u8 {
321 self.ptr
322 }
323
324 pub fn typed_data<T: ArrowNativeType>(&self) -> &[T] {
331 let (prefix, offsets, suffix) = unsafe { self.as_slice().align_to::<T>() };
335 assert!(prefix.is_empty() && suffix.is_empty());
336 offsets
337 }
338
339 pub fn bit_slice(&self, offset: usize, len: usize) -> Self {
347 if offset.is_multiple_of(8) {
348 return self.slice_with_length(offset / 8, bit_util::ceil(len, 8));
349 }
350
351 let chunks = self.bit_chunks(offset, len);
352
353 let buffer: Vec<u64> = if chunks.remainder_len() > 0 {
354 chunks.iter().chain(Some(chunks.remainder_bits())).collect()
355 } else {
356 chunks.iter().collect()
357 };
358 let mut buffer = Buffer::from_vec(buffer);
359 buffer.length = bit_util::ceil(len, 8);
361 buffer
362 }
363
364 pub fn bit_chunks(&self, offset: usize, len: usize) -> BitChunks<'_> {
368 BitChunks::new(self.as_slice(), offset, len)
369 }
370
371 pub fn count_set_bits_offset(&self, offset: usize, len: usize) -> usize {
374 UnalignedBitChunk::new(self.as_slice(), offset, len).count_ones()
375 }
376
377 pub fn into_mutable(self) -> Result<MutableBuffer, Self> {
400 let ptr = self.ptr;
401 let length = self.length;
402
403 let res = if self.ptr_offset() > 0 {
405 Err(self.data)
406 } else {
407 Arc::try_unwrap(self.data)
408 };
409
410 res.and_then(|bytes| {
411 assert_eq!(ptr, bytes.ptr().as_ptr());
413 MutableBuffer::from_bytes(bytes).map_err(Arc::new)
414 })
415 .map_err(|bytes| Buffer {
416 data: bytes,
417 ptr,
418 length,
419 })
420 .map(|mut mutable| {
421 unsafe { mutable.set_len(length) };
424 mutable
425 })
426 }
427
428 pub fn into_vec<T: ArrowNativeType>(self) -> Result<Vec<T>, Self> {
439 let layout = match self.data.deallocation() {
440 Deallocation::Standard(l) => l,
441 _ => return Err(self), };
443
444 if self.ptr != self.data.as_ptr() {
445 return Err(self); }
447
448 let v_capacity = layout.size() / std::mem::size_of::<T>();
449 match Layout::array::<T>(v_capacity) {
450 Ok(expected) if layout == &expected => {}
451 _ => return Err(self), }
453
454 let length = self.length;
455 let ptr = self.ptr;
456 let v_len = self.length / std::mem::size_of::<T>();
457
458 Arc::try_unwrap(self.data)
459 .map(|bytes| unsafe {
460 let ptr = bytes.ptr().as_ptr() as _;
461 std::mem::forget(bytes);
462 Vec::from_raw_parts(ptr, v_len, v_capacity)
465 })
466 .map_err(|bytes| Buffer {
467 data: bytes,
468 ptr,
469 length,
470 })
471 }
472
473 #[inline]
477 pub fn ptr_eq(&self, other: &Self) -> bool {
478 self.ptr == other.ptr && self.length == other.length
479 }
480
481 #[cfg(feature = "pool")]
488 pub fn claim(&self, pool: &dyn MemoryPool) {
489 self.data.claim(pool)
490 }
491}
492
493impl From<&[u8]> for Buffer {
502 fn from(p: &[u8]) -> Self {
503 Self::from_slice_ref(p)
504 }
505}
506
507impl<const N: usize> From<[u8; N]> for Buffer {
508 fn from(p: [u8; N]) -> Self {
509 Self::from_slice_ref(p)
510 }
511}
512
513impl<const N: usize> From<&[u8; N]> for Buffer {
514 fn from(p: &[u8; N]) -> Self {
515 Self::from_slice_ref(p)
516 }
517}
518
519impl<T: ArrowNativeType> From<Vec<T>> for Buffer {
520 fn from(value: Vec<T>) -> Self {
521 Self::from_vec(value)
522 }
523}
524
525impl<T: ArrowNativeType> From<ScalarBuffer<T>> for Buffer {
526 fn from(value: ScalarBuffer<T>) -> Self {
527 value.into_inner()
528 }
529}
530
531impl From<Bytes> for Buffer {
533 #[inline]
534 fn from(bytes: Bytes) -> Self {
535 let length = bytes.len();
536 let ptr = bytes.as_ptr();
537 Self {
538 data: Arc::new(bytes),
539 ptr,
540 length,
541 }
542 }
543}
544
545impl From<bytes::Bytes> for Buffer {
547 fn from(bytes: bytes::Bytes) -> Self {
548 let bytes: Bytes = bytes.into();
549 Self::from(bytes)
550 }
551}
552
553impl From<Buffer> for bytes::Bytes {
555 fn from(buffer: Buffer) -> Self {
556 Self::from_owner(buffer)
557 }
558}
559
560impl FromIterator<bool> for Buffer {
562 fn from_iter<I>(iter: I) -> Self
563 where
564 I: IntoIterator<Item = bool>,
565 {
566 MutableBuffer::from_iter(iter).into()
567 }
568}
569
570impl std::ops::Deref for Buffer {
571 type Target = [u8];
572
573 fn deref(&self) -> &[u8] {
574 unsafe { std::slice::from_raw_parts(self.as_ptr(), self.len()) }
575 }
576}
577
578impl AsRef<[u8]> for Buffer {
579 fn as_ref(&self) -> &[u8] {
580 self.as_slice()
581 }
582}
583
584impl From<MutableBuffer> for Buffer {
585 #[inline]
586 fn from(buffer: MutableBuffer) -> Self {
587 buffer.into_buffer()
588 }
589}
590
591impl<T: ArrowNativeType> From<BufferBuilder<T>> for Buffer {
592 fn from(mut value: BufferBuilder<T>) -> Self {
593 value.finish()
594 }
595}
596
597impl Buffer {
598 #[inline]
618 pub unsafe fn from_trusted_len_iter<T: ArrowNativeType, I: Iterator<Item = T>>(
619 iterator: I,
620 ) -> Self {
621 unsafe { MutableBuffer::from_trusted_len_iter(iterator).into() }
622 }
623
624 #[inline]
631 pub unsafe fn try_from_trusted_len_iter<
632 E,
633 T: ArrowNativeType,
634 I: Iterator<Item = Result<T, E>>,
635 >(
636 iterator: I,
637 ) -> Result<Self, E> {
638 unsafe { Ok(MutableBuffer::try_from_trusted_len_iter(iterator)?.into()) }
639 }
640}
641
642impl<T: ArrowNativeType> FromIterator<T> for Buffer {
643 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
644 let vec = Vec::from_iter(iter);
645 Buffer::from_vec(vec)
646 }
647}
648
649#[cfg(test)]
650mod tests {
651 use crate::i256;
652 use std::panic::{RefUnwindSafe, UnwindSafe};
653 use std::thread;
654
655 use super::*;
656
657 #[test]
658 fn test_buffer_data_equality() {
659 let buf1 = Buffer::from(&[0, 1, 2, 3, 4]);
660 let buf2 = Buffer::from(&[0, 1, 2, 3, 4]);
661 assert_eq!(buf1, buf2);
662
663 let buf3 = buf1.slice(2);
665 assert_ne!(buf1, buf3);
666 let buf4 = buf2.slice_with_length(2, 3);
667 assert_eq!(buf3, buf4);
668
669 let mut buf2 = MutableBuffer::new(65);
671 buf2.extend_from_slice(&[0u8, 1, 2, 3, 4]);
672
673 let buf2 = buf2.into();
674 assert_eq!(buf1, buf2);
675
676 let buf2 = Buffer::from(&[0, 0, 2, 3, 4]);
678 assert_ne!(buf1, buf2);
679
680 let buf2 = Buffer::from(&[0, 1, 2, 3]);
682 assert_ne!(buf1, buf2);
683 }
684
685 #[test]
686 fn test_from_raw_parts() {
687 let buf = Buffer::from(&[0, 1, 2, 3, 4]);
688 assert_eq!(5, buf.len());
689 assert!(!buf.as_ptr().is_null());
690 assert_eq!([0, 1, 2, 3, 4], buf.as_slice());
691 }
692
693 #[test]
694 fn test_from_vec() {
695 let buf = Buffer::from(&[0, 1, 2, 3, 4]);
696 assert_eq!(5, buf.len());
697 assert!(!buf.as_ptr().is_null());
698 assert_eq!([0, 1, 2, 3, 4], buf.as_slice());
699 }
700
701 #[test]
702 fn test_copy() {
703 let buf = Buffer::from(&[0, 1, 2, 3, 4]);
704 let buf2 = buf;
705 assert_eq!(5, buf2.len());
706 assert_eq!(64, buf2.capacity());
707 assert!(!buf2.as_ptr().is_null());
708 assert_eq!([0, 1, 2, 3, 4], buf2.as_slice());
709 }
710
711 #[test]
712 fn test_slice() {
713 let buf = Buffer::from(&[2, 4, 6, 8, 10]);
714 let buf2 = buf.slice(2);
715
716 assert_eq!([6, 8, 10], buf2.as_slice());
717 assert_eq!(3, buf2.len());
718 assert_eq!(unsafe { buf.as_ptr().add(2) }, buf2.as_ptr());
719
720 let buf3 = buf2.slice_with_length(1, 2);
721 assert_eq!([8, 10], buf3.as_slice());
722 assert_eq!(2, buf3.len());
723 assert_eq!(unsafe { buf.as_ptr().add(3) }, buf3.as_ptr());
724
725 let buf4 = buf.slice(5);
726 let empty_slice: [u8; 0] = [];
727 assert_eq!(empty_slice, buf4.as_slice());
728 assert_eq!(0, buf4.len());
729 assert!(buf4.is_empty());
730 assert_eq!(buf2.slice_with_length(2, 1).as_slice(), &[10]);
731 }
732
733 #[test]
734 fn test_shrink_to_fit() {
735 let original = Buffer::from(&[0, 1, 2, 3, 4, 5, 6, 7]);
736 assert_eq!(original.as_slice(), &[0, 1, 2, 3, 4, 5, 6, 7]);
737 assert_eq!(original.capacity(), 64);
738
739 let slice = original.slice_with_length(2, 3);
740 drop(original); assert_eq!(slice.as_slice(), &[2, 3, 4]);
742 assert_eq!(slice.capacity(), 64);
743
744 let mut shrunk = slice;
745 shrunk.shrink_to_fit();
746 assert_eq!(shrunk.as_slice(), &[2, 3, 4]);
747 assert_eq!(shrunk.capacity(), 5); let empty_slice = shrunk.slice_with_length(1, 0);
751 drop(shrunk); assert_eq!(empty_slice.as_slice(), &[]);
753 assert_eq!(empty_slice.capacity(), 5);
754
755 let mut shrunk_empty = empty_slice;
756 shrunk_empty.shrink_to_fit();
757 assert_eq!(shrunk_empty.as_slice(), &[]);
758 assert_eq!(shrunk_empty.capacity(), 0);
759 }
760
761 #[test]
762 #[should_panic(expected = "the offset of the new Buffer cannot exceed the existing length")]
763 fn test_slice_offset_out_of_bound() {
764 let buf = Buffer::from(&[2, 4, 6, 8, 10]);
765 buf.slice(6);
766 }
767
768 #[test]
769 fn test_access_concurrently() {
770 let buffer = Buffer::from([1, 2, 3, 4, 5]);
771 let buffer2 = buffer.clone();
772 assert_eq!([1, 2, 3, 4, 5], buffer.as_slice());
773
774 let buffer_copy = thread::spawn(move || {
775 buffer
777 })
778 .join();
779
780 assert!(buffer_copy.is_ok());
781 assert_eq!(buffer2, buffer_copy.ok().unwrap());
782 }
783
784 macro_rules! check_as_typed_data {
785 ($input: expr, $native_t: ty) => {{
786 let buffer = Buffer::from_slice_ref($input);
787 let slice: &[$native_t] = buffer.typed_data::<$native_t>();
788 assert_eq!($input, slice);
789 }};
790 }
791
792 #[test]
793 #[expect(clippy::float_cmp)]
794 fn test_as_typed_data() {
795 check_as_typed_data!(&[1i8, 3i8, 6i8], i8);
796 check_as_typed_data!(&[1u8, 3u8, 6u8], u8);
797 check_as_typed_data!(&[1i16, 3i16, 6i16], i16);
798 check_as_typed_data!(&[1i32, 3i32, 6i32], i32);
799 check_as_typed_data!(&[1i64, 3i64, 6i64], i64);
800 check_as_typed_data!(&[1u16, 3u16, 6u16], u16);
801 check_as_typed_data!(&[1u32, 3u32, 6u32], u32);
802 check_as_typed_data!(&[1u64, 3u64, 6u64], u64);
803 check_as_typed_data!(&[1f32, 3f32, 6f32], f32);
804 check_as_typed_data!(&[1f64, 3f64, 6f64], f64);
805 }
806
807 #[test]
808 fn test_count_bits() {
809 assert_eq!(0, Buffer::from(&[0b00000000]).count_set_bits_offset(0, 8));
810 assert_eq!(8, Buffer::from(&[0b11111111]).count_set_bits_offset(0, 8));
811 assert_eq!(3, Buffer::from(&[0b00001101]).count_set_bits_offset(0, 8));
812 assert_eq!(
813 6,
814 Buffer::from(&[0b01001001, 0b01010010]).count_set_bits_offset(0, 16)
815 );
816 assert_eq!(
817 16,
818 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(0, 16)
819 );
820 }
821
822 #[test]
823 fn test_count_bits_slice() {
824 assert_eq!(
825 0,
826 Buffer::from(&[0b11111111, 0b00000000])
827 .slice(1)
828 .count_set_bits_offset(0, 8)
829 );
830 assert_eq!(
831 8,
832 Buffer::from(&[0b11111111, 0b11111111])
833 .slice_with_length(1, 1)
834 .count_set_bits_offset(0, 8)
835 );
836 assert_eq!(
837 3,
838 Buffer::from(&[0b11111111, 0b11111111, 0b00001101])
839 .slice(2)
840 .count_set_bits_offset(0, 8)
841 );
842 assert_eq!(
843 6,
844 Buffer::from(&[0b11111111, 0b01001001, 0b01010010])
845 .slice_with_length(1, 2)
846 .count_set_bits_offset(0, 16)
847 );
848 assert_eq!(
849 16,
850 Buffer::from(&[0b11111111, 0b11111111, 0b11111111, 0b11111111])
851 .slice(2)
852 .count_set_bits_offset(0, 16)
853 );
854 }
855
856 #[test]
857 fn test_count_bits_offset_slice() {
858 assert_eq!(8, Buffer::from(&[0b11111111]).count_set_bits_offset(0, 8));
859 assert_eq!(3, Buffer::from(&[0b11111111]).count_set_bits_offset(0, 3));
860 assert_eq!(5, Buffer::from(&[0b11111111]).count_set_bits_offset(3, 5));
861 assert_eq!(1, Buffer::from(&[0b11111111]).count_set_bits_offset(3, 1));
862 assert_eq!(0, Buffer::from(&[0b11111111]).count_set_bits_offset(8, 0));
863 assert_eq!(2, Buffer::from(&[0b01010101]).count_set_bits_offset(0, 3));
864 assert_eq!(
865 16,
866 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(0, 16)
867 );
868 assert_eq!(
869 10,
870 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(0, 10)
871 );
872 assert_eq!(
873 10,
874 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(3, 10)
875 );
876 assert_eq!(
877 8,
878 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(8, 8)
879 );
880 assert_eq!(
881 5,
882 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(11, 5)
883 );
884 assert_eq!(
885 0,
886 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(16, 0)
887 );
888 assert_eq!(
889 2,
890 Buffer::from(&[0b01101101, 0b10101010]).count_set_bits_offset(7, 5)
891 );
892 assert_eq!(
893 4,
894 Buffer::from(&[0b01101101, 0b10101010]).count_set_bits_offset(7, 9)
895 );
896 }
897
898 #[test]
899 fn test_unwind_safe() {
900 fn assert_unwind_safe<T: RefUnwindSafe + UnwindSafe>() {}
901 assert_unwind_safe::<Buffer>()
902 }
903
904 #[test]
905 fn test_from_foreign_vec() {
906 let mut vector = vec![1_i32, 2, 3, 4, 5];
907 let buffer = unsafe {
908 Buffer::from_custom_allocation(
909 NonNull::new_unchecked(vector.as_mut_ptr() as *mut u8),
910 vector.len() * std::mem::size_of::<i32>(),
911 Arc::new(vector),
912 )
913 };
914
915 let slice = buffer.typed_data::<i32>();
916 assert_eq!(slice, &[1, 2, 3, 4, 5]);
917
918 let buffer = buffer.slice(std::mem::size_of::<i32>());
919
920 let slice = buffer.typed_data::<i32>();
921 assert_eq!(slice, &[2, 3, 4, 5]);
922 }
923
924 #[test]
925 #[should_panic(expected = "the offset of the new Buffer cannot exceed the existing length")]
926 fn slice_overflow() {
927 let buffer = Buffer::from(MutableBuffer::from_len_zeroed(12));
928 buffer.slice_with_length(2, usize::MAX);
929 }
930
931 #[test]
932 fn test_vec_interop() {
933 let a: Vec<i128> = Vec::new();
935 let b = Buffer::from_vec(a);
936 b.into_vec::<i128>().unwrap();
937
938 let a: Vec<i128> = Vec::with_capacity(20);
940 let b = Buffer::from_vec(a);
941 let back = b.into_vec::<i128>().unwrap();
942 assert_eq!(back.len(), 0);
943 assert_eq!(back.capacity(), 20);
944
945 let mut a: Vec<i128> = Vec::with_capacity(3);
947 a.extend_from_slice(&[1, 2, 3]);
948 let b = Buffer::from_vec(a);
949 let back = b.into_vec::<i128>().unwrap();
950 assert_eq!(back.len(), 3);
951 assert_eq!(back.capacity(), 3);
952
953 let mut a: Vec<i128> = Vec::with_capacity(20);
955 a.extend_from_slice(&[1, 4, 7, 8, 9, 3, 6]);
956 let b = Buffer::from_vec(a);
957 let back = b.into_vec::<i128>().unwrap();
958 assert_eq!(back.len(), 7);
959 assert_eq!(back.capacity(), 20);
960
961 let a: Vec<i128> = Vec::new();
963 let b = Buffer::from_vec(a);
964 let b = b.into_vec::<i32>().unwrap_err();
965 b.into_vec::<i8>().unwrap_err();
966
967 let a: Vec<i64> = vec![1, 2, 3, 4];
971 let b = Buffer::from_vec(a);
972 let back = b.into_vec::<u64>().unwrap();
973 assert_eq!(back.len(), 4);
974 assert_eq!(back.capacity(), 4);
975
976 let mut b: Vec<i128> = Vec::with_capacity(4);
978 b.extend_from_slice(&[1, 2, 3, 4]);
979 let b = Buffer::from_vec(b);
980 let back = b.into_vec::<i256>().unwrap();
981 assert_eq!(back.len(), 2);
982 assert_eq!(back.capacity(), 2);
983
984 let b: Vec<i128> = vec![1, 2, 3];
986 let b = Buffer::from_vec(b);
987 b.into_vec::<i256>().unwrap_err();
988
989 let mut b: Vec<i128> = Vec::with_capacity(5);
991 b.extend_from_slice(&[1, 2, 3, 4]);
992 let b = Buffer::from_vec(b);
993 b.into_vec::<i256>().unwrap_err();
994
995 let mut b: Vec<i128> = Vec::with_capacity(4);
998 b.extend_from_slice(&[1, 2, 3]);
999 let b = Buffer::from_vec(b);
1000 let back = b.into_vec::<i256>().unwrap();
1001 assert_eq!(back.len(), 1);
1002 assert_eq!(back.capacity(), 2);
1003
1004 let b = Buffer::from(MutableBuffer::new(10));
1006 let b = b.into_vec::<u8>().unwrap_err();
1007 b.into_vec::<u64>().unwrap_err();
1008
1009 let mut a: Vec<i128> = Vec::with_capacity(20);
1011 a.extend_from_slice(&[1, 4, 7, 8, 9, 3, 6]);
1012 let b = Buffer::from_vec(a);
1013 let slice = b.slice_with_length(0, 64);
1014
1015 let slice = slice.into_vec::<i128>().unwrap_err();
1017 drop(b);
1018
1019 let back = slice.into_vec::<i128>().unwrap();
1021 assert_eq!(&back, &[1, 4, 7, 8]);
1022 assert_eq!(back.capacity(), 20);
1023
1024 let mut a: Vec<i128> = Vec::with_capacity(8);
1026 a.extend_from_slice(&[1, 4, 7, 3]);
1027
1028 let b = Buffer::from_vec(a);
1029 let slice = b.slice_with_length(0, 34);
1030 drop(b);
1031
1032 let back = slice.into_vec::<i128>().unwrap();
1033 assert_eq!(&back, &[1, 4]);
1034 assert_eq!(back.capacity(), 8);
1035
1036 let a: Vec<u32> = vec![1, 3, 4, 6];
1038 let b = Buffer::from_vec(a).slice(2);
1039 b.into_vec::<u32>().unwrap_err();
1040
1041 let b = MutableBuffer::new(16).into_buffer();
1042 let b = b.into_vec::<u8>().unwrap_err(); let b = b.into_vec::<u32>().unwrap_err(); b.into_mutable().unwrap();
1045
1046 let b = Buffer::from_vec(vec![1_u32, 3, 5]);
1047 let b = b.into_mutable().unwrap();
1048 let b = Buffer::from(b);
1049 let b = b.into_vec::<u32>().unwrap();
1050 assert_eq!(b, &[1, 3, 5]);
1051 }
1052
1053 #[test]
1054 #[should_panic(expected = "capacity overflow")]
1055 fn test_from_iter_overflow() {
1056 let iter_len = usize::MAX / std::mem::size_of::<u64>() + 1;
1057 let _ = Buffer::from_iter(std::iter::repeat_n(0_u64, iter_len));
1058 }
1059
1060 #[test]
1061 fn bit_slice_length_preserved() {
1062 let buf = Buffer::from_iter(std::iter::repeat_n(true, 64));
1064
1065 let assert_preserved = |offset: usize, len: usize| {
1066 let new_buf = buf.bit_slice(offset, len);
1067 assert_eq!(new_buf.len(), bit_util::ceil(len, 8));
1068
1069 if offset.is_multiple_of(8) {
1074 assert_eq!(new_buf.ptr_offset(), offset / 8);
1075 } else {
1076 assert_eq!(new_buf.ptr_offset(), 0);
1077 }
1078 };
1079
1080 for o in 0..=64 {
1082 for l in (o..=64).map(|l| l - o) {
1086 assert_preserved(o, l);
1089 }
1090 }
1091 }
1092
1093 #[test]
1094 fn test_strong_count() {
1095 let buffer = Buffer::from_iter(std::iter::repeat_n(0_u8, 100));
1096 assert_eq!(buffer.strong_count(), 1);
1097
1098 let buffer2 = buffer.clone();
1099 assert_eq!(buffer.strong_count(), 2);
1100
1101 let buffer3 = buffer2.clone();
1102 assert_eq!(buffer.strong_count(), 3);
1103
1104 drop(buffer);
1105 assert_eq!(buffer2.strong_count(), 2);
1106 assert_eq!(buffer3.strong_count(), 2);
1107
1108 let capture = move || {
1110 assert_eq!(buffer3.strong_count(), 2);
1111 };
1112
1113 capture();
1114 assert_eq!(buffer2.strong_count(), 2);
1115
1116 drop(capture);
1117 assert_eq!(buffer2.strong_count(), 1);
1118 }
1119
1120 #[test]
1121 fn into_mutable_should_return_error_for_sliced_owned_buffer_when_ptr_offset_is_not_0() {
1122 let original_buffer_data = [1_u8, 2, 3, 4, 5, 6, 7, 8];
1123 for (slice_from, slice_length) in [
1124 (original_buffer_data.len(), 0),
1125 (2, 4),
1126 (2, original_buffer_data.len() - 2),
1127 ] {
1128 let buffer = Buffer::from(original_buffer_data);
1129 let sliced = buffer.slice_with_length(slice_from, slice_length);
1130 drop(buffer); assert_ne!(sliced.ptr_offset(), 0);
1132
1133 sliced
1134 .into_mutable()
1135 .expect_err("should not convert sliced buffer when ptr_offset is not 0");
1136 }
1137 }
1138
1139 #[test]
1140 fn into_mutable_should_allow_converting_sliced_owned_buffer_when_ptr_offset_is_0() {
1141 let original_buffer_data = [1_u8, 2, 3, 4, 5, 6, 7, 8];
1142 for slice_length in [0, original_buffer_data.len() - 2] {
1143 let buffer = Buffer::from(original_buffer_data);
1144 let sliced = buffer.slice_with_length(0, slice_length);
1145 drop(buffer); assert_eq!(sliced.ptr_offset(), 0);
1147
1148 let original_ptr = sliced.data_ptr();
1149
1150 let mutable = sliced
1151 .into_mutable()
1152 .unwrap_or_else(|_| panic!("should allow converting to mutable when not sliced from end when slice_length is {slice_length}"));
1153
1154 let buffer_back: Buffer = mutable.into();
1155 assert_eq!(buffer_back.data_ptr(), original_ptr);
1156
1157 let expected = Buffer::from(original_buffer_data).slice_with_length(0, slice_length);
1158 assert_eq!(buffer_back.as_slice(), expected.as_slice());
1159 }
1160 }
1161}