Chris@16: // Copyright (C) 2006 Douglas Gregor . Chris@16: Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // Skeleton and content support for communicators Chris@16: Chris@16: // This header should be included only after both communicator.hpp and Chris@16: // skeleton_and_content.hpp have been included. Chris@16: #ifndef BOOST_MPI_COMMUNICATOR_SC_HPP Chris@16: #define BOOST_MPI_COMMUNICATOR_SC_HPP Chris@16: Chris@16: namespace boost { namespace mpi { Chris@16: Chris@16: template Chris@16: void Chris@16: communicator::send(int dest, int tag, const skeleton_proxy& proxy) const Chris@16: { Chris@16: packed_skeleton_oarchive ar(*this); Chris@16: ar << proxy.object; Chris@16: send(dest, tag, ar); Chris@16: } Chris@16: Chris@16: template Chris@16: status Chris@16: communicator::recv(int source, int tag, const skeleton_proxy& proxy) const Chris@16: { Chris@16: packed_skeleton_iarchive ar(*this); Chris@16: status result = recv(source, tag, ar); Chris@16: ar >> proxy.object; Chris@16: return result; Chris@16: } Chris@16: Chris@16: template Chris@16: status communicator::recv(int source, int tag, skeleton_proxy& proxy) const Chris@16: { Chris@16: packed_skeleton_iarchive ar(*this); Chris@16: status result = recv(source, tag, ar); Chris@16: ar >> proxy.object; Chris@16: return result; Chris@16: } Chris@16: Chris@16: template Chris@16: request Chris@16: communicator::isend(int dest, int tag, const skeleton_proxy& proxy) const Chris@16: { Chris@16: shared_ptr Chris@16: archive(new packed_skeleton_oarchive(*this)); Chris@16: Chris@16: *archive << proxy.object; Chris@16: request result = isend(dest, tag, *archive); Chris@16: result.m_data = archive; Chris@16: return result; Chris@16: } Chris@16: Chris@16: namespace detail { Chris@16: template Chris@16: struct serialized_irecv_data > Chris@16: { Chris@16: serialized_irecv_data(const communicator& comm, int source, int tag, Chris@16: skeleton_proxy proxy) Chris@16: : comm(comm), source(source), tag(tag), isa(comm), Chris@16: ia(isa.get_skeleton()), proxy(proxy) { } Chris@16: Chris@16: void deserialize(status& stat) Chris@16: { Chris@16: isa >> proxy.object; Chris@16: stat.m_count = 1; Chris@16: } Chris@16: Chris@16: communicator comm; Chris@16: int source; Chris@16: int tag; Chris@16: std::size_t count; Chris@16: packed_skeleton_iarchive isa; Chris@16: packed_iarchive& ia; Chris@16: skeleton_proxy proxy; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct serialized_irecv_data > Chris@16: : public serialized_irecv_data > Chris@16: { Chris@16: typedef serialized_irecv_data > inherited; Chris@16: Chris@16: serialized_irecv_data(const communicator& comm, int source, int tag, Chris@16: const skeleton_proxy& proxy) Chris@16: : inherited(comm, source, tag, proxy) { } Chris@16: }; Chris@16: } Chris@16: Chris@16: } } // end namespace boost::mpi Chris@16: Chris@16: #endif // BOOST_MPI_COMMUNICATOR_SC_HPP Chris@16: