1#![deny(warnings)]
2extern crate mpi_fork_fnsp as mpi;
3
4use mpi::{datatype::UserDatatype, traits::*};
5use std::mem::size_of;
6
7struct MyInts([i32; 3]);
8
9unsafe impl Equivalence for MyInts {
10 type Out = UserDatatype;
11 fn equivalent_datatype() -> Self::Out {
12 UserDatatype::structured(
13 &[1, 1, 1],
14 &[
15 (size_of::<i32>() * 2) as mpi::Address,
16 size_of::<i32>() as mpi::Address,
17 0,
18 ],
19 &[i32::equivalent_datatype(); 3],
20 )
21 }
22}
23
24fn main() {
25 let universe = mpi::initialize().unwrap();
26 let world = universe.world();
27
28 let root_process = world.process_at_rank(0);
29
30 if world.rank() == 0 {
31 root_process.broadcast_into(&mut MyInts([3, 2, 1]));
32 } else {
33 let mut ints: [i32; 3] = [0, 0, 0];
34 root_process.broadcast_into(&mut ints[..]);
35
36 assert_eq!([1, 2, 3], ints);
37 }
38}