use apple_quant_core::log::error;
pub(crate) const ZERO_ERROR: &'static str = "ZeroableExt operation failed while `debug_assertions`.";
pub trait ZeroableExt<T: Sized>
where
Self: Sized,
{
fn as_optional_nonzero_ref(
&self,
) -> Option<&T>;
fn as_optional_nonzero_mut(
&mut self,
) -> Option<&mut T>;
fn into_optional_nonzero(
self,
) -> Option<T>;
fn as_zeroable(
&self,
) -> T;
fn into_zeroable(
self,
) -> T;
fn as_nonzero_unchecked_ref(
&self,
) -> &T;
fn as_nonzero_unchecked_mut(
&mut self,
) -> &mut T;
fn into_nonzero_unchecked(
self,
) -> T;
fn as_nonzero_unchecked_release(
&self,
) -> &T {
#[cfg(debug_assertions)]
match self.as_optional_nonzero_ref() {
Some(t) => t,
None => {
error!("{ZERO_ERROR}");
panic!();
},
}
#[cfg(not(debug_assertions))]
self.as_nonzero_unchecked_ref()
}
fn as_nonzero_unchecked_release_mut(
&mut self,
) -> &mut T {
#[cfg(debug_assertions)]
match self.as_optional_nonzero_mut() {
Some(t) => t,
None => {
error!("{ZERO_ERROR}");
panic!();
},
}
#[cfg(not(debug_assertions))]
self.as_nonzero_unchecked_mut()
}
fn into_nonzero_unchecked_release(
self,
) -> T {
#[cfg(debug_assertions)]
match self.into_optional_nonzero() {
Some(t) => t,
None => {
error!("{ZERO_ERROR}");
panic!();
},
}
#[cfg(not(debug_assertions))]
self.into_nonzero_unchecked()
}
}