use super::{CompactTupleSketch, TupleInput, TupleSummary};
use apache_datasketches_sys::tuple_generic_a_not_b::ffi as sys;
use apache_datasketches_sys::tuple_generic_input::TupleGenericInputRef;
use cxx::UniquePtr;
use std::marker::PhantomData;
pub struct TupleAnotB<S: TupleSummary> {
inner: UniquePtr<sys::TupleGenericAnotBShim>,
_marker: PhantomData<fn() -> S>,
}
unsafe impl<S: TupleSummary> Send for TupleAnotB<S> {}
impl<S: TupleSummary> Default for TupleAnotB<S> {
fn default() -> Self {
Self::new()
}
}
impl<S: TupleSummary> TupleAnotB<S> {
pub fn new() -> Self {
Self {
inner: sys::new_tuple_generic_a_not_b(),
_marker: PhantomData,
}
}
pub fn compute(
&self,
a: &impl TupleInput<S>,
b: &impl TupleInput<S>,
ordered: bool,
) -> CompactTupleSketch<S> {
let inner = match (a.as_input(), b.as_input()) {
(TupleGenericInputRef::Sketch(a), TupleGenericInputRef::Sketch(b)) => {
self.inner.compute_sketch_sketch(a, b, ordered)
}
(TupleGenericInputRef::Sketch(a), TupleGenericInputRef::Compact(b)) => {
self.inner.compute_sketch_compact(a, b, ordered)
}
(TupleGenericInputRef::Compact(a), TupleGenericInputRef::Sketch(b)) => {
self.inner.compute_compact_sketch(a, b, ordered)
}
(TupleGenericInputRef::Compact(a), TupleGenericInputRef::Compact(b)) => {
self.inner.compute_compact_compact(a, b, ordered)
}
};
CompactTupleSketch::from_shim(inner)
}
}