| // Copyright (C) 2006 Douglas Gregor <doug.gregor -at- gmail.com>. |
| |
| // 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) |
| |
| // Skeleton and content support for communicators |
| |
| // This header should be included only after both communicator.hpp and |
| // skeleton_and_content.hpp have been included. |
| #ifndef BOOST_MPI_COMMUNICATOR_SC_HPP |
| #define BOOST_MPI_COMMUNICATOR_SC_HPP |
| |
| namespace boost { namespace mpi { |
| |
| template<typename T> |
| void |
| communicator::send(int dest, int tag, const skeleton_proxy<T>& proxy) const |
| { |
| packed_skeleton_oarchive ar(*this); |
| ar << proxy.object; |
| send(dest, tag, ar); |
| } |
| |
| template<typename T> |
| status |
| communicator::recv(int source, int tag, const skeleton_proxy<T>& proxy) const |
| { |
| packed_skeleton_iarchive ar(*this); |
| status result = recv(source, tag, ar); |
| ar >> proxy.object; |
| return result; |
| } |
| |
| template<typename T> |
| status communicator::recv(int source, int tag, skeleton_proxy<T>& proxy) const |
| { |
| packed_skeleton_iarchive ar(*this); |
| status result = recv(source, tag, ar); |
| ar >> proxy.object; |
| return result; |
| } |
| |
| template<typename T> |
| request |
| communicator::isend(int dest, int tag, const skeleton_proxy<T>& proxy) const |
| { |
| shared_ptr<packed_skeleton_oarchive> |
| archive(new packed_skeleton_oarchive(*this)); |
| |
| *archive << proxy.object; |
| request result = isend(dest, tag, *archive); |
| result.m_data = archive; |
| return result; |
| } |
| |
| namespace detail { |
| template<typename T> |
| struct serialized_irecv_data<const skeleton_proxy<T> > |
| { |
| serialized_irecv_data(const communicator& comm, int source, int tag, |
| skeleton_proxy<T> proxy) |
| : comm(comm), source(source), tag(tag), isa(comm), |
| ia(isa.get_skeleton()), proxy(proxy) { } |
| |
| void deserialize(status& stat) |
| { |
| isa >> proxy.object; |
| stat.m_count = 1; |
| } |
| |
| communicator comm; |
| int source; |
| int tag; |
| std::size_t count; |
| packed_skeleton_iarchive isa; |
| packed_iarchive& ia; |
| skeleton_proxy<T> proxy; |
| }; |
| |
| template<typename T> |
| struct serialized_irecv_data<skeleton_proxy<T> > |
| : public serialized_irecv_data<const skeleton_proxy<T> > |
| { |
| typedef serialized_irecv_data<const skeleton_proxy<T> > inherited; |
| |
| serialized_irecv_data(const communicator& comm, int source, int tag, |
| const skeleton_proxy<T>& proxy) |
| : inherited(comm, source, tag, proxy) { } |
| }; |
| } |
| |
| } } // end namespace boost::mpi |
| |
| #endif // BOOST_MPI_COMMUNICATOR_SC_HPP |
| |