97 lines
2.5 KiB
C++
97 lines
2.5 KiB
C++
// 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
|
|
|