request_with_value.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 72 行

HPP
72
字号
// (C) Copyright 2006 // Douglas Gregor <doug.gregor -at- gmail.com>// Andreas Kloeckner <inform -at- tiker.net>// 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)//  Authors: Douglas Gregor, Andreas Kloeckner#ifndef BOOST_MPI_PYTHON_REQUEST_WITH_VALUE_HPP#define BOOST_MPI_PYTHON_REQUEST_WITH_VALUE_HPP#include <boost/python.hpp>#include <boost/mpi.hpp>namespace boost { namespace mpi { namespace python {  /** This wrapper adds a @c boost::python::object value to the @c   * boost::mpi::request structure, for the benefit of @c irecv() requests.   *   * In order to be able to return the value of his requests to the user, we   * need a handle that we can update to contain the transmitted value once the   * request completes. Since we're passing the address on to irecv to fill at   * any time in the future, this address may not change over time.    *   * There are two possible cases:    * - plain irecv()   * - skeleton-content irecv()   *   * In the first case, we need to own the storage from this object, the   * m_internal_value is used for this. In the second case, the updated   * python::object is part of a boost::mpi::python::content object: the   * m_external_value field handles this case. Furthermore, in the latter case,   * we now have a lifetime dependency on that content object; this can be   * handled with the BPL's with_custodian_and_ward facility.   *   * Since requests and request_with_value are supposed to be copyconstructible,   * we can't put the handle immediately inside this instance. Moreover, since   * we need to be able to put request_with_value inside request_vectors, any   * values we own must be held in a shared_ptr instance.   */  class request_with_value : public request   {     private:      boost::shared_ptr<boost::python::object> m_internal_value;      boost::python::object *m_external_value;    public:      request_with_value()        : m_external_value(0)      { }      request_with_value(const request &req)        : request(req), m_external_value(0)      { }      const boost::python::object get_value() const;      const boost::python::object get_value_or_none() const;      const boost::python::object wrap_wait();      const boost::python::object wrap_test();      friend request_with_value communicator_irecv(const communicator &, int, int);      friend request_with_value communicator_irecv_content(          const communicator&, int, int, content&);  };} } }#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?