108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
		
			2.8 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)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** @file status.hpp
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *  This header defines the class @c status, which reports on the
							 | 
						||
| 
								 | 
							
								 *  results of point-to-point communication.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_MPI_STATUS_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_MPI_STATUS_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/mpi/config.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/optional.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { namespace mpi {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class request;
							 | 
						||
| 
								 | 
							
								class communicator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** @brief Contains information about a message that has been or can
							 | 
						||
| 
								 | 
							
								 *  be received.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *  This structure contains status information about messages that
							 | 
						||
| 
								 | 
							
								 *  have been received (with @c communicator::recv) or can be received
							 | 
						||
| 
								 | 
							
								 *  (returned from @c communicator::probe or @c
							 | 
						||
| 
								 | 
							
								 *  communicator::iprobe). It permits access to the source of the
							 | 
						||
| 
								 | 
							
								 *  message, message tag, error code (rarely used), or the number of
							 | 
						||
| 
								 | 
							
								 *  elements that have been transmitted.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class BOOST_MPI_DECL status
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								 public:
							 | 
						||
| 
								 | 
							
								  status() : m_count(-1) { }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  status(MPI_Status const& s) : m_status(s), m_count(-1) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Retrieve the source of the message.
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  int source() const { return m_status.MPI_SOURCE; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Retrieve the message tag.
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  int tag() const { return m_status.MPI_TAG; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Retrieve the error code.
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  int error() const { return m_status.MPI_ERROR; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Determine whether the communication associated with this object
							 | 
						||
| 
								 | 
							
								   * has been successfully cancelled.
							 | 
						||
| 
								 | 
							
								  */
							 | 
						||
| 
								 | 
							
								  bool cancelled() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Determines the number of elements of type @c T contained in the
							 | 
						||
| 
								 | 
							
								   * message. The type @c T must have an associated data type, i.e.,
							 | 
						||
| 
								 | 
							
								   * @c is_mpi_datatype<T> must derive @c mpl::true_. In cases where
							 | 
						||
| 
								 | 
							
								   * the type @c T does not match the transmitted type, this routine
							 | 
						||
| 
								 | 
							
								   * will return an empty @c optional<int>.
							 | 
						||
| 
								 | 
							
								   *
							 | 
						||
| 
								 | 
							
								   * @returns the number of @c T elements in the message, if it can be
							 | 
						||
| 
								 | 
							
								   * determined.
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  template<typename T> optional<int> count() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * References the underlying @c MPI_Status
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  operator       MPI_Status&()       { return m_status; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * References the underlying @c MPI_Status
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  operator const MPI_Status&() const { return m_status; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 private:
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * INTERNAL ONLY
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  template<typename T> optional<int> count_impl(mpl::true_) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * INTERNAL ONLY
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  template<typename T> optional<int> count_impl(mpl::false_) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 public: // friend templates are not portable
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /// INTERNAL ONLY
							 | 
						||
| 
								 | 
							
								  mutable MPI_Status m_status;
							 | 
						||
| 
								 | 
							
								  mutable int m_count;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  friend class communicator;
							 | 
						||
| 
								 | 
							
								  friend class request;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} } // end namespace boost::mpi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // BOOST_MPI_STATUS_HPP
							 |