Hi, I am trying to return a new Python buffer that is a view to internals of my Message object. My understanding is that in such case, I should use return_internal_reference<> to make the return value hold reference to the Message class because of this bit of PyBuffer_FromMemory() docs: "The caller is responsible for ensuring that the memory buffer, passed in as ptr, is not deallocated while the returned buffer object exists."
The problem is that whatever approach I could think of results into uncompilable code. (See the attached file.) I am using Boost 1.37.0. Is there any other way that I can do this? -- VH
#define BOOST_PYTHON_STATIC_MODULE
#include <boost/python.hpp>
#include <boost/shared_ptr.hpp>
namespace py = boost::python;
struct Message
{
char const * data () const { return buf; }
size_t size () const { return 10; }
char buf[10];
};
// error C2027: use of undefined type
//
'boost::python::detail::reference_existing_object_requires_a_pointer_or_reference_return_type<R>
py::object
get_buffer_impl_1 (boost::shared_ptr<Message> const & msg)
{
py::handle<> h (
::PyBuffer_FromMemory (
const_cast<char *>(msg->data ()),
msg->size ()));
py::object o (h);
return o;
}
// pointer_holder.hpp(176) : error C2535:
//
'boost::python::objects::pointer_holder<Pointer,Value>::pointer_holder(Pointer)'
:
// member function already defined or declared
::PyObject *
get_buffer_impl_2 (boost::shared_ptr<Message> const & msg)
{
return ::PyBuffer_FromMemory (
const_cast<char *>(msg->data ()),
msg->size ());
}
void
dec_ref (::PyObject * o)
{
Py_XDECREF (o);
}
// Same error as the 1st attempt:
// error C2027: use of undefined type
//
'boost::python::detail::reference_existing_object_requires_a_pointer_or_reference_return_type<R>'
boost::shared_ptr< ::PyObject>
get_buffer_impl_3 (boost::shared_ptr<Message> const & msg)
{
return boost::shared_ptr< ::PyObject> (
::PyBuffer_FromMemory (
const_cast<char *>(msg->data ()),
msg->size ()),
dec_ref);
}
BOOST_PYTHON_MODULE(M)
{
py::class_<Message, boost::noncopyable>
("Message", py::no_init)
.def ("get_buffer_1", &get_buffer_impl_1,
py::return_internal_reference<1> ())
.def ("get_buffer_2", &get_buffer_impl_2,
py::return_internal_reference<1> ())
.def ("get_buffer_3", &get_buffer_impl_3,
py::return_internal_reference<1> ())
;
}
smime.p7s
Description: S/MIME Cryptographic Signature
_______________________________________________ Cplusplus-sig mailing list [email protected] http://mail.python.org/mailman/listinfo/cplusplus-sig
