Crate nekolib_doc::corro::array_rotation
source · Expand description
Rotate arrays and elements.
§Examples
use std::mem::MaybeUninit;
use array_rotation::array_rotate_2;
fn uninit_array<T, const N: usize>() -> [MaybeUninit<T>; N] {
unsafe { MaybeUninit::<[MaybeUninit<T>; N]>::uninit().assume_init() }
}
let mut left = uninit_array::<String, 10>();
left[0].write("A".to_owned());
left[1].write("B".to_owned());
left[2].write("C".to_owned());
left[3].write("D".to_owned());
let mut right = uninit_array::<String, 10>();
right[0].write("E".to_owned());
let leftlen_old = 4;
let rightlen_old = 1;
let leftlen_new = 2;
let rightlen_new = unsafe {
array_rotate_2(&mut left, &mut right, leftlen_old, rightlen_old, leftlen_new)
};
assert_eq!(rightlen_new, 3);
unsafe {
let left = &*(&left[..leftlen_new] as *const [_] as *const [String]);
assert_eq!(left, ["A", "B"]);
let right = &*(&right[..rightlen_new] as *const [_] as *const [String]);
assert_eq!(right, ["C", "D", "E"]);
}
unsafe {
array_rotate_2(&mut left, &mut right, leftlen_new, rightlen_new, 0);
for e in &mut right[..leftlen_new + rightlen_new] {
e.assume_init_drop();
}
}
use std::mem::MaybeUninit;
use array_rotation::array_rotate_3;
fn uninit_array<T, const N: usize>() -> [MaybeUninit<T>; N] {
unsafe { MaybeUninit::<[MaybeUninit<T>; N]>::uninit().assume_init() }
}
let mut left = uninit_array::<String, 10>();
left[0].write("A".to_owned());
left[1].write("B".to_owned());
left[2].write("C".to_owned());
left[3].write("D".to_owned());
let mut mid = MaybeUninit::new("E".to_owned());
let mut right = uninit_array::<String, 10>();
right[0].write("F".to_owned());
let leftlen_old = 4;
let rightlen_old = 1;
let leftlen_new = 2;
let rightlen_new = unsafe {
array_rotate_3(&mut left, &mut mid, &mut right, leftlen_old, rightlen_old, leftlen_new)
};
assert_eq!(rightlen_new, 3);
unsafe {
let left = &*(&left[..leftlen_new] as *const [_] as *const [String]);
assert_eq!(left, ["A", "B"]);
assert_eq!(mid.assume_init_ref(), "C");
let right = &*(&right[..rightlen_new] as *const [_] as *const [String]);
assert_eq!(right, ["D", "E", "F"]);
}
unsafe {
array_rotate_3(&mut left, &mut mid, &mut right, leftlen_new, rightlen_new, 0);
mid.assume_init_drop();
for e in &mut right[..leftlen_new + rightlen_new] {
e.assume_init_drop();
}
}
Functions§
- Rotate two arrays.
- Rotate two arrays and one element.