use super::builder::resize_factor_multiplier;
use super::summary::{erase, TupleSummary};
use crate::error::SketchError;
use crate::tuple::ResizeFactor;
use apache_datasketches_sys::tuple_generic::ffi as sys;
use cxx::UniquePtr;
use std::marker::PhantomData;
pub struct TupleSketch<S: TupleSummary> {
pub(crate) inner: UniquePtr<sys::TupleGenericSketchShim>,
pub(crate) _marker: PhantomData<fn() -> S>,
}
unsafe impl<S: TupleSummary> Send for TupleSketch<S> {}
impl<S: TupleSummary> TupleSketch<S> {
pub(crate) fn from_parts(lg_k: u8, rf: ResizeFactor, p: f32) -> Result<Self, SketchError> {
let inner = sys::new_tuple_generic_sketch(lg_k, resize_factor_multiplier(rf), p)
.map_err(|e| SketchError::InvalidConfig(e.what().to_string()))?;
Ok(Self {
inner,
_marker: PhantomData,
})
}
pub fn update_u64(&mut self, key: u64, value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_u64(key, &summary);
}
pub fn update_i64(&mut self, key: i64, value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_i64(key, &summary);
}
pub fn update_u32(&mut self, key: u32, value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_u32(key, &summary);
}
pub fn update_i32(&mut self, key: i32, value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_i32(key, &summary);
}
pub fn update_u16(&mut self, key: u16, value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_u16(key, &summary);
}
pub fn update_i16(&mut self, key: i16, value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_i16(key, &summary);
}
pub fn update_u8(&mut self, key: u8, value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_u8(key, &summary);
}
pub fn update_i8(&mut self, key: i8, value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_i8(key, &summary);
}
pub fn update_f64(&mut self, key: f64, value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_f64(key, &summary);
}
pub fn update_str(&mut self, key: &str, value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_str(key, &summary);
}
pub fn update_bytes(&mut self, key: &[u8], value: &S::Update) {
let summary = erase(S::create(value));
self.inner.pin_mut().update_bytes(key, &summary);
}
pub fn trim(&mut self) {
self.inner.pin_mut().trim();
}
pub fn reset(&mut self) {
self.inner.pin_mut().reset();
}
pub fn get_estimate(&self) -> f64 {
self.inner.get_estimate()
}
pub fn get_lower_bound(&self, num_std_dev: u8) -> Result<f64, SketchError> {
self.inner
.get_lower_bound(num_std_dev)
.map_err(|e| SketchError::InvalidConfig(e.what().to_string()))
}
pub fn get_upper_bound(&self, num_std_dev: u8) -> Result<f64, SketchError> {
self.inner
.get_upper_bound(num_std_dev)
.map_err(|e| SketchError::InvalidConfig(e.what().to_string()))
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn is_estimation_mode(&self) -> bool {
self.inner.is_estimation_mode()
}
pub fn is_ordered(&self) -> bool {
self.inner.is_ordered()
}
pub fn get_theta(&self) -> f64 {
self.inner.get_theta()
}
pub fn get_num_retained(&self) -> u32 {
self.inner.get_num_retained()
}
pub fn compact(&self, ordered: bool) -> super::CompactTupleSketch<S> {
super::CompactTupleSketch::from_shim(self.inner.compact(ordered))
}
}