apache_datasketches/cpc/
sketch.rs1use crate::error::SketchError;
2use apache_datasketches_sys::cpc_sketch::ffi as sys;
3use cxx::UniquePtr;
4
5pub struct CpcSketch {
12 pub(crate) inner: UniquePtr<sys::CpcSketchShim>,
13}
14
15unsafe impl Send for CpcSketch {}
16
17impl CpcSketch {
18 pub(crate) fn from_lg_k(lg_k: u8) -> Result<Self, SketchError> {
19 let inner = sys::new_cpc_sketch(lg_k)
20 .map_err(|e| SketchError::InvalidConfig(e.what().to_string()))?;
21 Ok(Self { inner })
22 }
23
24 pub fn deserialize(bytes: &[u8]) -> Result<Self, SketchError> {
26 let inner = sys::cpc_sketch_deserialize(bytes)
27 .map_err(|e| SketchError::Deserialization(e.what().to_string()))?;
28 Ok(Self { inner })
29 }
30
31 pub fn update_u64(&mut self, value: u64) {
33 self.inner.pin_mut().update_u64(value);
34 }
35
36 pub fn update_i64(&mut self, value: i64) {
38 self.inner.pin_mut().update_i64(value);
39 }
40
41 pub fn update_u32(&mut self, value: u32) {
43 self.inner.pin_mut().update_u32(value);
44 }
45
46 pub fn update_i32(&mut self, value: i32) {
48 self.inner.pin_mut().update_i32(value);
49 }
50
51 pub fn update_u16(&mut self, value: u16) {
53 self.inner.pin_mut().update_u16(value);
54 }
55
56 pub fn update_i16(&mut self, value: i16) {
58 self.inner.pin_mut().update_i16(value);
59 }
60
61 pub fn update_u8(&mut self, value: u8) {
63 self.inner.pin_mut().update_u8(value);
64 }
65
66 pub fn update_i8(&mut self, value: i8) {
68 self.inner.pin_mut().update_i8(value);
69 }
70
71 pub fn update_f64(&mut self, value: f64) {
73 self.inner.pin_mut().update_f64(value);
74 }
75
76 pub fn update_f32(&mut self, value: f32) {
78 self.inner.pin_mut().update_f32(value);
79 }
80
81 pub fn update_str(&mut self, value: &str) {
83 self.inner.pin_mut().update_str(value);
84 }
85
86 pub fn update_bytes(&mut self, value: &[u8]) {
88 self.inner.pin_mut().update_bytes(value);
89 }
90
91 pub fn is_empty(&self) -> bool {
93 self.inner.is_empty()
94 }
95
96 pub fn get_estimate(&self) -> f64 {
98 self.inner.get_estimate()
99 }
100
101 pub fn get_lower_bound(&self, num_std_dev: u8) -> Result<f64, SketchError> {
107 self.inner
108 .get_lower_bound(num_std_dev)
109 .map_err(|e| SketchError::InvalidConfig(e.what().to_string()))
110 }
111
112 pub fn get_upper_bound(&self, num_std_dev: u8) -> Result<f64, SketchError> {
116 self.inner
117 .get_upper_bound(num_std_dev)
118 .map_err(|e| SketchError::InvalidConfig(e.what().to_string()))
119 }
120
121 pub fn get_lg_k(&self) -> u8 {
123 self.inner.get_lg_k()
124 }
125
126 pub fn to_string_summary(&self) -> String {
129 self.inner.to_string_summary()
130 }
131
132 pub fn serialize(&self) -> Vec<u8> {
136 self.inner.serialize()
137 }
138}
139
140pub fn get_max_serialized_size_bytes(lg_k: u8) -> Result<usize, SketchError> {
145 sys::cpc_sketch_max_serialized_size_bytes(lg_k)
146 .map_err(|e| SketchError::InvalidConfig(e.what().to_string()))
147}