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