//! An implementation of a trait describing valid skipfield integer types. //! //! Only `u16`s and `u8`s are supported by default. However, other integral //! types may be used by implementing this trait on them; the trait is not //! sealed. use core::ops::{Add, AddAssign, Sub, SubAssign}; /// Trait describing integral types in a generic way suitable for use as the /// element type of a skipfield. pub trait SkipfieldType: Add + AddAssign + Sub + SubAssign + Ord + PartialOrd + Copy + Sized { /// The maximum attainable value of this type. const MAXIMUM: Self; /// The zero element of this type. const ZERO: Self; /// The one element of this type. const ONE: Self; /// Conversion method from `usize` using `as` or an equivalent fn from_usize(u: usize) -> Self; /// Conversion method from `isize` using `as` or an equivalent fn from_isize(i: isize) -> Self; } impl SkipfieldType for u16 { const MAXIMUM: Self = u16::MAX; const ZERO: Self = 0; const ONE: Self = 1; #[inline(always)] fn from_usize(u: usize) -> Self { u as u16 } #[inline(always)] fn from_isize(i: isize) -> Self { i as u16 } } impl SkipfieldType for u8 { const MAXIMUM: Self = u8::MAX; const ZERO: Self = 0; const ONE: Self = 1; #[inline(always)] fn from_usize(u: usize) -> Self { u as u8 } #[inline(always)] fn from_isize(i: isize) -> Self { i as u8 } }