use std::fmt::Debug;
mod private {
pub trait Sealed {}
impl Sealed for i8 {}
impl Sealed for i16 {}
impl Sealed for i32 {}
}
pub trait Value: private::Sealed + Copy + Debug + PartialEq + Default {
const BYTES: usize;
const MIN: i32;
const MAX: i32;
fn to_i32(self) -> i32;
fn from_i32(v: i32) -> Self;
fn write_le(self, buf: &mut [u8]);
fn read_le(buf: &[u8]) -> Self;
}
impl Value for i8 {
const BYTES: usize = 1;
const MIN: i32 = Self::MIN as i32;
const MAX: i32 = Self::MAX as i32;
#[inline]
fn to_i32(self) -> i32 {
i32::from(self)
}
#[inline]
fn from_i32(v: i32) -> Self {
v as Self
}
#[inline]
fn write_le(self, buf: &mut [u8]) {
buf[0] = self as u8;
}
#[inline]
fn read_le(buf: &[u8]) -> Self {
buf[0] as Self
}
}
impl Value for i16 {
const BYTES: usize = 2;
const MIN: i32 = Self::MIN as i32;
const MAX: i32 = Self::MAX as i32;
#[inline]
fn to_i32(self) -> i32 {
i32::from(self)
}
#[inline]
fn from_i32(v: i32) -> Self {
v as Self
}
#[inline]
fn write_le(self, buf: &mut [u8]) {
buf[..2].copy_from_slice(&self.to_le_bytes());
}
#[inline]
fn read_le(buf: &[u8]) -> Self {
Self::from_le_bytes([buf[0], buf[1]])
}
}
impl Value for i32 {
const BYTES: usize = 4;
const MIN: Self = Self::MIN;
const MAX: Self = Self::MAX;
#[inline]
fn to_i32(self) -> i32 {
self
}
#[inline]
fn from_i32(v: i32) -> Self {
v
}
#[inline]
fn write_le(self, buf: &mut [u8]) {
buf[..4].copy_from_slice(&self.to_le_bytes());
}
#[inline]
fn read_le(buf: &[u8]) -> Self {
Self::from_le_bytes([buf[0], buf[1], buf[2], buf[3]])
}
}