use epserde::prelude::*;
fn make() -> anyhow::Result<MemCase<Vec<i32>>> {
let v: Vec<i32> = vec![1, 2, 3, 4];
let mut buffer = Vec::new();
unsafe { v.serialize(&mut buffer)? };
let cursor = <AlignedCursor>::from_slice(&buffer);
let mc = unsafe { <Vec<i32>>::read_mem(cursor, buffer.len())? };
Ok(mc)
}
#[test]
fn test_move_then_read() -> anyhow::Result<()> {
let mc = make()?;
let s: &[i32] = mc.uncase();
assert_eq!(s, &[1, 2, 3, 4]);
assert_eq!(mc.len(), 4);
assert_eq!(mc[0], 1);
Ok(())
}
fn consume_by_value(mc: MemCase<Vec<i32>>) -> i32 {
let s: &[i32] = mc.uncase();
s.iter().sum()
}
#[test]
fn test_by_value_then_drop() -> anyhow::Result<()> {
let mc = make()?;
assert_eq!(consume_by_value(mc), 10);
Ok(())
}
#[inline(never)]
fn frame_b(mc: MemCase<Vec<i32>>) -> i32 {
mc.uncase()[3]
}
#[inline(never)]
fn frame_a(mc: MemCase<Vec<i32>>) -> i32 {
frame_b(mc)
}
#[test]
fn test_by_value_nested_frames() -> anyhow::Result<()> {
let mc = make()?;
assert_eq!(frame_a(mc), 4);
Ok(())
}
#[test]
fn test_control_eps_no_memcase() -> anyhow::Result<()> {
let v: Vec<i32> = vec![1, 2, 3, 4];
let mut cursor = <AlignedCursor>::new();
unsafe { v.serialize(&mut cursor)? };
let s: &[i32] = unsafe { <Vec<i32>>::deserialize_eps(cursor.as_bytes())? };
assert_eq!(s, &[1, 2, 3, 4]);
assert_eq!(s.iter().sum::<i32>(), 10);
Ok(())
}
#[test]
fn test_control_memcase_in_place() -> anyhow::Result<()> {
let v: Vec<i32> = vec![1, 2, 3, 4];
let mut buffer = Vec::new();
unsafe { v.serialize(&mut buffer)? };
let cursor = <AlignedCursor>::from_slice(&buffer);
let mc = unsafe { <Vec<i32>>::read_mem(cursor, buffer.len())? };
let s: &[i32] = mc.uncase();
assert_eq!(s, &[1, 2, 3, 4]);
Ok(())
}