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 bytes
228 .try_realloc(desired_capacity, |base| {
229 self.ptr = if is_empty {
230 base.as_ptr()
231 } else {
232 unsafe { base.as_ptr().add(offset) }
234 };
235 })
236 .ok(); }
238 }
239
240 #[inline]
242 pub fn is_empty(&self) -> bool {
243 self.length == 0
244 }
245
246 pub fn as_slice(&self) -> &[u8] {
248 unsafe { std::slice::from_raw_parts(self.ptr, self.length) }
249 }
250
251 pub(crate) fn deallocation(&self) -> &Deallocation {
252 self.data.deallocation()
253 }
254
255 pub fn slice(&self, offset: usize) -> Self {
264 let mut s = self.clone();
265 s.advance(offset);
266 s
267 }
268
269 #[inline]
275 pub fn advance(&mut self, offset: usize) {
276 assert!(
277 offset <= self.length,
278 "the offset of the new Buffer cannot exceed the existing length: offset={} length={}",
279 offset,
280 self.length
281 );
282 self.length -= offset;
283 self.ptr = unsafe { self.ptr.add(offset) };
288 }
289
290 pub fn slice_with_length(&self, offset: usize, length: usize) -> Self {
299 assert!(
300 offset.saturating_add(length) <= self.length,
301 "the offset of the new Buffer cannot exceed the existing length: slice offset={offset} length={length} selflen={}",
302 self.length
303 );
304 let ptr = unsafe { self.ptr.add(offset) };
307 Self {
308 data: self.data.clone(),
309 ptr,
310 length,
311 }
312 }
313
314 #[inline]
319 pub fn as_ptr(&self) -> *const u8 {
320 self.ptr
321 }
322
323 pub fn typed_data<T: ArrowNativeType>(&self) -> &[T] {
330 let (prefix, offsets, suffix) = unsafe { self.as_slice().align_to::<T>() };
334 assert!(prefix.is_empty() && suffix.is_empty());
335 offsets
336 }
337
338 pub fn bit_slice(&self, offset: usize, len: usize) -> Self {
346 if offset.is_multiple_of(8) {
347 return self.slice_with_length(offset / 8, bit_util::ceil(len, 8));
348 }
349
350 let chunks = self.bit_chunks(offset, len);
351
352 let buffer: Vec<u64> = if chunks.remainder_len() > 0 {
353 chunks.iter().chain(Some(chunks.remainder_bits())).collect()
354 } else {
355 chunks.iter().collect()
356 };
357 let mut buffer = Buffer::from_vec(buffer);
358 buffer.length = bit_util::ceil(len, 8);
360 buffer
361 }
362
363 pub fn bit_chunks(&self, offset: usize, len: usize) -> BitChunks<'_> {
367 BitChunks::new(self.as_slice(), offset, len)
368 }
369
370 pub fn count_set_bits_offset(&self, offset: usize, len: usize) -> usize {
373 UnalignedBitChunk::new(self.as_slice(), offset, len).count_ones()
374 }
375
376 pub fn into_mutable(self) -> Result<MutableBuffer, Self> {
399 let ptr = self.ptr;
400 let length = self.length;
401
402 let res = if self.ptr_offset() > 0 {
404 Err(self.data)
405 } else {
406 Arc::try_unwrap(self.data)
407 };
408
409 res.and_then(|bytes| {
410 assert_eq!(ptr, bytes.ptr().as_ptr());
412 MutableBuffer::from_bytes(bytes).map_err(Arc::new)
413 })
414 .map_err(|bytes| Buffer {
415 data: bytes,
416 ptr,
417 length,
418 })
419 .map(|mut mutable| {
420 unsafe { mutable.set_len(length) };
423 mutable
424 })
425 }
426
427 pub fn into_vec<T: ArrowNativeType>(self) -> Result<Vec<T>, Self> {
438 let layout = match self.data.deallocation() {
439 Deallocation::Standard(l) => l,
440 Deallocation::Custom(..) => return Err(self),
441 };
442
443 if self.ptr != self.data.as_ptr() {
444 return Err(self); }
446
447 let v_capacity = layout.size() / std::mem::size_of::<T>();
448 match Layout::array::<T>(v_capacity) {
449 Ok(expected) if layout == &expected => {}
450 _ => return Err(self), }
452
453 let length = self.length;
454 let ptr = self.ptr;
455 let v_len = self.length / std::mem::size_of::<T>();
456
457 Arc::try_unwrap(self.data)
458 .map(|bytes| unsafe {
459 let ptr = bytes.ptr().as_ptr().cast();
460 std::mem::forget(bytes);
461 Vec::from_raw_parts(ptr, v_len, v_capacity)
464 })
465 .map_err(|bytes| Buffer {
466 data: bytes,
467 ptr,
468 length,
469 })
470 }
471
472 #[inline]
476 pub fn ptr_eq(&self, other: &Self) -> bool {
477 self.ptr == other.ptr && self.length == other.length
478 }
479
480 #[cfg(feature = "pool")]
487 pub fn claim(&self, pool: &dyn MemoryPool) {
488 self.data.claim(pool)
489 }
490}
491
492impl From<&[u8]> for Buffer {
501 fn from(p: &[u8]) -> Self {
502 Self::from_slice_ref(p)
503 }
504}
505
506impl<const N: usize> From<[u8; N]> for Buffer {
507 fn from(p: [u8; N]) -> Self {
508 Self::from_slice_ref(p)
509 }
510}
511
512impl<const N: usize> From<&[u8; N]> for Buffer {
513 fn from(p: &[u8; N]) -> Self {
514 Self::from_slice_ref(p)
515 }
516}
517
518impl<T: ArrowNativeType> From<Vec<T>> for Buffer {
519 fn from(value: Vec<T>) -> Self {
520 Self::from_vec(value)
521 }
522}
523
524impl<T: ArrowNativeType> From<ScalarBuffer<T>> for Buffer {
525 fn from(value: ScalarBuffer<T>) -> Self {
526 value.into_inner()
527 }
528}
529
530impl From<Bytes> for Buffer {
532 #[inline]
533 fn from(bytes: Bytes) -> Self {
534 let length = bytes.len();
535 let ptr = bytes.as_ptr();
536 Self {
537 data: Arc::new(bytes),
538 ptr,
539 length,
540 }
541 }
542}
543
544impl From<bytes::Bytes> for Buffer {
546 fn from(bytes: bytes::Bytes) -> Self {
547 let bytes: Bytes = bytes.into();
548 Self::from(bytes)
549 }
550}
551
552impl From<Buffer> for bytes::Bytes {
554 fn from(buffer: Buffer) -> Self {
555 Self::from_owner(buffer)
556 }
557}
558
559impl FromIterator<bool> for Buffer {
561 fn from_iter<I>(iter: I) -> Self
562 where
563 I: IntoIterator<Item = bool>,
564 {
565 MutableBuffer::from_iter(iter).into()
566 }
567}
568
569impl std::ops::Deref for Buffer {
570 type Target = [u8];
571
572 fn deref(&self) -> &[u8] {
573 unsafe { std::slice::from_raw_parts(self.as_ptr(), self.len()) }
574 }
575}
576
577impl AsRef<[u8]> for Buffer {
578 fn as_ref(&self) -> &[u8] {
579 self.as_slice()
580 }
581}
582
583impl From<MutableBuffer> for Buffer {
584 #[inline]
585 fn from(buffer: MutableBuffer) -> Self {
586 buffer.into_buffer()
587 }
588}
589
590impl<T: ArrowNativeType> From<BufferBuilder<T>> for Buffer {
591 fn from(mut value: BufferBuilder<T>) -> Self {
592 value.finish()
593 }
594}
595
596impl Buffer {
597 #[inline]
617 pub unsafe fn from_trusted_len_iter<T: ArrowNativeType, I: Iterator<Item = T>>(
618 iterator: I,
619 ) -> Self {
620 unsafe { MutableBuffer::from_trusted_len_iter(iterator).into() }
621 }
622
623 #[inline]
630 pub unsafe fn try_from_trusted_len_iter<
631 E,
632 T: ArrowNativeType,
633 I: Iterator<Item = Result<T, E>>,
634 >(
635 iterator: I,
636 ) -> Result<Self, E> {
637 unsafe { Ok(MutableBuffer::try_from_trusted_len_iter(iterator)?.into()) }
638 }
639}
640
641impl<T: ArrowNativeType> FromIterator<T> for Buffer {
642 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
643 let vec = Vec::from_iter(iter);
644 Buffer::from_vec(vec)
645 }
646}
647
648#[cfg(test)]
649mod tests {
650 use crate::i256;
651 use std::panic::{RefUnwindSafe, UnwindSafe};
652 use std::thread;
653
654 use super::*;
655
656 #[test]
657 fn test_buffer_data_equality() {
658 let buf1 = Buffer::from(&[0, 1, 2, 3, 4]);
659 let buf2 = Buffer::from(&[0, 1, 2, 3, 4]);
660 assert_eq!(buf1, buf2);
661
662 let buf3 = buf1.slice(2);
664 assert_ne!(buf1, buf3);
665 let buf4 = buf2.slice_with_length(2, 3);
666 assert_eq!(buf3, buf4);
667
668 let mut buf2 = MutableBuffer::new(65);
670 buf2.extend_from_slice(&[0u8, 1, 2, 3, 4]);
671
672 let buf2 = buf2.into();
673 assert_eq!(buf1, buf2);
674
675 let buf2 = Buffer::from(&[0, 0, 2, 3, 4]);
677 assert_ne!(buf1, buf2);
678
679 let buf2 = Buffer::from(&[0, 1, 2, 3]);
681 assert_ne!(buf1, buf2);
682 }
683
684 #[test]
685 fn test_from_raw_parts() {
686 let buf = Buffer::from(&[0, 1, 2, 3, 4]);
687 assert_eq!(5, buf.len());
688 assert!(!buf.as_ptr().is_null());
689 assert_eq!([0, 1, 2, 3, 4], buf.as_slice());
690 }
691
692 #[test]
693 fn test_from_vec() {
694 let buf = Buffer::from(&[0, 1, 2, 3, 4]);
695 assert_eq!(5, buf.len());
696 assert!(!buf.as_ptr().is_null());
697 assert_eq!([0, 1, 2, 3, 4], buf.as_slice());
698 }
699
700 #[test]
701 fn test_copy() {
702 let buf = Buffer::from(&[0, 1, 2, 3, 4]);
703 let buf2 = buf;
704 assert_eq!(5, buf2.len());
705 assert_eq!(64, buf2.capacity());
706 assert!(!buf2.as_ptr().is_null());
707 assert_eq!([0, 1, 2, 3, 4], buf2.as_slice());
708 }
709
710 #[test]
711 fn test_slice() {
712 let buf = Buffer::from(&[2, 4, 6, 8, 10]);
713 let buf2 = buf.slice(2);
714
715 assert_eq!([6, 8, 10], buf2.as_slice());
716 assert_eq!(3, buf2.len());
717 assert_eq!(unsafe { buf.as_ptr().add(2) }, buf2.as_ptr());
718
719 let buf3 = buf2.slice_with_length(1, 2);
720 assert_eq!([8, 10], buf3.as_slice());
721 assert_eq!(2, buf3.len());
722 assert_eq!(unsafe { buf.as_ptr().add(3) }, buf3.as_ptr());
723
724 let buf4 = buf.slice(5);
725 let empty_slice: [u8; 0] = [];
726 assert_eq!(empty_slice, buf4.as_slice());
727 assert_eq!(0, buf4.len());
728 assert!(buf4.is_empty());
729 assert_eq!(buf2.slice_with_length(2, 1).as_slice(), &[10]);
730 }
731
732 #[test]
733 fn test_shrink_to_fit() {
734 let original = Buffer::from(&[0, 1, 2, 3, 4, 5, 6, 7]);
735 assert_eq!(original.as_slice(), &[0, 1, 2, 3, 4, 5, 6, 7]);
736 assert_eq!(original.capacity(), 64);
737
738 let slice = original.slice_with_length(2, 3);
739 drop(original); assert_eq!(slice.as_slice(), &[2, 3, 4]);
741 assert_eq!(slice.capacity(), 64);
742
743 let mut shrunk = slice;
744 shrunk.shrink_to_fit();
745 assert_eq!(shrunk.as_slice(), &[2, 3, 4]);
746 assert_eq!(shrunk.capacity(), 5); let empty_slice = shrunk.slice_with_length(1, 0);
750 drop(shrunk); assert_eq!(empty_slice.as_slice(), &[]);
752 assert_eq!(empty_slice.capacity(), 5);
753
754 let mut shrunk_empty = empty_slice;
755 shrunk_empty.shrink_to_fit();
756 assert_eq!(shrunk_empty.as_slice(), &[]);
757 assert_eq!(shrunk_empty.capacity(), 0);
758 }
759
760 #[test]
761 #[should_panic(expected = "the offset of the new Buffer cannot exceed the existing length")]
762 fn test_slice_offset_out_of_bound() {
763 let buf = Buffer::from(&[2, 4, 6, 8, 10]);
764 buf.slice(6);
765 }
766
767 #[test]
768 fn test_access_concurrently() {
769 let buffer = Buffer::from([1, 2, 3, 4, 5]);
770 let buffer2 = buffer.clone();
771 assert_eq!([1, 2, 3, 4, 5], buffer.as_slice());
772
773 let buffer_copy = thread::spawn(move || {
774 buffer
776 })
777 .join();
778
779 assert!(buffer_copy.is_ok());
780 assert_eq!(buffer2, buffer_copy.ok().unwrap());
781 }
782
783 macro_rules! check_as_typed_data {
784 ($input: expr, $native_t: ty) => {{
785 let buffer = Buffer::from_slice_ref($input);
786 let slice: &[$native_t] = buffer.typed_data::<$native_t>();
787 assert_eq!($input, slice);
788 }};
789 }
790
791 #[test]
792 #[expect(clippy::float_cmp)]
793 fn test_as_typed_data() {
794 check_as_typed_data!(&[1i8, 3i8, 6i8], i8);
795 check_as_typed_data!(&[1u8, 3u8, 6u8], u8);
796 check_as_typed_data!(&[1i16, 3i16, 6i16], i16);
797 check_as_typed_data!(&[1i32, 3i32, 6i32], i32);
798 check_as_typed_data!(&[1i64, 3i64, 6i64], i64);
799 check_as_typed_data!(&[1u16, 3u16, 6u16], u16);
800 check_as_typed_data!(&[1u32, 3u32, 6u32], u32);
801 check_as_typed_data!(&[1u64, 3u64, 6u64], u64);
802 check_as_typed_data!(&[1f32, 3f32, 6f32], f32);
803 check_as_typed_data!(&[1f64, 3f64, 6f64], f64);
804 }
805
806 #[test]
807 fn test_count_bits() {
808 assert_eq!(0, Buffer::from(&[0b00000000]).count_set_bits_offset(0, 8));
809 assert_eq!(8, Buffer::from(&[0b11111111]).count_set_bits_offset(0, 8));
810 assert_eq!(3, Buffer::from(&[0b00001101]).count_set_bits_offset(0, 8));
811 assert_eq!(
812 6,
813 Buffer::from(&[0b01001001, 0b01010010]).count_set_bits_offset(0, 16)
814 );
815 assert_eq!(
816 16,
817 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(0, 16)
818 );
819 }
820
821 #[test]
822 fn test_count_bits_slice() {
823 assert_eq!(
824 0,
825 Buffer::from(&[0b11111111, 0b00000000])
826 .slice(1)
827 .count_set_bits_offset(0, 8)
828 );
829 assert_eq!(
830 8,
831 Buffer::from(&[0b11111111, 0b11111111])
832 .slice_with_length(1, 1)
833 .count_set_bits_offset(0, 8)
834 );
835 assert_eq!(
836 3,
837 Buffer::from(&[0b11111111, 0b11111111, 0b00001101])
838 .slice(2)
839 .count_set_bits_offset(0, 8)
840 );
841 assert_eq!(
842 6,
843 Buffer::from(&[0b11111111, 0b01001001, 0b01010010])
844 .slice_with_length(1, 2)
845 .count_set_bits_offset(0, 16)
846 );
847 assert_eq!(
848 16,
849 Buffer::from(&[0b11111111, 0b11111111, 0b11111111, 0b11111111])
850 .slice(2)
851 .count_set_bits_offset(0, 16)
852 );
853 }
854
855 #[test]
856 fn test_count_bits_offset_slice() {
857 assert_eq!(8, Buffer::from(&[0b11111111]).count_set_bits_offset(0, 8));
858 assert_eq!(3, Buffer::from(&[0b11111111]).count_set_bits_offset(0, 3));
859 assert_eq!(5, Buffer::from(&[0b11111111]).count_set_bits_offset(3, 5));
860 assert_eq!(1, Buffer::from(&[0b11111111]).count_set_bits_offset(3, 1));
861 assert_eq!(0, Buffer::from(&[0b11111111]).count_set_bits_offset(8, 0));
862 assert_eq!(2, Buffer::from(&[0b01010101]).count_set_bits_offset(0, 3));
863 assert_eq!(
864 16,
865 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(0, 16)
866 );
867 assert_eq!(
868 10,
869 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(0, 10)
870 );
871 assert_eq!(
872 10,
873 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(3, 10)
874 );
875 assert_eq!(
876 8,
877 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(8, 8)
878 );
879 assert_eq!(
880 5,
881 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(11, 5)
882 );
883 assert_eq!(
884 0,
885 Buffer::from(&[0b11111111, 0b11111111]).count_set_bits_offset(16, 0)
886 );
887 assert_eq!(
888 2,
889 Buffer::from(&[0b01101101, 0b10101010]).count_set_bits_offset(7, 5)
890 );
891 assert_eq!(
892 4,
893 Buffer::from(&[0b01101101, 0b10101010]).count_set_bits_offset(7, 9)
894 );
895 }
896
897 #[test]
898 fn test_unwind_safe() {
899 fn assert_unwind_safe<T: RefUnwindSafe + UnwindSafe>() {}
900 assert_unwind_safe::<Buffer>()
901 }
902
903 #[test]
904 fn test_from_foreign_vec() {
905 let mut vector = vec![1_i32, 2, 3, 4, 5];
906 let buffer = unsafe {
907 Buffer::from_custom_allocation(
908 NonNull::new_unchecked(vector.as_mut_ptr().cast::<u8>()),
909 vector.len() * std::mem::size_of::<i32>(),
910 Arc::new(vector),
911 )
912 };
913
914 let slice = buffer.typed_data::<i32>();
915 assert_eq!(slice, &[1, 2, 3, 4, 5]);
916
917 let buffer = buffer.slice(std::mem::size_of::<i32>());
918
919 let slice = buffer.typed_data::<i32>();
920 assert_eq!(slice, &[2, 3, 4, 5]);
921 }
922
923 #[test]
924 #[should_panic(expected = "the offset of the new Buffer cannot exceed the existing length")]
925 fn slice_overflow() {
926 let buffer = Buffer::from(MutableBuffer::from_len_zeroed(12));
927 buffer.slice_with_length(2, usize::MAX);
928 }
929
930 #[test]
931 fn test_vec_interop() {
932 let a: Vec<i128> = Vec::new();
934 let b = Buffer::from_vec(a);
935 b.into_vec::<i128>().unwrap();
936
937 let a: Vec<i128> = Vec::with_capacity(20);
939 let b = Buffer::from_vec(a);
940 let back = b.into_vec::<i128>().unwrap();
941 assert_eq!(back.len(), 0);
942 assert_eq!(back.capacity(), 20);
943
944 let mut a: Vec<i128> = Vec::with_capacity(3);
946 a.extend_from_slice(&[1, 2, 3]);
947 let b = Buffer::from_vec(a);
948 let back = b.into_vec::<i128>().unwrap();
949 assert_eq!(back.len(), 3);
950 assert_eq!(back.capacity(), 3);
951
952 let mut a: Vec<i128> = Vec::with_capacity(20);
954 a.extend_from_slice(&[1, 4, 7, 8, 9, 3, 6]);
955 let b = Buffer::from_vec(a);
956 let back = b.into_vec::<i128>().unwrap();
957 assert_eq!(back.len(), 7);
958 assert_eq!(back.capacity(), 20);
959
960 let a: Vec<i128> = Vec::new();
962 let b = Buffer::from_vec(a);
963 let b = b.into_vec::<i32>().unwrap_err();
964 b.into_vec::<i8>().unwrap_err();
965
966 let a: Vec<i64> = vec![1, 2, 3, 4];
970 let b = Buffer::from_vec(a);
971 let back = b.into_vec::<u64>().unwrap();
972 assert_eq!(back.len(), 4);
973 assert_eq!(back.capacity(), 4);
974
975 let mut b: Vec<i128> = Vec::with_capacity(4);
977 b.extend_from_slice(&[1, 2, 3, 4]);
978 let b = Buffer::from_vec(b);
979 let back = b.into_vec::<i256>().unwrap();
980 assert_eq!(back.len(), 2);
981 assert_eq!(back.capacity(), 2);
982
983 let b: Vec<i128> = vec![1, 2, 3];
985 let b = Buffer::from_vec(b);
986 b.into_vec::<i256>().unwrap_err();
987
988 let mut b: Vec<i128> = Vec::with_capacity(5);
990 b.extend_from_slice(&[1, 2, 3, 4]);
991 let b = Buffer::from_vec(b);
992 b.into_vec::<i256>().unwrap_err();
993
994 let mut b: Vec<i128> = Vec::with_capacity(4);
997 b.extend_from_slice(&[1, 2, 3]);
998 let b = Buffer::from_vec(b);
999 let back = b.into_vec::<i256>().unwrap();
1000 assert_eq!(back.len(), 1);
1001 assert_eq!(back.capacity(), 2);
1002
1003 let b = Buffer::from(MutableBuffer::new(10));
1005 let b = b.into_vec::<u8>().unwrap_err();
1006 b.into_vec::<u64>().unwrap_err();
1007
1008 let mut a: Vec<i128> = Vec::with_capacity(20);
1010 a.extend_from_slice(&[1, 4, 7, 8, 9, 3, 6]);
1011 let b = Buffer::from_vec(a);
1012 let slice = b.slice_with_length(0, 64);
1013
1014 let slice = slice.into_vec::<i128>().unwrap_err();
1016 drop(b);
1017
1018 let back = slice.into_vec::<i128>().unwrap();
1020 assert_eq!(&back, &[1, 4, 7, 8]);
1021 assert_eq!(back.capacity(), 20);
1022
1023 let mut a: Vec<i128> = Vec::with_capacity(8);
1025 a.extend_from_slice(&[1, 4, 7, 3]);
1026
1027 let b = Buffer::from_vec(a);
1028 let slice = b.slice_with_length(0, 34);
1029 drop(b);
1030
1031 let back = slice.into_vec::<i128>().unwrap();
1032 assert_eq!(&back, &[1, 4]);
1033 assert_eq!(back.capacity(), 8);
1034
1035 let a: Vec<u32> = vec![1, 3, 4, 6];
1037 let b = Buffer::from_vec(a).slice(2);
1038 b.into_vec::<u32>().unwrap_err();
1039
1040 let b = MutableBuffer::new(16).into_buffer();
1041 let b = b.into_vec::<u8>().unwrap_err(); let b = b.into_vec::<u32>().unwrap_err(); b.into_mutable().unwrap();
1044
1045 let b = Buffer::from_vec(vec![1_u32, 3, 5]);
1046 let b = b.into_mutable().unwrap();
1047 let b = Buffer::from(b);
1048 let b = b.into_vec::<u32>().unwrap();
1049 assert_eq!(b, &[1, 3, 5]);
1050 }
1051
1052 #[test]
1053 #[should_panic(expected = "capacity overflow")]
1054 fn test_from_iter_overflow() {
1055 let iter_len = usize::MAX / std::mem::size_of::<u64>() + 1;
1056 let _ = Buffer::from_iter(std::iter::repeat_n(0_u64, iter_len));
1057 }
1058
1059 #[test]
1060 fn bit_slice_length_preserved() {
1061 let buf = Buffer::from_iter(std::iter::repeat_n(true, 64));
1063
1064 let assert_preserved = |offset: usize, len: usize| {
1065 let new_buf = buf.bit_slice(offset, len);
1066 assert_eq!(new_buf.len(), bit_util::ceil(len, 8));
1067
1068 if offset.is_multiple_of(8) {
1073 assert_eq!(new_buf.ptr_offset(), offset / 8);
1074 } else {
1075 assert_eq!(new_buf.ptr_offset(), 0);
1076 }
1077 };
1078
1079 for o in 0..=64 {
1081 for l in (o..=64).map(|l| l - o) {
1085 assert_preserved(o, l);
1088 }
1089 }
1090 }
1091
1092 #[test]
1093 fn test_strong_count() {
1094 let buffer = Buffer::from_iter(std::iter::repeat_n(0_u8, 100));
1095 assert_eq!(buffer.strong_count(), 1);
1096
1097 let buffer2 = buffer.clone();
1098 assert_eq!(buffer.strong_count(), 2);
1099
1100 let buffer3 = buffer2.clone();
1101 assert_eq!(buffer.strong_count(), 3);
1102
1103 drop(buffer);
1104 assert_eq!(buffer2.strong_count(), 2);
1105 assert_eq!(buffer3.strong_count(), 2);
1106
1107 let capture = move || {
1109 assert_eq!(buffer3.strong_count(), 2);
1110 };
1111
1112 capture();
1113 assert_eq!(buffer2.strong_count(), 2);
1114
1115 drop(capture);
1116 assert_eq!(buffer2.strong_count(), 1);
1117 }
1118
1119 #[test]
1120 fn into_mutable_should_return_error_for_sliced_owned_buffer_when_ptr_offset_is_not_0() {
1121 let original_buffer_data = [1_u8, 2, 3, 4, 5, 6, 7, 8];
1122 for (slice_from, slice_length) in [
1123 (original_buffer_data.len(), 0),
1124 (2, 4),
1125 (2, original_buffer_data.len() - 2),
1126 ] {
1127 let buffer = Buffer::from(original_buffer_data);
1128 let sliced = buffer.slice_with_length(slice_from, slice_length);
1129 drop(buffer); assert_ne!(sliced.ptr_offset(), 0);
1131
1132 sliced
1133 .into_mutable()
1134 .expect_err("should not convert sliced buffer when ptr_offset is not 0");
1135 }
1136 }
1137
1138 #[test]
1139 fn into_mutable_should_allow_converting_sliced_owned_buffer_when_ptr_offset_is_0() {
1140 let original_buffer_data = [1_u8, 2, 3, 4, 5, 6, 7, 8];
1141 for slice_length in [0, original_buffer_data.len() - 2] {
1142 let buffer = Buffer::from(original_buffer_data);
1143 let sliced = buffer.slice_with_length(0, slice_length);
1144 drop(buffer); assert_eq!(sliced.ptr_offset(), 0);
1146
1147 let original_ptr = sliced.data_ptr();
1148
1149 let mutable = sliced
1150 .into_mutable()
1151 .unwrap_or_else(|_| panic!("should allow converting to mutable when not sliced from end when slice_length is {slice_length}"));
1152
1153 let buffer_back: Buffer = mutable.into();
1154 assert_eq!(buffer_back.data_ptr(), original_ptr);
1155
1156 let expected = Buffer::from(original_buffer_data).slice_with_length(0, slice_length);
1157 assert_eq!(buffer_back.as_slice(), expected.as_slice());
1158 }
1159 }
1160
1161 #[test]
1162 #[cfg(feature = "pool")]
1163 fn test_shrink_to_fit_panicking_reservation() {
1164 use std::panic::{AssertUnwindSafe, catch_unwind};
1165
1166 use crate::pool::{MemoryPool, MemoryReservation};
1167
1168 #[derive(Debug)]
1169 struct PanicPool;
1170
1171 #[derive(Debug)]
1172 struct PanicReservation {
1173 panicked: bool,
1174 }
1175
1176 impl MemoryReservation for PanicReservation {
1177 fn size(&self) -> usize {
1178 0
1179 }
1180 fn resize(&mut self, _: usize) {
1181 if !self.panicked {
1182 self.panicked = true;
1183 panic!("intentional panic in resize");
1184 }
1185 }
1186 }
1187
1188 impl MemoryPool for PanicPool {
1189 fn reserve(&self, _: usize) -> Box<dyn MemoryReservation> {
1190 Box::new(PanicReservation { panicked: false })
1191 }
1192 fn available(&self) -> isize {
1193 isize::MAX
1194 }
1195 fn used(&self) -> usize {
1196 0
1197 }
1198 fn capacity(&self) -> usize {
1199 usize::MAX
1200 }
1201 }
1202
1203 let pool = PanicPool;
1204 let data: Vec<u8> = (0..8).collect();
1205 let mut buf = Buffer::from_slice_ref(data.as_slice());
1206 buf.claim(&pool);
1207
1208 let _ = catch_unwind(AssertUnwindSafe(|| buf.shrink_to_fit()));
1211
1212 assert_eq!(buf.as_slice(), data.as_slice());
1213 }
1214}