// Copyright 2005 Douglas Gregor.



// Use, modification and distribution is subject to the Boost Software

// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

// http://www.boost.org/LICENSE_1_0.txt)



// Message Passing Interface 1.1 -- Section 3. MPI Point-to-point

#ifndef BOOST_MPI_DETAIL_POINT_TO_POINT_HPP

#define BOOST_MPI_DETAIL_POINT_TO_POINT_HPP



// For (de-)serializing sends and receives

#include <boost/mpi/config.hpp>

#include <boost/mpi/packed_oarchive.hpp>

#include <boost/mpi/packed_iarchive.hpp>



namespace boost { namespace mpi { namespace detail {



/** Sends a packed archive using MPI_Send. */

BOOST_MPI_DECL void

packed_archive_send(MPI_Comm comm, int dest, int tag,

                    const packed_oarchive& ar);



/** Sends a packed archive using MPI_Isend.

 *

 * This routine may split sends into multiple packets. The MPI_Request

 * for each packet will be placed into the out_requests array, up to

 * num_out_requests packets. The number of packets sent will be

 * returned from the function.

 *

 * @pre num_out_requests >= 2

 */

BOOST_MPI_DECL int

packed_archive_isend(MPI_Comm comm, int dest, int tag,

                     const packed_oarchive& ar,

                     MPI_Request* out_requests, int num_out_requests);



/**

 * \overload

 */

BOOST_MPI_DECL int

packed_archive_isend(MPI_Comm comm, int dest, int tag,

                     const packed_iarchive& ar,

                     MPI_Request* out_requests, int num_out_requests);



/** Receives a packed archive using MPI_Recv. */

BOOST_MPI_DECL void

packed_archive_recv(MPI_Comm comm, int source, int tag, packed_iarchive& ar,

                    MPI_Status& status);



} } } // end namespace boost::mpi::detail



#endif // BOOST_MPI_DETAIL_POINT_TO_POINT_HPP

