summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2025-03-26 18:45:24 +0100
committerHampusM <hampus@hampusmat.com>2025-03-28 11:51:53 +0100
commit1425685ad623d68484a11040802fe8d25aa95395 (patch)
tree3342ce9e725bd993582538360a39b5118d64f62d /src
parent5a7da770478646ac85f14f49af77c7afc1377cec (diff)
refactor: comment out get_all & make ptr to MaybeUninit<u8>
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs113
1 files changed, 56 insertions, 57 deletions
diff --git a/src/lib.rs b/src/lib.rs
index de7afe4..cdbb7b0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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]
+ // );
+ //}
}