blob: 53aa4dedf916c11ebd3642abf945468197ed3db7 [file] [log] [blame]
// (C) Copyright 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)
// Authors: Douglas Gregor
/** @file request.cpp
*
* This file reflects the Boost.MPI @c request class into
* Python.
*/
#include <boost/python.hpp>
#include <boost/mpi.hpp>
#include "request_with_value.hpp"
using namespace boost::python;
using namespace boost::mpi;
const object python::request_with_value::get_value() const
{
if (m_internal_value.get())
return *m_internal_value;
else if (m_external_value)
return *m_external_value;
else
{
PyErr_SetString(PyExc_ValueError, "request value not available");
throw boost::python::error_already_set();
}
}
const object python::request_with_value::get_value_or_none() const
{
if (m_internal_value.get())
return *m_internal_value;
else if (m_external_value)
return *m_external_value;
else
return object();
}
const object python::request_with_value::wrap_wait()
{
status stat = request::wait();
if (m_internal_value.get() || m_external_value)
return boost::python::make_tuple(get_value(), stat);
else
return object(stat);
}
const object python::request_with_value::wrap_test()
{
::boost::optional<status> stat = request::test();
if (stat)
{
if (m_internal_value.get() || m_external_value)
return boost::python::make_tuple(get_value(), *stat);
else
return object(*stat);
}
else
return object();
}
namespace boost { namespace mpi { namespace python {
extern const char* request_docstring;
extern const char* request_with_value_docstring;
extern const char* request_wait_docstring;
extern const char* request_test_docstring;
extern const char* request_cancel_docstring;
extern const char* request_value_docstring;
void export_request()
{
using boost::python::arg;
using boost::python::object;
{
typedef request cl;
class_<cl>("Request", request_docstring, no_init)
.def("wait", &cl::wait, request_wait_docstring)
.def("test", &cl::test, request_test_docstring)
.def("cancel", &cl::cancel, request_cancel_docstring)
;
}
{
typedef request_with_value cl;
class_<cl, bases<request> >(
"RequestWithValue", request_with_value_docstring, no_init)
.def("wait", &cl::wrap_wait, request_wait_docstring)
.def("test", &cl::wrap_test, request_test_docstring)
;
}
implicitly_convertible<request, request_with_value>();
}
} } } // end namespace boost::mpi::python