use crate::volume::{ZeroableExt, ZeroableVolume};
#[allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ZeroableUnchecked<T: ZeroableVolume>(T);
#[allow(dead_code)]
impl<T: ZeroableVolume> ZeroableUnchecked<T> {
pub const ZERO: Self = Self(T::ZERO);
pub fn new(
t: T,
) -> Self {
Self(t)
}
}
impl<T: ZeroableVolume> ZeroableExt<T> for ZeroableUnchecked<T> {
fn as_optional_nonzero_ref(
&self,
) -> Option<&T> {
if self.0.is_zero() {
None
} else {
Some(&self.0)
}
}
fn as_optional_nonzero_mut(
&mut self,
) -> Option<&mut T> {
if self.0.is_zero() {
None
} else {
Some(&mut self.0)
}
}
fn into_optional_nonzero(
self,
) -> Option<T> {
if self.0.is_zero() {
None
} else {
Some(self.0)
}
}
fn as_zeroable(
&self,
) -> T {
self.0
}
fn into_zeroable(
self,
) -> T {
self.0
}
fn as_nonzero_unchecked_ref(
&self,
) -> &T {
&self.0
}
fn as_nonzero_unchecked_mut(
&mut self,
) -> &mut T {
&mut self.0
}
fn into_nonzero_unchecked(
self,
) -> T {
self.0
}
}