use crate::math::{Real, SimdBool, SimdReal, SIMD_WIDTH};
pub enum SimdBestFirstVisitStatus<Res> {
MaybeContinue {
weights: SimdReal,
mask: SimdBool,
results: [Option<Res>; SIMD_WIDTH],
},
ExitEarly(Option<Res>),
}
pub trait SimdBestFirstVisitor<T, SimdBV> {
type Result;
fn visit(
&mut self,
best_cost_so_far: Real,
bv: &SimdBV,
value: Option<[Option<&T>; SIMD_WIDTH]>,
) -> SimdBestFirstVisitStatus<Self::Result>;
}
pub enum SimdVisitStatus {
MaybeContinue(SimdBool),
ExitEarly,
}
pub enum SimdSimultaneousVisitStatus {
MaybeContinue([SimdBool; SIMD_WIDTH]),
ExitEarly,
}
pub trait SimdVisitor<T, SimdBV> {
fn visit(&mut self, bv: &SimdBV, data: Option<[Option<&T>; SIMD_WIDTH]>) -> SimdVisitStatus;
}
impl<F, T, SimdBV> SimdVisitor<T, SimdBV> for F
where
F: FnMut(&SimdBV, Option<[Option<&T>; SIMD_WIDTH]>) -> SimdVisitStatus,
{
fn visit(&mut self, bv: &SimdBV, data: Option<[Option<&T>; SIMD_WIDTH]>) -> SimdVisitStatus {
(self)(bv, data)
}
}
pub trait SimdSimultaneousVisitor<T, SimdBV> {
fn visit(
&mut self,
left_bv: &SimdBV,
left_data: Option<[Option<&T>; SIMD_WIDTH]>,
right_bv: &SimdBV,
right_data: Option<[Option<&T>; SIMD_WIDTH]>,
) -> SimdSimultaneousVisitStatus;
}