mirror of
https://github.com/Noratrieb/vechonk.git
synced 2026-01-14 16:45:10 +01:00
more alignment fun
This commit is contained in:
parent
c49c716c9a
commit
e9965ca40f
2 changed files with 32 additions and 6 deletions
10
src/lib.rs
10
src/lib.rs
|
|
@ -107,7 +107,7 @@ impl<T: ?Sized> Vechonk<T> {
|
||||||
|
|
||||||
// SAFETY: capacity has been checked to not be 0 and the len is 0
|
// SAFETY: capacity has been checked to not be 0 and the len is 0
|
||||||
unsafe {
|
unsafe {
|
||||||
vechonk.grow_to(NonZeroUsize::new_unchecked(capacity));
|
vechonk.realloc(NonZeroUsize::new_unchecked(capacity));
|
||||||
}
|
}
|
||||||
vechonk
|
vechonk
|
||||||
}
|
}
|
||||||
|
|
@ -238,7 +238,7 @@ impl<T: ?Sized> Vechonk<T> {
|
||||||
// SAFETY: new_cap can't be 0 because of the +1
|
// SAFETY: new_cap can't be 0 because of the +1
|
||||||
// We will copy the elements over
|
// We will copy the elements over
|
||||||
unsafe {
|
unsafe {
|
||||||
self.grow_to(NonZeroUsize::new_unchecked(new_cap));
|
self.realloc(NonZeroUsize::new_unchecked(new_cap));
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy the elements first
|
// copy the elements first
|
||||||
|
|
@ -266,15 +266,15 @@ impl<T: ?Sized> Vechonk<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Grows the `Vechonk` to a new capacity. This will not copy any elements. This will put the `Vechonk`
|
/// Reallocs the `Vechonk`, setting its capacity to `size`. This will not copy any elements. This will put the `Vechonk`
|
||||||
/// into an invalid state, since the `len` is still the length of the old allocation.
|
/// into an invalid state, since the `len` is still the length of the elements in the old allocation.
|
||||||
///
|
///
|
||||||
/// This doesn't free any memory
|
/// This doesn't free any memory
|
||||||
///
|
///
|
||||||
/// # Safety
|
/// # Safety
|
||||||
/// The caller must either set the `len` to zero, or copy the elements to the new allocation by saving
|
/// The caller must either set the `len` to zero, or copy the elements to the new allocation by saving
|
||||||
/// `self.ptr` before calling this function.
|
/// `self.ptr` before calling this function.
|
||||||
unsafe fn grow_to(&mut self, size: NonZeroUsize) {
|
unsafe fn realloc(&mut self, size: NonZeroUsize) {
|
||||||
let layout = Layout::from_size_align(size.get(), Self::data_align()).unwrap();
|
let layout = Layout::from_size_align(size.get(), Self::data_align()).unwrap();
|
||||||
|
|
||||||
// SAFETY: layout is guaranteed to have a non-zero size
|
// SAFETY: layout is guaranteed to have a non-zero size
|
||||||
|
|
|
||||||
28
src/test.rs
28
src/test.rs
|
|
@ -3,6 +3,9 @@
|
||||||
use crate::Vechonk;
|
use crate::Vechonk;
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
|
|
||||||
|
#[repr(align(2048))]
|
||||||
|
struct BigAlign(u8);
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn new() {
|
fn new() {
|
||||||
let chonk = Vechonk::<()>::new();
|
let chonk = Vechonk::<()>::new();
|
||||||
|
|
@ -128,11 +131,34 @@ fn grow_from_alloc() {
|
||||||
fn push_alignment() {
|
fn push_alignment() {
|
||||||
use core::any::Any;
|
use core::any::Any;
|
||||||
|
|
||||||
let mut chonk = Vechonk::<dyn Any>::with_capacity(96);
|
let mut chonk = Vechonk::<dyn Any>::with_capacity(4096);
|
||||||
|
|
||||||
chonk.push(Box::new(0_u8));
|
chonk.push(Box::new(0_u8));
|
||||||
|
chonk.push(Box::new(BigAlign(5)));
|
||||||
chonk.push(Box::new(1_u64));
|
chonk.push(Box::new(1_u64));
|
||||||
|
|
||||||
let _ = chonk[0];
|
let _ = chonk[0];
|
||||||
let _ = chonk[1];
|
let _ = chonk[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn grow_alignment() {
|
||||||
|
use core::any::Any;
|
||||||
|
|
||||||
|
let mut chonk = Vechonk::<dyn Any>::with_capacity(32);
|
||||||
|
|
||||||
|
chonk.push(Box::new(0_u8));
|
||||||
|
chonk.push(Box::new(1_u64));
|
||||||
|
chonk.push(Box::new(0_u128));
|
||||||
|
chonk.push(Box::new(BigAlign(5)));
|
||||||
|
chonk.push(Box::new(8_u128));
|
||||||
|
chonk.push(Box::new("dsajkfhdsajklfdsklaöfjdklsöjfkldsfjlkds"));
|
||||||
|
chonk.push(Box::new(4_u128));
|
||||||
|
chonk.push(Box::new(5_u128));
|
||||||
|
chonk.push(Box::new(BigAlign(5)));
|
||||||
|
chonk.push(Box::new(6_u128));
|
||||||
|
chonk.push(Box::new(3_u128));
|
||||||
|
|
||||||
|
let _ = chonk[0];
|
||||||
|
let _ = chonk[1];
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue