97 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			97 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // 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 | ||
|  | 
 |