use crate::space::*;
use crate::Atom;
use urid::UriBound;
pub struct Chunk;
unsafe impl UriBound for Chunk {
const URI: &'static [u8] = sys::LV2_ATOM__Chunk;
}
impl<'a, 'b> Atom<'a, 'b> for Chunk
where
'a: 'b,
{
type ReadParameter = ();
type ReadHandle = &'a [u8];
type WriteParameter = ();
type WriteHandle = FramedMutSpace<'a, 'b>;
fn read(space: Space<'a>, _: ()) -> Option<&'a [u8]> {
space.data()
}
fn init(frame: FramedMutSpace<'a, 'b>, _: ()) -> Option<FramedMutSpace<'a, 'b>> {
Some(frame)
}
}
#[cfg(test)]
mod tests {
use crate::chunk::*;
use crate::*;
use std::mem::size_of;
use urid::*;
#[test]
fn test_chunk_and_slice_writer() {
const SLICE_LENGTH: usize = 42;
let map = HashURIDMapper::new();
let urids = crate::AtomURIDCollection::from_map(&map).unwrap();
let mut raw_space: Box<[u8]> = Box::new([0; 256]);
{
let mut space = RootMutSpace::new(raw_space.as_mut());
let mut writer = (&mut space as &mut dyn MutSpace)
.init(urids.chunk, ())
.unwrap();
for (i, value) in writer
.allocate(SLICE_LENGTH - 1, false)
.map(|(_, data)| data)
.unwrap()
.into_iter()
.enumerate()
{
*value = i as u8;
}
(&mut writer as &mut dyn MutSpace)
.write(&41u8, false)
.unwrap();
}
{
let raw_space = raw_space.as_ref();
let (atom, data) = raw_space.split_at(size_of::<sys::LV2_Atom>());
let atom = unsafe { &*(atom.as_ptr() as *const sys::LV2_Atom) };
assert_eq!(atom.size as usize, SLICE_LENGTH);
assert_eq!(atom.type_, urids.chunk.get());
let data = data.split_at(SLICE_LENGTH).0;
for i in 0..SLICE_LENGTH {
assert_eq!(data[i] as usize, i);
}
}
{
let space = Space::from_reference(raw_space.as_ref());
let data = Chunk::read(space.split_atom_body(urids.chunk).unwrap().0, ()).unwrap();
assert_eq!(data.len(), SLICE_LENGTH);
for (i, value) in data.iter().enumerate() {
assert_eq!(*value as usize, i);
}
}
}
}