Chris@16
|
1 // Copyright (C) 2006 Douglas Gregor <doug.gregor -at- gmail.com>.
|
Chris@16
|
2
|
Chris@16
|
3 // Use, modification and distribution is subject to the Boost Software
|
Chris@16
|
4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
5 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6
|
Chris@16
|
7 // Skeleton and content support for communicators
|
Chris@16
|
8
|
Chris@16
|
9 // This header should be included only after both communicator.hpp and
|
Chris@16
|
10 // skeleton_and_content.hpp have been included.
|
Chris@16
|
11 #ifndef BOOST_MPI_COMMUNICATOR_SC_HPP
|
Chris@16
|
12 #define BOOST_MPI_COMMUNICATOR_SC_HPP
|
Chris@16
|
13
|
Chris@16
|
14 namespace boost { namespace mpi {
|
Chris@16
|
15
|
Chris@16
|
16 template<typename T>
|
Chris@16
|
17 void
|
Chris@16
|
18 communicator::send(int dest, int tag, const skeleton_proxy<T>& proxy) const
|
Chris@16
|
19 {
|
Chris@16
|
20 packed_skeleton_oarchive ar(*this);
|
Chris@16
|
21 ar << proxy.object;
|
Chris@16
|
22 send(dest, tag, ar);
|
Chris@16
|
23 }
|
Chris@16
|
24
|
Chris@16
|
25 template<typename T>
|
Chris@16
|
26 status
|
Chris@16
|
27 communicator::recv(int source, int tag, const skeleton_proxy<T>& proxy) const
|
Chris@16
|
28 {
|
Chris@16
|
29 packed_skeleton_iarchive ar(*this);
|
Chris@16
|
30 status result = recv(source, tag, ar);
|
Chris@16
|
31 ar >> proxy.object;
|
Chris@16
|
32 return result;
|
Chris@16
|
33 }
|
Chris@16
|
34
|
Chris@16
|
35 template<typename T>
|
Chris@16
|
36 status communicator::recv(int source, int tag, skeleton_proxy<T>& proxy) const
|
Chris@16
|
37 {
|
Chris@16
|
38 packed_skeleton_iarchive ar(*this);
|
Chris@16
|
39 status result = recv(source, tag, ar);
|
Chris@16
|
40 ar >> proxy.object;
|
Chris@16
|
41 return result;
|
Chris@16
|
42 }
|
Chris@16
|
43
|
Chris@16
|
44 template<typename T>
|
Chris@16
|
45 request
|
Chris@16
|
46 communicator::isend(int dest, int tag, const skeleton_proxy<T>& proxy) const
|
Chris@16
|
47 {
|
Chris@16
|
48 shared_ptr<packed_skeleton_oarchive>
|
Chris@16
|
49 archive(new packed_skeleton_oarchive(*this));
|
Chris@16
|
50
|
Chris@16
|
51 *archive << proxy.object;
|
Chris@16
|
52 request result = isend(dest, tag, *archive);
|
Chris@16
|
53 result.m_data = archive;
|
Chris@16
|
54 return result;
|
Chris@16
|
55 }
|
Chris@16
|
56
|
Chris@16
|
57 namespace detail {
|
Chris@16
|
58 template<typename T>
|
Chris@16
|
59 struct serialized_irecv_data<const skeleton_proxy<T> >
|
Chris@16
|
60 {
|
Chris@16
|
61 serialized_irecv_data(const communicator& comm, int source, int tag,
|
Chris@16
|
62 skeleton_proxy<T> proxy)
|
Chris@16
|
63 : comm(comm), source(source), tag(tag), isa(comm),
|
Chris@16
|
64 ia(isa.get_skeleton()), proxy(proxy) { }
|
Chris@16
|
65
|
Chris@16
|
66 void deserialize(status& stat)
|
Chris@16
|
67 {
|
Chris@16
|
68 isa >> proxy.object;
|
Chris@16
|
69 stat.m_count = 1;
|
Chris@16
|
70 }
|
Chris@16
|
71
|
Chris@16
|
72 communicator comm;
|
Chris@16
|
73 int source;
|
Chris@16
|
74 int tag;
|
Chris@16
|
75 std::size_t count;
|
Chris@16
|
76 packed_skeleton_iarchive isa;
|
Chris@16
|
77 packed_iarchive& ia;
|
Chris@16
|
78 skeleton_proxy<T> proxy;
|
Chris@16
|
79 };
|
Chris@16
|
80
|
Chris@16
|
81 template<typename T>
|
Chris@16
|
82 struct serialized_irecv_data<skeleton_proxy<T> >
|
Chris@16
|
83 : public serialized_irecv_data<const skeleton_proxy<T> >
|
Chris@16
|
84 {
|
Chris@16
|
85 typedef serialized_irecv_data<const skeleton_proxy<T> > inherited;
|
Chris@16
|
86
|
Chris@16
|
87 serialized_irecv_data(const communicator& comm, int source, int tag,
|
Chris@16
|
88 const skeleton_proxy<T>& proxy)
|
Chris@16
|
89 : inherited(comm, source, tag, proxy) { }
|
Chris@16
|
90 };
|
Chris@16
|
91 }
|
Chris@16
|
92
|
Chris@16
|
93 } } // end namespace boost::mpi
|
Chris@16
|
94
|
Chris@16
|
95 #endif // BOOST_MPI_COMMUNICATOR_SC_HPP
|
Chris@16
|
96
|