use crate::simd::{SimdBool, SimdValue};
pub struct SimdOption<V: SimdValue> {
val: V,
mask: V::SimdBool,
}
impl<V: SimdValue> SimdOption<V> {
pub fn new(val: V, mask: V::SimdBool) -> Self {
SimdOption { val, mask }
}
pub fn mask(&self) -> V::SimdBool {
self.mask
}
pub fn value(&self) -> &V {
&self.val
}
pub fn option(self) -> Option<V> {
if self.mask.all() {
Some(self.val)
} else {
None
}
}
#[inline]
pub fn simd_unwrap(self) -> V {
assert!(
self.mask.all(),
"Attempt to unwrap an SIMD value with at least one false lane."
);
self.val
}
#[inline(always)]
pub fn simd_unwrap_or(self, other: impl FnOnce() -> V) -> V {
self.val.select(self.mask, other())
}
}