use crate::VarintSizeHint;
use std::{
fmt,
ops::{Deref, DerefMut},
};
pub trait VarintBaseType:
Copy + Clone + PartialEq + PartialOrd + Eq + Ord + fmt::Debug + VarintSizeHint
{
}
impl<T: Copy + Clone + PartialEq + PartialOrd + Eq + Ord + fmt::Debug + VarintSizeHint>
VarintBaseType for T
{
}
#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Copy, Clone)]
#[cfg_attr(feature = "serde-support", derive(Serialize, Deserialize))]
pub struct Varint<T: VarintBaseType>(pub T);
impl<T: VarintBaseType + fmt::Display> fmt::Display for Varint<T> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl<T: VarintBaseType> Deref for Varint<T> {
type Target = T;
#[inline]
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T: VarintBaseType> DerefMut for Varint<T> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl From<i8> for Varint<i8> {
#[inline]
fn from(i: i8) -> Self {
Self(i)
}
}
impl From<i8> for Varint<i16> {
#[inline]
fn from(i: i8) -> Self {
Self(i16::from(i))
}
}
impl From<i8> for Varint<i32> {
#[inline]
fn from(i: i8) -> Self {
Self(i32::from(i))
}
}
impl From<i8> for Varint<i64> {
#[inline]
fn from(i: i8) -> Self {
Self(i64::from(i))
}
}
impl From<i8> for Varint<i128> {
#[inline]
fn from(i: i8) -> Self {
Self(i128::from(i))
}
}
impl From<i16> for Varint<i16> {
#[inline]
fn from(i: i16) -> Self {
Self(i)
}
}
impl From<i16> for Varint<i32> {
#[inline]
fn from(i: i16) -> Self {
Self(i32::from(i))
}
}
impl From<i16> for Varint<i64> {
#[inline]
fn from(i: i16) -> Self {
Self(i64::from(i))
}
}
impl From<i16> for Varint<i128> {
#[inline]
fn from(i: i16) -> Self {
Self(i128::from(i))
}
}
impl From<i32> for Varint<i32> {
#[inline]
fn from(i: i32) -> Self {
Self(i)
}
}
impl From<i32> for Varint<i64> {
#[inline]
fn from(i: i32) -> Self {
Self(i64::from(i))
}
}
impl From<i32> for Varint<i128> {
#[inline]
fn from(i: i32) -> Self {
Self(i128::from(i))
}
}
impl From<i64> for Varint<i64> {
#[inline]
fn from(i: i64) -> Self {
Self(i)
}
}
impl From<i64> for Varint<i128> {
#[inline]
fn from(i: i64) -> Self {
Self(i128::from(i))
}
}
impl From<i128> for Varint<i128> {
#[inline]
fn from(v: i128) -> Self {
Self(v)
}
}
impl From<u8> for Varint<u128> {
#[inline]
fn from(v: u8) -> Self {
Self(u128::from(v))
}
}
impl From<u16> for Varint<u128> {
#[inline]
fn from(v: u16) -> Self {
Self(u128::from(v))
}
}
impl From<u32> for Varint<u128> {
#[inline]
fn from(v: u32) -> Self {
Self(u128::from(v))
}
}
impl From<u64> for Varint<u128> {
#[inline]
fn from(v: u64) -> Self {
Self(u128::from(v))
}
}
impl From<u128> for Varint<u128> {
#[inline]
fn from(v: u128) -> Self {
Self(v)
}
}
impl Default for Varint<u128> {
#[inline]
fn default() -> Self {
Self(0)
}
}
impl Default for Varint<i8> {
#[inline]
fn default() -> Self {
Self(0)
}
}
impl Default for Varint<i16> {
#[inline]
fn default() -> Self {
Self(0)
}
}
impl Default for Varint<i32> {
#[inline]
fn default() -> Self {
Self(0)
}
}
impl Default for Varint<i64> {
#[inline]
fn default() -> Self {
Self(0)
}
}
impl Default for Varint<i128> {
#[inline]
fn default() -> Self {
Self(0)
}
}