use std::convert::TryInto;
use dvcompute_network::network::*;
use libc::*;
#[cfg_attr(windows, link(name = "dvcompute_mpi.dll"))]
#[cfg_attr(not(windows), link(name = "dvcompute_mpi"))]
extern {
#[doc(hidden)]
pub fn init_extern_mpi_network_support();
#[doc(hidden)]
pub fn finalize_extern_mpi_network_support();
#[doc(hidden)]
pub fn create_extern_mpi_network_support(create_buf: unsafe extern "C" fn(size: c_ulong) -> NetworkBuffer) -> NetworkSupport;
#[doc(hidden)]
pub fn create_extern_mpi_network_support_by_index(create_buf: unsafe extern "C" fn(size: c_ulong) -> NetworkBuffer, run_index: c_int) -> NetworkSupport;
#[doc(hidden)]
pub fn extern_mpi_network_support_v3();
}
pub fn init_mpi_network_support() {
unsafe {
init_extern_mpi_network_support();
extern_mpi_network_support_v3();
}
}
pub fn finalize_mpi_network_support() {
unsafe {
finalize_extern_mpi_network_support()
}
}
pub fn create_mpi_network_support() -> NetworkSupport {
unsafe {
create_extern_mpi_network_support(create_buf)
}
}
pub fn create_mpi_network_support_by_index(run_index: usize) -> NetworkSupport {
let run_index: c_int = run_index.try_into().expect("Expected the integer run index.");
unsafe {
create_extern_mpi_network_support_by_index(create_buf, run_index)
}
}
unsafe extern "C" fn create_buf(size: c_ulong) -> NetworkBuffer {
let size = size as usize;
let mut vec = Vec::with_capacity(size);
vec.resize(size, 0);
NetworkBuffer::new(vec)
}