diff options
author | HampusM <hampus@hampusmat.com> | 2025-03-26 18:45:24 +0100 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2025-03-28 11:51:53 +0100 |
commit | 1425685ad623d68484a11040802fe8d25aa95395 (patch) | |
tree | 3342ce9e725bd993582538360a39b5118d64f62d /src | |
parent | 5a7da770478646ac85f14f49af77c7afc1377cec (diff) |
refactor: comment out get_all & make ptr to MaybeUninit<u8>
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 113 |
1 files changed, 56 insertions, 57 deletions
@@ -2,6 +2,7 @@ use std::alloc::{alloc, dealloc, handle_alloc_error, realloc, Layout}; use std::any::Any; use std::cmp::max; +use std::mem::MaybeUninit; use std::ptr::NonNull; pub struct OwnedAnyPtr @@ -75,7 +76,7 @@ impl Drop for OwnedAnyPtr #[derive(Debug)] pub struct MultiVec { - ptr: NonNull<u8>, + ptr: NonNull<MaybeUninit<u8>>, field_arr_byte_offsets: Vec<usize>, field_sizes: Vec<usize>, length: usize, @@ -198,16 +199,16 @@ impl MultiVec // Some(unsafe { field_ptr.cast().as_ref() }) //} - /// Returns a slice containing the specified field of all items. - #[must_use] - pub fn get_all(&self, field_index: usize) -> &[()] - { - let field_arr_byte_offset = self.field_arr_byte_offsets[field_index]; - - let field_arr_ptr = unsafe { self.ptr.byte_add(field_arr_byte_offset) }; - - unsafe { std::slice::from_raw_parts(field_arr_ptr.as_ptr().cast(), self.len()) } - } + ///// Returns a slice containing the specified field of all items. + //#[must_use] + //pub fn get_all(&self, field_index: usize) -> &[()] + //{ + // let field_arr_byte_offset = self.field_arr_byte_offsets[field_index]; + // + // let field_arr_ptr = unsafe { self.ptr.byte_add(field_arr_byte_offset) }; + // + // unsafe { std::slice::from_raw_parts(field_arr_ptr.as_ptr().cast(), self.len()) } + //} /// Returns the number of items stored in this `MultiVec`. #[must_use] @@ -245,7 +246,7 @@ impl MultiVec Self::create_layout(new_capacity, &fields); let Some(new_ptr) = NonNull::new(unsafe { - realloc(self.ptr.as_ptr(), *layout, new_layout.size()) + realloc(self.ptr.as_ptr().cast::<u8>(), *layout, new_layout.size()) }) else { handle_alloc_error(new_layout); }; @@ -269,7 +270,7 @@ impl MultiVec } } - self.ptr = new_ptr; + self.ptr = new_ptr.cast::<MaybeUninit<u8>>(); self.layout = Some(new_layout); self.capacity = new_capacity; self.field_arr_byte_offsets = new_field_arr_byte_offsets; @@ -283,7 +284,7 @@ impl MultiVec handle_alloc_error(layout); }; - self.ptr = ptr; + self.ptr = ptr.cast::<MaybeUninit<u8>>(); self.capacity = capacity; self.field_arr_byte_offsets = field_arr_byte_offsets; self.layout = Some(layout); @@ -334,7 +335,7 @@ impl MultiVec unsafe { std::ptr::copy_nonoverlapping( item_field_ptr, - field_dst_ptr.as_ptr(), + field_dst_ptr.as_ptr().cast::<u8>(), field_size, ); } @@ -403,7 +404,7 @@ impl Drop for MultiVec if let Some(layout) = self.layout { unsafe { - std::alloc::dealloc(self.ptr.as_ptr(), layout); + std::alloc::dealloc(self.ptr.as_ptr().cast::<u8>(), layout); } } } @@ -465,8 +466,6 @@ struct CoolLayoutError; #[cfg(test)] mod tests { - use std::ptr::NonNull; - use crate::{MultiVec, OwnedAnyPtr}; #[test] @@ -631,43 +630,43 @@ mod tests // ); //} - unsafe fn cast_slice<SrcItem, DstItem>(slice: &[SrcItem]) -> &[DstItem] - { - unsafe { - std::slice::from_raw_parts(slice.as_ptr().cast::<DstItem>(), slice.len()) - } - } - - #[test] - fn get_all_works() - { - let mut multi_vec = MultiVec::new(); - - struct Data - { - _a: [u32; 3], - _b: [u16; 3], - } - - let data = Data { - _a: [u32::MAX - 3000, 901, 5560000], - _b: [20210, 7120, 1010], - }; - - multi_vec.ptr = NonNull::from(&data).cast(); - multi_vec.field_arr_byte_offsets = vec![0, size_of::<u32>() * 3]; - multi_vec.field_sizes = vec![size_of::<u32>(), size_of::<u16>()]; - multi_vec.length = 3; - multi_vec.capacity = 3; - - assert_eq!( - unsafe { cast_slice::<_, u32>(multi_vec.get_all(0)) }, - [u32::MAX - 3000, 901, 5560000] - ); - - assert_eq!( - unsafe { cast_slice::<_, u16>(multi_vec.get_all(1)) }, - [20210, 7120, 1010] - ); - } + //unsafe fn cast_slice<SrcItem, DstItem>(slice: &[SrcItem]) -> &[DstItem] + //{ + // unsafe { + // std::slice::from_raw_parts(slice.as_ptr().cast::<DstItem>(), slice.len()) + // } + //} + // + //#[test] + //fn get_all_works() + //{ + // let mut multi_vec = MultiVec::new(); + // + // struct Data + // { + // _a: [u32; 3], + // _b: [u16; 3], + // } + // + // let data = Data { + // _a: [u32::MAX - 3000, 901, 5560000], + // _b: [20210, 7120, 1010], + // }; + // + // multi_vec.ptr = NonNull::from(&data).cast(); + // multi_vec.field_arr_byte_offsets = vec![0, size_of::<u32>() * 3]; + // multi_vec.field_sizes = vec![size_of::<u32>(), size_of::<u16>()]; + // multi_vec.length = 3; + // multi_vec.capacity = 3; + // + // assert_eq!( + // unsafe { cast_slice::<_, u32>(multi_vec.get_all(0)) }, + // [u32::MAX - 3000, 901, 5560000] + // ); + // + // assert_eq!( + // unsafe { cast_slice::<_, u16>(multi_vec.get_all(1)) }, + // [20210, 7120, 1010] + // ); + //} } |