#include namespace diy { namespace mpi { namespace detail { // send template< class T, class is_mpi_datatype_ = typename is_mpi_datatype::type > struct send; template struct send { void operator()(MPI_Comm comm, int dest, int tag, const T& x) const { typedef mpi_datatype Datatype; MPI_Send((void*) Datatype::address(x), Datatype::count(x), Datatype::datatype(), dest, tag, comm); } }; // recv template< class T, class is_mpi_datatype_ = typename is_mpi_datatype::type > struct recv; template struct recv { status operator()(MPI_Comm comm, int source, int tag, T& x) const { typedef mpi_datatype Datatype; status s(Datatype::datatype()); MPI_Recv(&x, 1, get_mpi_datatype(), source, tag, comm, &s.s); return s; } }; template struct recv, true_type> { status operator()(MPI_Comm comm, int source, int tag, std::vector& x) const { status s; MPI_Probe(source, tag, comm, &s.s); x.resize(s.count()); MPI_Recv(&x[0], x.size(), get_mpi_datatype(), source, tag, comm, &s.s); return s; } }; // isend template< class T, class is_mpi_datatype_ = typename is_mpi_datatype::type > struct isend; template struct isend { request operator()(MPI_Comm comm, int dest, int tag, const T& x) const { request r; typedef mpi_datatype Datatype; MPI_Isend((void*) Datatype::address(x), Datatype::count(x), Datatype::datatype(), dest, tag, comm, &r.r); return r; } }; // irecv template< class T, class is_mpi_datatype_ = typename is_mpi_datatype::type > struct irecv; template struct irecv { request operator()(MPI_Comm comm, int source, int tag, T& x) const { request r; typedef mpi_datatype Datatype; MPI_Irecv(Datatype::address(x), Datatype::count(x), Datatype::datatype(), source, tag, comm, &r.r); return r; } }; } } }