#![cfg(not(feature = "alloc"))]
use core::mem::MaybeUninit;
use xdrs::{Box, ConstWriteXDR, ReadXDR, WriteXDR, cxs, txs};
#[derive(Debug, PartialEq, ReadXDR, WriteXDR, xdrs::ConstXDRSize)]
#[repr(i32)]
enum Key {
Small { small: [u8; 4] } = 0,
Big { big: Box<[u8; 8]> } = 1,
}
#[derive(Debug, PartialEq, ReadXDR, WriteXDR, xdrs::ConstXDRSize)]
struct Holder {
key: Option<Key>,
}
#[test]
fn boxed_field_roundtrips_from_stack_buffer() {
let val = Holder {
key: Some(Key::Big {
big: Box::new([1, 2, 3, 4, 5, 6, 7, 8]),
}),
};
let mut buf = [MaybeUninit::<u8>::uninit(); 64];
let n = txs::encode_into(&val, &mut buf).unwrap();
let mut local = [0u8; 64];
for (d, s) in local.iter_mut().zip(&buf[..n]) {
*d = unsafe { s.assume_init() };
}
assert_eq!(txs::decode::<Holder>(&local[..n]).unwrap(), val);
let mut buf = [MaybeUninit::<u8>::uninit(); 64];
let n = cxs::encode_into(&val, &mut buf).unwrap();
let mut local = [0u8; 64];
for (d, s) in local.iter_mut().zip(&buf[..n]) {
*d = unsafe { s.assume_init() };
}
assert_eq!(cxs::decode::<Holder>(&local[..n]).unwrap(), val);
}
const _: () = assert!(core::mem::size_of::<Box<[u8; 8]>>() == 8);
const _: () = assert!(<Holder as xdrs::txs::ConstMaxSize>::MAX_SIZE.is_some());
const _: () = assert!(<Holder as xdrs::cxs::ConstMaxSize>::MAX_SIZE.is_some());
#[derive(Debug, Clone, Copy, PartialEq, ConstWriteXDR, WriteXDR)]
struct Leaf {
a: u32,
b: [u8; 3],
}
#[derive(Debug, PartialEq, ConstWriteXDR, WriteXDR)]
struct Boxed {
n: u32,
leaf: Box<Leaf>,
maybe: Option<Box<Leaf>>,
raw: Box<[u8; 4]>,
}
const BOXED: Boxed = Boxed {
n: 7,
leaf: Box::new(Leaf { a: 1, b: [2, 3, 4] }),
maybe: Some(Box::new(Leaf { a: 5, b: [6, 7, 8] })),
raw: Box::new([9, 10, 11, 12]),
};
const BOXED_TXS: [u8; BOXED.const_txs_size()] = {
let mut w = txs::ConstWriter::<{ BOXED.const_txs_size() }>::new();
BOXED.const_write_txs(&mut w);
w.into_bytes()
};
const BOXED_CXS: [u8; BOXED.const_cxs_size()] = {
let mut w = cxs::ConstWriter::<{ BOXED.const_cxs_size() }>::new();
BOXED.const_write_cxs(&mut w);
w.into_bytes()
};
#[test]
fn boxed_const_write_matches_runtime() {
let mut buf = [MaybeUninit::<u8>::uninit(); 64];
let n = txs::encode_into(&BOXED, &mut buf).unwrap();
assert_eq!(&BOXED_TXS[..], unsafe { buf[..n].assume_init_ref() });
let mut buf = [MaybeUninit::<u8>::uninit(); 64];
let n = cxs::encode_into(&BOXED, &mut buf).unwrap();
assert_eq!(&BOXED_CXS[..], unsafe { buf[..n].assume_init_ref() });
}