use opendp_derive::bootstrap;
use crate::{
core::{FfiResult, PrivacyMap},
error::Fallible,
ffi::any::{AnyMeasure, AnyMeasurement, AnyObject, Downcast},
measures::MaxDivergence,
};
#[bootstrap(features("contrib"))]
fn make_pureDP_to_zCDP(measurement: &AnyMeasurement) -> Fallible<AnyMeasurement> {
let privacy_map = measurement.privacy_map.clone();
let measurement = measurement.with_map(
measurement.input_metric.clone(),
measurement
.output_measure
.clone()
.downcast::<MaxDivergence>()?,
PrivacyMap::new_fallible(move |d_in: &AnyObject| privacy_map.eval(d_in)?.downcast::<f64>()),
)?;
let m = super::make_pureDP_to_zCDP(measurement)?;
let privacy_map = m.privacy_map.clone();
m.with_map(
m.input_metric.clone(),
AnyMeasure::new(m.output_measure.clone()),
PrivacyMap::new_fallible(move |d_in: &AnyObject| {
privacy_map.eval(d_in).map(AnyObject::new)
}),
)
}
#[unsafe(no_mangle)]
pub extern "C" fn opendp_combinators__make_pureDP_to_zCDP(
measurement: *const AnyMeasurement,
) -> FfiResult<*mut AnyMeasurement> {
FfiResult::from(make_pureDP_to_zCDP(try_as_ref!(measurement)))
}