use super::*;
#[no_mangle]
pub extern "C" fn dqcs_mset_new() -> dqcs_handle_t {
insert(QubitMeasurementResultSet::new())
}
#[no_mangle]
pub extern "C" fn dqcs_mset_len(mset: dqcs_handle_t) -> ssize_t {
api_return(-1, || {
resolve!(mset as &mut QubitMeasurementResultSet);
Ok(mset.len() as ssize_t)
})
}
#[no_mangle]
pub extern "C" fn dqcs_mset_contains(
mset: dqcs_handle_t,
qubit: dqcs_qubit_t,
) -> dqcs_bool_return_t {
api_return_bool(|| {
resolve!(mset as &mut QubitMeasurementResultSet);
let qubit = QubitRef::from_foreign(qubit)
.ok_or_else(oe_inv_arg("0 is not a valid qubit reference"))?;
Ok(mset.contains_key(&qubit))
})
}
#[no_mangle]
pub extern "C" fn dqcs_mset_set(mset: dqcs_handle_t, meas: dqcs_handle_t) -> dqcs_return_t {
api_return_none(|| {
resolve!(mset as &mut QubitMeasurementResultSet);
resolve!(meas as pending QubitMeasurementResult);
let meas_ob: &QubitMeasurementResult = meas.as_ref()?;
mset.insert(meas_ob.qubit, meas_ob.clone());
delete!(resolved meas);
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_mset_get(mset: dqcs_handle_t, qubit: dqcs_qubit_t) -> dqcs_handle_t {
api_return(0, || {
resolve!(mset as &QubitMeasurementResultSet);
let qubit = QubitRef::from_foreign(qubit)
.ok_or_else(oe_inv_arg("0 is not a valid qubit reference"))?;
Ok(insert(
mset.get(&qubit)
.ok_or_else(oe_inv_arg("qubit not included in measurement set"))?
.clone(),
))
})
}
#[no_mangle]
pub extern "C" fn dqcs_mset_take(mset: dqcs_handle_t, qubit: dqcs_qubit_t) -> dqcs_handle_t {
api_return(0, || {
resolve!(mset as &mut QubitMeasurementResultSet);
let qubit = QubitRef::from_foreign(qubit)
.ok_or_else(oe_inv_arg("0 is not a valid qubit reference"))?;
Ok(insert(
mset.remove(&qubit)
.ok_or_else(oe_inv_arg("qubit not included in measurement set"))?
.clone(),
))
})
}
#[no_mangle]
pub extern "C" fn dqcs_mset_remove(mset: dqcs_handle_t, qubit: dqcs_qubit_t) -> dqcs_return_t {
api_return_none(|| {
resolve!(mset as &mut QubitMeasurementResultSet);
let qubit = QubitRef::from_foreign(qubit)
.ok_or_else(oe_inv_arg("0 is not a valid qubit reference"))?;
mset.remove(&qubit)
.ok_or_else(oe_inv_arg("qubit not included in measurement set"))?;
Ok(())
})
}
#[no_mangle]
pub extern "C" fn dqcs_mset_take_any(mset: dqcs_handle_t) -> dqcs_handle_t {
api_return(0, || {
resolve!(mset as &mut QubitMeasurementResultSet);
let qubit = *mset
.keys()
.next()
.ok_or_else(oe_inv_arg("measurement set is empty"))?;
Ok(insert(mset.remove(&qubit).unwrap().clone()))
})
}