use super::*;
#[no_mangle]
pub extern "C" fn dqcs_qbset_new() -> dqcs_handle_t {
insert(QubitReferenceSet::new())
}
#[no_mangle]
pub extern "C" fn dqcs_qbset_contains(
qbset: dqcs_handle_t,
qubit: dqcs_qubit_t,
) -> dqcs_bool_return_t {
api_return_bool(|| {
resolve!(qbset as &mut QubitReferenceSet);
let qubit = QubitRef::from_foreign(qubit)
.ok_or_else(oe_inv_arg("0 is not a valid qubit reference"))?;
Ok(qbset.contains(&qubit))
})
}
#[no_mangle]
pub extern "C" fn dqcs_qbset_push(qbset: dqcs_handle_t, qubit: dqcs_qubit_t) -> dqcs_return_t {
api_return_none(|| {
resolve!(qbset as &mut QubitReferenceSet);
let qubit = QubitRef::from_foreign(qubit)
.ok_or_else(oe_inv_arg("0 is not a valid qubit reference"))?;
if qbset.contains(&qubit) {
inv_arg("the specified qubit is already part of the set")
} else {
qbset.push_back(qubit);
Ok(())
}
})
}
#[no_mangle]
pub extern "C" fn dqcs_qbset_pop(qbset: dqcs_handle_t) -> dqcs_qubit_t {
api_return(0, || {
resolve!(qbset as &mut QubitReferenceSet);
if let Some(qubit) = qbset.pop_front() {
Ok(qubit.to_foreign())
} else {
inv_arg("the qubit set is already empty")
}
})
}
#[no_mangle]
pub extern "C" fn dqcs_qbset_len(qbset: dqcs_handle_t) -> ssize_t {
api_return(-1, || {
resolve!(qbset as &QubitReferenceSet);
Ok(qbset.len() as ssize_t)
})
}
#[no_mangle]
pub extern "C" fn dqcs_qbset_copy(qbset: dqcs_handle_t) -> dqcs_handle_t {
api_return(0, || {
resolve!(qbset as &QubitReferenceSet);
Ok(insert(qbset.clone()))
})
}