use crate::Auto;
use crate::threading::{CompatibleWith, ThreadingDispatch};
use crate::{
CheckFinitePolicy, DeDupError, IndexType, MultiThreaded, PruneDegenerateEnum, PruneUnusedEnum,
Scalar, SingleThreaded, ToleranceEnum, TopologyPolicy,
};
use num_traits::AsPrimitive;
impl ThreadingDispatch for Auto {
fn dedup_dispatch<T, Index, Vout, Topology>(
vertices: &[impl Into<[T; 3]> + Clone + Sync],
indices: &[Index],
tolerance: T,
prune_unused: PruneUnusedEnum,
prune_degenerate: PruneDegenerateEnum,
tolerance_policy: ToleranceEnum,
) -> Result<(Vec<Vout>, Vec<Index>), DeDupError>
where
T: Scalar,
Index: IndexType,
Vout: Into<[T; 3]> + From<[T; 3]> + Clone + Sync,
Topology: TopologyPolicy,
usize: AsPrimitive<T>,
{
if vertices.len() < 2000 {
SingleThreaded::dedup_dispatch::<T, Index, Vout, Topology>(
vertices,
indices,
tolerance,
prune_unused,
prune_degenerate,
tolerance_policy,
)
} else {
MultiThreaded::dedup_dispatch::<T, Index, Vout, Topology>(
vertices,
indices,
tolerance,
prune_unused,
prune_degenerate,
tolerance_policy,
)
}
}
fn dedup_exact_dispatch<T, Index: IndexType, Vout, Topology, CheckFinite>(
vertices: &[impl Into<[T; 3]> + Clone + Sync],
indices: &[Index],
prune_unused: PruneUnusedEnum,
prune_degenerate: PruneDegenerateEnum,
) -> Result<(Vec<Vout>, Vec<Index>), DeDupError>
where
T: Scalar,
Topology: TopologyPolicy,
Vout: Into<[T; 3]> + From<[T; 3]> + Clone + Sync,
CheckFinite: CheckFinitePolicy,
{
SingleThreaded::dedup_exact_dispatch::<T, Index, Vout, Topology, CheckFinite>(
vertices,
indices,
prune_unused,
prune_degenerate,
)
}
}
impl<F: CheckFinitePolicy> CompatibleWith<F> for Auto {}