pub trait OffsetValue: Sized + Copy
{
#[doc(hidden)]
fn from_i128(value: i128) -> Result<Self, ()>;
#[doc(hidden)]
fn from_u128(value: u128) -> Result<Self, ()>;
#[doc(hidden)]
fn serialize<S: Serializer>(self, serializer: S) -> Result<S::Ok, S::Error>;
}
impl OffsetValue for i16
{
#[inline(always)]
fn from_i128(value: i128) -> Result<Self, ()>
{
if value >= (i16::MIN as i128) && value <= (i16::MAX as i128)
{
Ok(value as i16)
}
else
{
Err(())
}
}
#[inline(always)]
fn from_u128(value: u128) -> Result<Self, ()>
{
if value <= (i16::MAX as u128)
{
Ok(value as i16)
}
else
{
Err(())
}
}
#[inline(always)]
fn serialize<S: Serializer>(self, serializer: S) -> Result<S::Ok, S::Error>
{
serializer.serialize_i16(self)
}
}
impl OffsetValue for i32
{
#[inline(always)]
fn from_i128(value: i128) -> Result<Self, ()>
{
if value >= (i32::MIN as i128) && value <= (i32::MAX as i128)
{
Ok(value as i32)
}
else
{
Err(())
}
}
#[inline(always)]
fn from_u128(value: u128) -> Result<Self, ()>
{
if value <= (i32::MAX as u128)
{
Ok(value as i32)
}
else
{
Err(())
}
}
#[inline(always)]
fn serialize<S: Serializer>(self, serializer: S) -> Result<S::Ok, S::Error>
{
serializer.serialize_i32(self)
}
}
impl OffsetValue for u64
{
#[inline(always)]
fn from_i128(value: i128) -> Result<Self, ()>
{
if value >= (i64::MIN as i128) && value <= (i64::MAX as i128)
{
Ok(value as i64 as u64)
}
else
{
Err(())
}
}
#[inline(always)]
fn from_u128(value: u128) -> Result<Self, ()>
{
if value <= (u64::MAX as u128)
{
Ok(value as u64)
}
else
{
Err(())
}
}
#[inline(always)]
fn serialize<S: Serializer>(self, serializer: S) -> Result<S::Ok, S::Error>
{
serializer.serialize_u64(self)
}
}