#![deny(missing_docs)]
#![warn(missing_copy_implementations)]
#![warn(trivial_casts)]
#![warn(trivial_numeric_casts)]
#![warn(unused_extern_crates)]
#![warn(unused_import_braces)]
#![warn(unused_qualifications)]
#![allow(unknown_lints)]
#![allow(renamed_and_removed_lints)]
#![allow(clippy::needless_doctest_main)]
#![warn(clippy::cast_possible_truncation)]
#![warn(clippy::cast_possible_wrap)]
#![warn(clippy::cast_precision_loss)]
#![warn(clippy::cast_sign_loss)]
#![warn(clippy::enum_glob_use)]
#![warn(clippy::mut_mut)]
#![warn(clippy::mutex_integer)]
#![warn(clippy::non_ascii_literal)]
#![warn(clippy::nonminimal_bool)]
#![warn(clippy::option_unwrap_used)]
#![warn(clippy::result_unwrap_used)]
#![warn(clippy::single_match_else)]
#![warn(clippy::string_add)]
#![warn(clippy::string_add_assign)]
#![warn(clippy::unicode_not_nfc)]
#![warn(clippy::wrong_pub_self_convention)]
use std::mem::MaybeUninit;
use std::os::raw::c_int;
#[allow(missing_docs, dead_code, non_snake_case, non_camel_case_types)]
#[macro_use]
pub mod ffi {
pub use mpi_sys::*;
}
pub mod attribute;
pub mod collective;
pub mod datatype;
pub mod environment;
pub mod point_to_point;
pub mod raw;
pub mod request;
pub mod topology;
pub mod traits {
pub use crate::attribute::traits::*;
pub use crate::collective::traits::*;
pub use crate::datatype::traits::*;
pub use crate::point_to_point::traits::*;
pub use crate::raw::traits::*;
pub use crate::topology::traits::*;
#[cfg(feature = "derive")]
pub use mpi_derive::Equivalence;
}
#[doc(hidden)]
pub mod internal {
#[cfg(feature = "derive")]
pub use memoffset;
pub use once_cell;
}
#[doc(inline)]
pub use crate::environment::{
initialize, initialize_with_threading, time, time_resolution, Threading,
};
use crate::ffi::MPI_Aint;
pub type Error = c_int;
pub type Count = c_int;
pub type Tag = c_int;
pub type Address = MPI_Aint;
pub use crate::topology::Rank;
type IntArray = smallvec::SmallVec<[c_int; 8]>;
unsafe fn with_uninitialized<F, U, R>(f: F) -> (R, U)
where
F: FnOnce(*mut U) -> R,
{
let mut uninitialized = MaybeUninit::uninit();
let res = f(uninitialized.as_mut_ptr());
(res, uninitialized.assume_init())
}
unsafe fn with_uninitialized2<F, U1, U2, R>(f: F) -> (R, U1, U2)
where
F: FnOnce(*mut U1, *mut U2) -> R,
{
let mut uninitialized1 = MaybeUninit::uninit();
let mut uninitialized2 = MaybeUninit::uninit();
let res = f(uninitialized1.as_mut_ptr(), uninitialized2.as_mut_ptr());
(
res,
uninitialized1.assume_init(),
uninitialized2.assume_init(),
)
}
#[derive(thiserror::Error, Debug)]
pub enum MpiError {
#[error("Failed to spawn {0} of {1} processes")]
Spawn(Rank, Rank),
#[error("An interior 0 byte was found in string")]
StringNul(#[from] std::ffi::NulError),
}