use byteorder::{LittleEndian, ReadBytesExt};
pub fn encode(object: &impl serde::Serialize) -> Vec<u8> {
bincode::serialize(object).unwrap()
}
pub fn encode_with_size(object: &impl serde::Serialize) -> Vec<u8> {
let mut data = Vec::new();
let serial = encode(object);
data.extend((serial.len() as u64).to_le_bytes().iter());
data.extend(serial.iter());
data
}
pub fn decode<'a, T: serde::Deserialize<'a>>(data: &'a [u8]) -> T {
bincode::deserialize(data).unwrap()
}
pub fn decode_with_size<'a, T: serde::Deserialize<'a>>(data: &'a [u8]) -> T {
decode(&data[8..])
}
pub unsafe fn decode_with_size_ptr<'a, T: serde::Deserialize<'a>>(data: *const u8) -> T {
let size = std::slice::from_raw_parts(data, 8)
.read_u64::<LittleEndian>()
.unwrap();
let data = std::slice::from_raw_parts(data.offset(8), size as usize);
decode(&data)
}