use crate::Result;
pub trait ValueStrategy<T>: Send + Sync + Clone {
const IS_NATIVE_LAYOUT: bool = false;
fn read(bytes: &[u8]) -> Result<T>;
fn write_to_vec(value: &T, buf: &mut Vec<u8>);
fn write_to_slice(value: &T, dst: &mut [u8]);
}
macro_rules! impl_bytes_value_strategy {
($strategy:ident, $value_trait:path) => {
impl<T> $crate::ValueStrategy<T> for $strategy<T>
where
T: $value_trait,
{
const IS_NATIVE_LAYOUT: bool = T::IS_NATIVE_LAYOUT;
#[inline(always)]
fn read(bytes: &[u8]) -> $crate::Result<T> {
T::from_bytes(bytes)
}
#[inline(always)]
fn write_to_vec(value: &T, buf: &mut Vec<u8>) {
buf.extend_from_slice(value.to_bytes().as_ref());
}
#[inline(always)]
fn write_to_slice(value: &T, dst: &mut [u8]) {
dst.copy_from_slice(value.to_bytes().as_ref());
}
}
};
}
pub(crate) use impl_bytes_value_strategy;