[C++-sig] wchar_t* type conversion

Renato Araujo renatox at gmail.com
Mon Jun 22 15:48:54 CEST 2009


Hi Nicolas,

Can  you send a simple example, where the convention fail (c++ to
python or python to c++)? What kind of test you are running?

BR
Renato



On Mon, Jun 22, 2009 at 8:31 AM, Nicolas Lara<nicolaslara at gmail.com> wrote:
> Hello,
> I'm new to Boost::Python and am encountering a problem that seem to be
> quite common: I need to expose a class to C++ whose constructor takes
> a wchar_t* as a parameter.
> The problem is that there is no default type converter from wchar_t to
> python and vice-versa.
>
> I wanted to know if there was a standard way of doing this. Or if
> anyone could point me to an implementation of this type conversion.
>
> So far I'm doing this (based on the faq):
>
> struct wchar_t_to_python_str
> {
>  static PyObject* convert(wchar_t* const& w)
>  {
>    string s = "";
>    wchar_t* w2 = w;
>    while(*w2++ != 0){
>      s += *w2;
>    }
>    return boost::python::incref(boost::python::object(s).ptr());
>  }
> };
>
> struct wchar_t_from_python_str
> {
>  wchar_t_from_python_str()
>  {
>    boost::python::converter::registry::push_back(
>                           &convertible,
>                           &construct,
>                           boost::python::type_id<wchar_t>());
>  }
>
>  static void* convertible(PyObject* obj_ptr)
>  {
>    if (!PyString_Check(obj_ptr)) return 0;
>    return obj_ptr;
>  }
>
>  static void construct(
>                        PyObject* obj_ptr,
>
> boost::python::converter::rvalue_from_python_stage1_data* data)
>  {
>    const char* value = PyString_AsString(obj_ptr);
>    Py_ssize_t l = PyString_Size(obj_ptr);
>    if (value == 0) boost::python::throw_error_already_set();
>    void* storage = (
>
> (boost::python::converter::rvalue_from_python_storage<wchar_t*>*)
>                     data)->storage.bytes;
>
>    wchar_t* w = new wchar_t[l];
>    for(int i=0;i<l;i++){
>      w[i] = value[i];
>    }
>    data->convertible = w;
>  }
> };
>  void init_module()
>  {
>    to_python_converter<wchar_t*,wchar_t_to_python_str>();
>    wchar_t_from_python_str();
>   }
>
> BOOST_PYTHON_MODULE(queryparser){
>  init_module();
> }
>
> But it doesn't seem to be working. It compiles, but python doesn't
> understand the conversion.
> Any thoughts?
>
>
> Thanks in advance!
>
> --
> Nicolas Lara
> Linux user #380134
> http://nicolas-lara.blogspot.com/
> Public key id: 0x152e7713 at http://subkeys.pgp.net/
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig
>



-- 
Renato Araujo Oliveira Filho


More information about the Cplusplus-sig mailing list