use std::cmp::Ordering;
use std::marker;
use dupe::Dupe;
#[derive(Debug, Default, Copy, Clone, Dupe)]
pub(crate) struct IfDebug<T> {
#[cfg(debug_assertions)]
value: T,
_marker: marker::PhantomData<T>,
}
impl<T> IfDebug<T> {
pub(crate) fn new(value: T) -> IfDebug<T> {
Self::new_if_debug(|| value)
}
pub(crate) fn new_if_debug(init: impl FnOnce() -> T) -> IfDebug<T> {
#[cfg(not(debug_assertions))]
drop(init);
IfDebug {
#[cfg(debug_assertions)]
value: { init() },
_marker: marker::PhantomData,
}
}
pub(crate) fn get_ref(&self) -> Option<&T> {
#[cfg(debug_assertions)]
return Some(&self.value);
#[cfg(not(debug_assertions))]
return None;
}
pub(crate) fn get_ref_if_debug(&self) -> &T {
self.get_ref().expect("assertions disabled")
}
pub(crate) fn if_debug(&self, f: impl FnOnce(&T)) {
if let Some(value) = self.get_ref() {
f(value);
}
}
}
impl<T> PartialEq for IfDebug<T> {
fn eq(&self, _other: &Self) -> bool {
true
}
}
impl<T> Eq for IfDebug<T> {}
impl<T> PartialOrd for IfDebug<T> {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl<T> Ord for IfDebug<T> {
fn cmp(&self, _other: &Self) -> Ordering {
Ordering::Equal
}
}