You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
96 lines
2.5 KiB
96 lines
2.5 KiB
// 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 |
|
|
|
|