use super::input::ArrayOfDoublesInput;
use super::CompactArrayOfDoublesSketch;
use crate::error::SketchError;
use apache_datasketches_sys::array_of_doubles_input::ArrayOfDoublesInputRef;
use apache_datasketches_sys::array_of_doubles_intersection::ffi as sys;
use cxx::UniquePtr;
pub struct ArrayOfDoublesIntersection {
inner: UniquePtr<sys::ArrayOfDoublesIntersectionShim>,
num_values: u8,
}
unsafe impl Send for ArrayOfDoublesIntersection {}
impl ArrayOfDoublesIntersection {
pub fn new(num_values: u8) -> Result<Self, SketchError> {
if num_values == 0 {
return Err(SketchError::InvalidConfig(
"num_values must be at least 1".to_string(),
));
}
Ok(Self {
inner: sys::new_array_of_doubles_intersection(num_values),
num_values,
})
}
pub fn update(&mut self, input: &impl ArrayOfDoublesInput) -> Result<(), SketchError> {
let actual = input.get_num_values();
if actual != self.num_values {
return Err(SketchError::InvalidConfig(format!(
"num_values mismatch: intersection has {}, input has {actual}",
self.num_values
)));
}
match input.as_input() {
ArrayOfDoublesInputRef::Sketch(s) => self.inner.pin_mut().update_with_sketch(s),
ArrayOfDoublesInputRef::Compact(c) => self.inner.pin_mut().update_with_compact(c),
}
Ok(())
}
pub fn get_result(&self, ordered: bool) -> Result<CompactArrayOfDoublesSketch, SketchError> {
if !self.inner.has_result() {
return Err(SketchError::EmptyIntersection);
}
let inner = self
.inner
.get_result(ordered)
.map_err(|e| SketchError::Cpp(e.what().to_string()))?;
Ok(CompactArrayOfDoublesSketch::from_shim(inner))
}
pub fn has_result(&self) -> bool {
self.inner.has_result()
}
pub fn get_num_values(&self) -> u8 {
self.num_values
}
}