use std::fmt;
use std::num::NonZeroU8;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct FrameNumber(NonZeroU8);
impl FrameNumber {
pub const fn new(n: u8) -> Option<Self> {
match NonZeroU8::new(n) {
Some(nz) => Some(Self(nz)),
None => None,
}
}
#[inline]
pub const fn get(self) -> u8 {
self.0.get()
}
#[inline]
pub const fn as_non_zero(self) -> NonZeroU8 {
self.0
}
#[inline]
pub const fn checked_add(self, n: u8) -> Option<Self> {
match self.0.get().checked_add(n) {
Some(v) => Self::new(v),
None => None,
}
}
}
impl TryFrom<u8> for FrameNumber {
type Error = FrameNumberZeroError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
Self::new(value).ok_or(FrameNumberZeroError)
}
}
impl From<FrameNumber> for u8 {
fn from(f: FrameNumber) -> Self {
f.get()
}
}
impl fmt::Debug for FrameNumber {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "FrameNumber({})", self.0)
}
}
impl fmt::Display for FrameNumber {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct FrameNumberZeroError;
impl fmt::Display for FrameNumberZeroError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "frame number must be non-zero")
}
}
impl std::error::Error for FrameNumberZeroError {}