#![cfg_attr(not(test), no_std)]
pub mod byte_slab;
pub mod slab_arc;
pub mod slab_box;
pub mod slab_slice_arc;
pub mod managed_arc_slab;
pub use crate::{
byte_slab::BSlab,
slab_arc::{SlabArc, RerooterKey},
slab_box::SlabBox,
slab_slice_arc::{SlabSliceArc, SlabStrArc},
managed_arc_slab::{ManagedArcSlab, ManagedArcStr, Reroot},
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
static SLAB: BSlab<32, 512> = BSlab::new();
SLAB.init().unwrap();
let mut allocs = vec![];
for i in 0..32 {
let mut alloc_box = SLAB.alloc_box().unwrap();
alloc_box[0] = i;
alloc_box[1] = 0x42;
allocs.push(alloc_box);
}
assert!(SLAB.alloc_box().is_none());
for (i, ab) in allocs.iter().enumerate() {
assert_eq!(i as u8, ab[0]);
assert_eq!(0x42, ab[1]);
}
drop(allocs);
let mut allocs = vec![];
for _ in 0..32 {
allocs.push(SLAB.alloc_box().unwrap());
}
assert!(SLAB.alloc_box().is_none());
}
#[test]
fn slicing_and_arcs() {
static SLAB: BSlab<32, 128> = BSlab::new();
SLAB.init().unwrap();
let mut slab_box = SLAB.alloc_box().unwrap();
slab_box.iter_mut().enumerate().for_each(|(i, by)| {
*by = i as u8;
});
let slab_arc = slab_box.into_arc();
slab_arc.iter().enumerate().for_each(|(i, by)| {
assert_eq!(*by, i as u8);
});
let sl_1 = slab_arc.sub_slice_arc(0, 64).unwrap();
let sl_2 = slab_arc.sub_slice_arc(64, 64).unwrap();
sl_1.iter().enumerate().for_each(|(i, by)| {
assert_eq!(*by, i as u8);
});
sl_2.iter().enumerate().for_each(|(i, by)| {
assert_eq!(*by, i as u8 + 64);
});
let sl_2_1 = sl_2.sub_slice_arc(0, 32).unwrap();
let sl_2_2 = sl_2.sub_slice_arc(32, 32).unwrap();
sl_2_1.iter().enumerate().for_each(|(i, by)| {
assert_eq!(*by, i as u8 + 64);
});
sl_2_2.iter().enumerate().for_each(|(i, by)| {
assert_eq!(*by, i as u8 + 64 + 32);
});
let mut allocs = vec![];
for i in 0..31 {
let mut alloc_box = SLAB.alloc_box().unwrap();
alloc_box[0] = i;
alloc_box[1] = 0x42;
allocs.push(alloc_box);
}
assert!(SLAB.alloc_box().is_none());
drop(slab_arc);
assert!(SLAB.alloc_box().is_none());
drop(sl_1);
drop(sl_2);
assert!(SLAB.alloc_box().is_none());
drop(sl_2_1);
assert!(SLAB.alloc_box().is_none());
drop(sl_2_2);
assert!(SLAB.alloc_box().is_some());
}
}