use super::ReceiverType;
use crate::{
ffi::{ffi_create_c_array, ffi_free_c_array},
signal_chain_correction::{self, ffi},
MetafitsContext,
};
#[repr(C)]
pub struct SignalChainCorrection {
pub receiver_type: ReceiverType,
pub whitening_filter: bool,
pub corrections: *mut f64,
pub num_corrections: usize,
}
impl SignalChainCorrection {
pub fn populate_array(
metafits_context: &MetafitsContext,
) -> (*mut ffi::SignalChainCorrection, usize) {
let mut item_vec: Vec<ffi::SignalChainCorrection> = Vec::new();
if let Some(v) = &metafits_context.signal_chain_corrections {
for item in v.iter() {
let (corrections_ptr, corrections_len) =
ffi_create_c_array(item.corrections.clone());
let out_item = {
let signal_chain_correction::SignalChainCorrection {
receiver_type,
whitening_filter,
corrections: _,
num_corrections: _,
} = item;
signal_chain_correction::ffi::SignalChainCorrection {
receiver_type: *receiver_type,
whitening_filter: *whitening_filter,
corrections: corrections_ptr,
num_corrections: corrections_len,
}
};
item_vec.push(out_item);
}
}
ffi_create_c_array(item_vec)
}
fn destroy_item(item: *mut ffi::SignalChainCorrection) {
if item.is_null() {
return;
}
let a = unsafe { &mut *item };
if !a.corrections.is_null() {
ffi_free_c_array(a.corrections, a.num_corrections);
}
}
pub fn destroy_array(items_ptr: *mut ffi::SignalChainCorrection, items_len: usize) {
let items_slice = unsafe { std::slice::from_raw_parts_mut(items_ptr, items_len) };
for item in items_slice {
Self::destroy_item(item);
}
ffi_free_c_array(items_ptr, items_len);
}
}