| // 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 |