10 template< class T, class is_mpi_datatype_ = typename is_mpi_datatype<T>::type >
14 struct send<T, true_type>
16 void operator()(MPI_Comm comm,
int dest,
int tag,
const T& x)
const
18 typedef mpi_datatype<T> Datatype;
19 MPI_Send((
void*) Datatype::address(x),
27 template< class T, class is_mpi_datatype_ = typename is_mpi_datatype<T>::type >
31 struct recv<T, true_type>
33 status operator()(MPI_Comm comm,
int source,
int tag, T& x)
const
35 typedef mpi_datatype<T> Datatype;
37 MPI_Recv((
void*) Datatype::address(x),
40 source, tag, comm, &s.s);
46 struct recv<std::vector<U>, true_type>
48 status operator()(MPI_Comm comm,
int source,
int tag, std::vector<U>& x)
const
52 MPI_Probe(source, tag, comm, &s.s);
53 x.resize(s.count<U>());
54 MPI_Recv(&x[0], x.size(), get_mpi_datatype<U>(), source, tag, comm, &s.s);
60 template< class T, class is_mpi_datatype_ = typename is_mpi_datatype<T>::type >
64 struct isend<T, true_type>
66 request operator()(MPI_Comm comm,
int dest,
int tag,
const T& x)
const
69 typedef mpi_datatype<T> Datatype;
70 MPI_Isend((
void*) Datatype::address(x),
73 dest, tag, comm, &r.r);
79 template< class T, class is_mpi_datatype_ = typename is_mpi_datatype<T>::type >
83 struct irecv<T, true_type>
85 request operator()(MPI_Comm comm,
int source,
int tag, T& x)
const
88 typedef mpi_datatype<T> Datatype;
89 MPI_Irecv(Datatype::address(x),
92 source, tag, comm, &r.r);