use bytemuck::{Pod, Zeroable};
pub trait Nullable: Pod {
fn is_some(&self) -> bool;
fn is_none(&self) -> bool;
}
#[repr(C)]
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub struct PodOption<T: Nullable>(T);
unsafe impl<T: Nullable> Pod for PodOption<T> {}
unsafe impl<T: Nullable> Zeroable for PodOption<T> {}
impl<T: Nullable> PodOption<T> {
#[inline]
pub fn new(value: T) -> Self {
Self(value)
}
#[inline]
pub fn value(&self) -> Option<&T> {
if self.0.is_some() {
Some(&self.0)
} else {
None
}
}
#[inline]
pub fn value_mut(&mut self) -> Option<&mut T> {
if self.0.is_some() {
Some(&mut self.0)
} else {
None
}
}
}