Mercurial > pytave
diff oct-py-types.cc @ 402:c4b78e449c62
maint: indent functions declared in the pytave namespace
* oct-py-eval.cc, oct-py-eval.h, oct-py-types.cc, oct-py-types.h,
oct-py-util.cc, oct-py-util.h: Indent functions declared in the pytave
namespace, adjust line wrap where necessary.
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Fri, 28 Apr 2017 14:07:57 -0700 |
parents | 6c316b5f30f7 |
children | 3644df6564bc |
line wrap: on
line diff
--- a/oct-py-types.cc Fri Apr 28 14:04:58 2017 -0700 +++ b/oct-py-types.cc Fri Apr 28 14:07:57 2017 -0700 @@ -40,132 +40,133 @@ namespace pytave { -PyObject * -make_py_bool (bool value) -{ - if (value) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} + PyObject * + make_py_bool (bool value) + { + if (value) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; + } -PyObject * -make_py_complex (std::complex<double> value) -{ - Py_complex& py_complex_value = reinterpret_cast<Py_complex&> (value); - return PyComplex_FromCComplex (py_complex_value); -} + PyObject * + make_py_complex (std::complex<double> value) + { + Py_complex& py_complex_value = reinterpret_cast<Py_complex&> (value); + return PyComplex_FromCComplex (py_complex_value); + } -PyObject * -make_py_float (double value) -{ - return PyFloat_FromDouble (value); -} + PyObject * + make_py_float (double value) + { + return PyFloat_FromDouble (value); + } -bool -extract_py_bool (PyObject *obj) -{ - if (! obj) - throw object_convert_exception ("failed to extract boolean: null object"); + bool + extract_py_bool (PyObject *obj) + { + if (! obj) + throw object_convert_exception ("failed to extract boolean: null object"); - if (! PyBool_Check (obj)) - throw object_convert_exception ("failed to extract boolean: wrong type"); + if (! PyBool_Check (obj)) + throw object_convert_exception ("failed to extract boolean: wrong type"); - return (obj == Py_True); -} + return (obj == Py_True); + } -std::complex<double> -extract_py_complex (PyObject *obj) -{ - if (! obj) - throw object_convert_exception ("failed to extract complex: null object"); + std::complex<double> + extract_py_complex (PyObject *obj) + { + if (! obj) + throw object_convert_exception ("failed to extract complex: null object"); - if (! PyComplex_Check (obj)) - throw object_convert_exception ("failed to extract complex: wrong type"); + if (! PyComplex_Check (obj)) + throw object_convert_exception ("failed to extract complex: wrong type"); - Py_complex value = PyComplex_AsCComplex (obj); - return reinterpret_cast<std::complex<double>&> (value); -} + Py_complex value = PyComplex_AsCComplex (obj); + return reinterpret_cast<std::complex<double>&> (value); + } -double -extract_py_float (PyObject *obj) -{ - if (! obj) - throw object_convert_exception ("failed to extract float: null object"); + double + extract_py_float (PyObject *obj) + { + if (! obj) + throw object_convert_exception ("failed to extract float: null object"); - if (! PyFloat_Check (obj)) - throw object_convert_exception ("failed to extract float: wrong type"); + if (! PyFloat_Check (obj)) + throw object_convert_exception ("failed to extract float: wrong type"); - return PyFloat_AsDouble (obj); -} + return PyFloat_AsDouble (obj); + } -PyObject * -make_py_int (int32_t value) -{ + PyObject * + make_py_int (int32_t value) + { #if PY_VERSION_HEX >= 0x03000000 - return PyLong_FromLong (value); + return PyLong_FromLong (value); #else - return PyInt_FromLong (value); + return PyInt_FromLong (value); #endif -} + } -PyObject * -make_py_int (uint32_t value) -{ - return PyLong_FromUnsignedLong (value); -} + PyObject * + make_py_int (uint32_t value) + { + return PyLong_FromUnsignedLong (value); + } -PyObject * -make_py_int (int64_t value) -{ + PyObject * + make_py_int (int64_t value) + { #if (defined (HAVE_LONG_LONG) && (SIZEOF_LONG_LONG > SIZEOF_LONG)) - return PyLong_FromLongLong (value); + return PyLong_FromLongLong (value); #else - return PyLong_FromLong (value); + return PyLong_FromLong (value); #endif -} + } -PyObject * -make_py_int (uint64_t value) -{ + PyObject * + make_py_int (uint64_t value) + { #if (defined (HAVE_LONG_LONG) && (SIZEOF_LONG_LONG > SIZEOF_LONG)) - return PyLong_FromUnsignedLongLong (value); + return PyLong_FromUnsignedLongLong (value); #else - return PyLong_FromUnsignedLong (value); + return PyLong_FromUnsignedLong (value); #endif -} + } -PyObject * -make_py_array (const void *data, size_t len, char typecode) -{ - if (! typecode) - throw object_convert_exception ("unable to create array from Octave data"); + PyObject * + make_py_array (const void *data, size_t len, char typecode) + { + if (! typecode) + throw object_convert_exception + ("unable to create array from Octave data"); - std::string arg { typecode }; - PyObject *array = py_call_function ("array.array", ovl (arg)); + std::string arg { typecode }; + PyObject *array = py_call_function ("array.array", ovl (arg)); - if (len > 0) - { - // create a byte buffer containing a copy of the array binary data - const char *cdata = reinterpret_cast<const char *> (data); - PyObject *buf = PyBytes_FromStringAndSize (cdata, len); - if (! buf) - octave_throw_bad_alloc (); + if (len > 0) + { + // create a byte buffer containing a copy of the array binary data + const char *cdata = reinterpret_cast<const char *> (data); + PyObject *buf = PyBytes_FromStringAndSize (cdata, len); + if (! buf) + octave_throw_bad_alloc (); - PyObject *frombytes = (PyObject_HasAttrString (array, "frombytes") ? - PyObject_GetAttrString (array, "frombytes") : - PyObject_GetAttrString (array, "fromstring")); - PyObject *args = PyTuple_Pack (1, buf); - py_call_function (frombytes, args); - Py_DECREF (args); - Py_DECREF (buf); - } + PyObject *frombytes = (PyObject_HasAttrString (array, "frombytes") ? + PyObject_GetAttrString (array, "frombytes") : + PyObject_GetAttrString (array, "fromstring")); + PyObject *args = PyTuple_Pack (1, buf); + py_call_function (frombytes, args); + Py_DECREF (args); + Py_DECREF (buf); + } - return array; -} + return array; + } -// Prefer the 'q' and 'Q' typecodes if they are available (if Python 3 and -// built with support for long long integers) + // Prefer the 'q' and 'Q' typecodes if they are available (if Python 3 and + // built with support for long long integers) #if (PY_VERSION_HEX >= 0x03000000) && defined (HAVE_LONG_LONG) # define ARRAY_INT64_TYPECODE 'q' @@ -178,338 +179,341 @@ # define ARRAY_UINT64_TYPECODE 0 #endif -template <typename T> -struct py_array_info { }; + template <typename T> + struct py_array_info { }; -template <> -struct py_array_info<octave_int8> { static const char typecode = 'b'; }; + template <> + struct py_array_info<octave_int8> { static const char typecode = 'b'; }; -template <> -struct py_array_info<octave_int16> { static const char typecode = 'h'; }; + template <> + struct py_array_info<octave_int16> { static const char typecode = 'h'; }; -template <> -struct py_array_info<octave_int32> { static const char typecode = 'i'; }; + template <> + struct py_array_info<octave_int32> { static const char typecode = 'i'; }; -template <> -struct py_array_info<octave_int64> -{ - static const char typecode = ARRAY_INT64_TYPECODE; -}; + template <> + struct py_array_info<octave_int64> + { + static const char typecode = ARRAY_INT64_TYPECODE; + }; -template <> -struct py_array_info<octave_uint8> { static const char typecode = 'B'; }; + template <> + struct py_array_info<octave_uint8> { static const char typecode = 'B'; }; -template <> -struct py_array_info<octave_uint16> { static const char typecode = 'H'; }; + template <> + struct py_array_info<octave_uint16> { static const char typecode = 'H'; }; -template <> -struct py_array_info<octave_uint32> { static const char typecode = 'I'; }; + template <> + struct py_array_info<octave_uint32> { static const char typecode = 'I'; }; -template <> -struct py_array_info<octave_uint64> { - static const char typecode = ARRAY_UINT64_TYPECODE; -}; + template <> + struct py_array_info<octave_uint64> { + static const char typecode = ARRAY_UINT64_TYPECODE; + }; -PyObject * -make_py_array (const NDArray& nda) -{ - return make_py_array (nda.data (), nda.numel () * sizeof (double), 'd'); -} + PyObject * + make_py_array (const NDArray& nda) + { + return make_py_array (nda.data (), nda.numel () * sizeof (double), 'd'); + } -PyObject * -make_py_array (const FloatNDArray& nda) -{ - return make_py_array (nda.data (), nda.numel () * sizeof (float), 'f'); -} + PyObject * + make_py_array (const FloatNDArray& nda) + { + return make_py_array (nda.data (), nda.numel () * sizeof (float), 'f'); + } -template <typename T> -PyObject * -make_py_array (const intNDArray<T>& nda) -{ - return make_py_array (nda.data (), nda.numel () * sizeof (T), - py_array_info<T>::typecode); -} + template <typename T> + PyObject * + make_py_array (const intNDArray<T>& nda) + { + return make_py_array (nda.data (), nda.numel () * sizeof (T), + py_array_info<T>::typecode); + } -// Instantiate all possible integer array template functions needed + // Instantiate all possible integer array template functions needed -template PyObject * make_py_array<octave_int8> (const int8NDArray&); -template PyObject * make_py_array<octave_int16> (const int16NDArray&); -template PyObject * make_py_array<octave_int32> (const int32NDArray&); -template PyObject * make_py_array<octave_int64> (const int64NDArray&); -template PyObject * make_py_array<octave_uint8> (const uint8NDArray&); -template PyObject * make_py_array<octave_uint16> (const uint16NDArray&); -template PyObject * make_py_array<octave_uint32> (const uint32NDArray&); -template PyObject * make_py_array<octave_uint64> (const uint64NDArray&); + template PyObject * make_py_array<octave_int8> (const int8NDArray&); + template PyObject * make_py_array<octave_int16> (const int16NDArray&); + template PyObject * make_py_array<octave_int32> (const int32NDArray&); + template PyObject * make_py_array<octave_int64> (const int64NDArray&); + template PyObject * make_py_array<octave_uint8> (const uint8NDArray&); + template PyObject * make_py_array<octave_uint16> (const uint16NDArray&); + template PyObject * make_py_array<octave_uint32> (const uint32NDArray&); + template PyObject * make_py_array<octave_uint64> (const uint64NDArray&); -PyObject * -make_py_numeric_value (const octave_value& value) -{ - if (value.is_scalar_type ()) - { - if (value.is_bool_type ()) - return make_py_bool (value.bool_value ()); + PyObject * + make_py_numeric_value (const octave_value& value) + { + if (value.is_scalar_type ()) + { + if (value.is_bool_type ()) + return make_py_bool (value.bool_value ()); - else if (value.is_int8_type ()) - return make_py_int (value.int8_scalar_value ().value ()); - else if (value.is_int16_type ()) - return make_py_int (value.int16_scalar_value ().value ()); - else if (value.is_int32_type ()) - return make_py_int (value.int32_scalar_value ().value ()); - else if (value.is_int64_type ()) - return make_py_int (value.int64_scalar_value ().value ()); + else if (value.is_int8_type ()) + return make_py_int (value.int8_scalar_value ().value ()); + else if (value.is_int16_type ()) + return make_py_int (value.int16_scalar_value ().value ()); + else if (value.is_int32_type ()) + return make_py_int (value.int32_scalar_value ().value ()); + else if (value.is_int64_type ()) + return make_py_int (value.int64_scalar_value ().value ()); - else if (value.is_uint8_type ()) - return make_py_int (value.uint8_scalar_value ().value ()); - else if (value.is_uint16_type ()) - return make_py_int (value.uint16_scalar_value ().value ()); - else if (value.is_uint32_type ()) - return make_py_int (value.uint32_scalar_value ().value ()); - else if (value.is_uint64_type ()) - return make_py_int (value.uint64_scalar_value ().value ()); + else if (value.is_uint8_type ()) + return make_py_int (value.uint8_scalar_value ().value ()); + else if (value.is_uint16_type ()) + return make_py_int (value.uint16_scalar_value ().value ()); + else if (value.is_uint32_type ()) + return make_py_int (value.uint32_scalar_value ().value ()); + else if (value.is_uint64_type ()) + return make_py_int (value.uint64_scalar_value ().value ()); - else if (value.is_complex_type ()) - return make_py_complex (value.complex_value ()); - else if (value.is_float_type ()) - return make_py_float (value.double_value ()); - } + else if (value.is_complex_type ()) + return make_py_complex (value.complex_value ()); + else if (value.is_float_type ()) + return make_py_float (value.double_value ()); + } - throw value_convert_exception ("unhandled scalar type"); - return 0; -} + throw value_convert_exception ("unhandled scalar type"); + return 0; + } -PyObject * -make_py_array (const octave_value& value) -{ - if (value.is_numeric_type () && ! value.is_complex_type () - && value.ndims () == 2 && (value.columns () <= 1 || value.rows () <= 1)) - { - if (value.is_double_type ()) - return make_py_array (value.array_value ()); - else if (value.is_single_type ()) - return make_py_array (value.float_array_value ()); + PyObject * + make_py_array (const octave_value& value) + { + if (value.is_numeric_type () && ! value.is_complex_type () + && value.ndims () == 2 && (value.columns () <= 1 || value.rows () <= 1)) + { + if (value.is_double_type ()) + return make_py_array (value.array_value ()); + else if (value.is_single_type ()) + return make_py_array (value.float_array_value ()); - else if (value.is_int8_type ()) - return make_py_array (value.int8_array_value ()); - else if (value.is_int16_type ()) - return make_py_array (value.int16_array_value ()); - else if (value.is_int32_type ()) - return make_py_array (value.int32_array_value ()); - else if (value.is_int64_type ()) - return make_py_array (value.int64_array_value ()); + else if (value.is_int8_type ()) + return make_py_array (value.int8_array_value ()); + else if (value.is_int16_type ()) + return make_py_array (value.int16_array_value ()); + else if (value.is_int32_type ()) + return make_py_array (value.int32_array_value ()); + else if (value.is_int64_type ()) + return make_py_array (value.int64_array_value ()); - else if (value.is_uint8_type ()) - return make_py_array (value.uint8_array_value ()); - else if (value.is_uint16_type ()) - return make_py_array (value.uint16_array_value ()); - else if (value.is_uint32_type ()) - return make_py_array (value.uint32_array_value ()); - else if (value.is_uint64_type ()) - return make_py_array (value.uint64_array_value ()); - } + else if (value.is_uint8_type ()) + return make_py_array (value.uint8_array_value ()); + else if (value.is_uint16_type ()) + return make_py_array (value.uint16_array_value ()); + else if (value.is_uint32_type ()) + return make_py_array (value.uint32_array_value ()); + else if (value.is_uint64_type ()) + return make_py_array (value.uint64_array_value ()); + } - throw value_convert_exception ("unhandled Octave numeric vector type"); - return 0; -} + throw value_convert_exception ("unhandled Octave numeric vector type"); + return 0; + } -inline PyObject * -wrap_octvalue_to_pyobj (const octave_value& value) -{ - boost::python::object obj; - octvalue_to_pyobj (obj, value); - PyObject *ptr = obj.ptr (); - Py_INCREF (ptr); - return ptr; -} + inline PyObject * + wrap_octvalue_to_pyobj (const octave_value& value) + { + boost::python::object obj; + octvalue_to_pyobj (obj, value); + PyObject *ptr = obj.ptr (); + Py_INCREF (ptr); + return ptr; + } -inline octave_value -wrap_pyobj_to_octvalue (PyObject *obj) -{ - boost::python::object objref { boost::python::handle<> (boost::python::borrowed (obj)) }; - octave_value value; - pyobj_to_octvalue (value, objref); - return value; -} + inline octave_value + wrap_pyobj_to_octvalue (PyObject *obj) + { + boost::python::object objref + { boost::python::handle<> (boost::python::borrowed (obj)) }; + octave_value value; + pyobj_to_octvalue (value, objref); + return value; + } -octave_scalar_map -extract_py_scalar_map (PyObject *obj) -{ - if (! obj) - throw object_convert_exception ("failed to extract map: null object"); + octave_scalar_map + extract_py_scalar_map (PyObject *obj) + { + if (! obj) + throw object_convert_exception ("failed to extract map: null object"); - if (! PyDict_Check (obj)) - throw object_convert_exception ("failed to extract map: wrong type"); + if (! PyDict_Check (obj)) + throw object_convert_exception ("failed to extract map: wrong type"); - octave_scalar_map map; + octave_scalar_map map; - Py_ssize_t pos = 0; - PyObject *py_key = 0; - PyObject *py_value = 0; + Py_ssize_t pos = 0; + PyObject *py_key = 0; + PyObject *py_value = 0; - while (PyDict_Next (obj, &pos, &py_key, &py_value)) - { - if (! PyBytes_Check (py_key) && ! PyUnicode_Check (py_key)) - throw object_convert_exception ("failed to extract map: bad key type"); + while (PyDict_Next (obj, &pos, &py_key, &py_value)) + { + if (! PyBytes_Check (py_key) && ! PyUnicode_Check (py_key)) + throw object_convert_exception + ("failed to extract map: bad key type"); - std::string key = extract_py_str (py_key); - octave_value value = wrap_pyobj_to_octvalue (py_value); - map.setfield (key, value); - } + std::string key = extract_py_str (py_key); + octave_value value = wrap_pyobj_to_octvalue (py_value); + map.setfield (key, value); + } - return map; -} + return map; + } -PyObject * -make_py_dict (const octave_scalar_map& map) -{ - PyObject *dict = PyDict_New (); - if (! dict) - octave_throw_bad_alloc (); + PyObject * + make_py_dict (const octave_scalar_map& map) + { + PyObject *dict = PyDict_New (); + if (! dict) + octave_throw_bad_alloc (); - for (auto p = map.begin (); p != map.end (); ++p) - { - PyObject *key = make_py_str (map.key (p)); - if (! key) - octave_throw_bad_alloc (); + for (auto p = map.begin (); p != map.end (); ++p) + { + PyObject *key = make_py_str (map.key (p)); + if (! key) + octave_throw_bad_alloc (); - PyObject *item = wrap_octvalue_to_pyobj (map.contents (p)); + PyObject *item = wrap_octvalue_to_pyobj (map.contents (p)); - if (PyDict_SetItem (dict, key, item) < 0) - throw boost::python::error_already_set (); - } + if (PyDict_SetItem (dict, key, item) < 0) + throw boost::python::error_already_set (); + } - return dict; -} + return dict; + } -int64_t -extract_py_int64 (PyObject *obj) -{ - if (! obj) - throw object_convert_exception ("failed to extract integer: null object"); + int64_t + extract_py_int64 (PyObject *obj) + { + if (! obj) + throw object_convert_exception ("failed to extract integer: null object"); - if (PyLong_Check (obj)) - { - int overflow = 0; + if (PyLong_Check (obj)) + { + int overflow = 0; #if (defined (HAVE_LONG_LONG) && (SIZEOF_LONG_LONG == 8)) - PY_LONG_LONG value = PyLong_AsLongLongAndOverflow (obj, &overflow); + PY_LONG_LONG value = PyLong_AsLongLongAndOverflow (obj, &overflow); #else - long value = PyLong_AsLongAndOverflow (obj, &overflow); + long value = PyLong_AsLongAndOverflow (obj, &overflow); #endif - if (overflow) - if (overflow > 0) - value = std::numeric_limits<int64_t>::max (); - else - value = std::numeric_limits<int64_t>::min (); - return static_cast<int64_t> (value); - } + if (overflow) + if (overflow > 0) + value = std::numeric_limits<int64_t>::max (); + else + value = std::numeric_limits<int64_t>::min (); + return static_cast<int64_t> (value); + } #if PY_VERSION_HEX < 0x03000000 - else if (PyInt_Check (obj)) - return PyInt_AsLong (obj); + else if (PyInt_Check (obj)) + return PyInt_AsLong (obj); #endif - else - throw object_convert_exception ("failed to extract integer: wrong type"); + else + throw object_convert_exception ("failed to extract integer: wrong type"); - return 0; -} + return 0; + } -uint64_t -extract_py_uint64 (PyObject *obj) -{ - if (! obj) - throw object_convert_exception ("failed to extract integer: null object"); + uint64_t + extract_py_uint64 (PyObject *obj) + { + if (! obj) + throw object_convert_exception ("failed to extract integer: null object"); - if (PyLong_Check (obj)) - { - // FIXME: if (value < 0), may be very implementation dependent - if (Py_SIZE (obj) < 0) - return 0; + if (PyLong_Check (obj)) + { + // FIXME: if (value < 0), may be very implementation dependent + if (Py_SIZE (obj) < 0) + return 0; #if (defined (HAVE_LONG_LONG) && (SIZEOF_LONG_LONG == 8)) - unsigned PY_LONG_LONG value = PyLong_AsUnsignedLongLong (obj); - bool overflow = (value == static_cast<unsigned PY_LONG_LONG> (-1)); + unsigned PY_LONG_LONG value = PyLong_AsUnsignedLongLong (obj); + bool overflow = (value == static_cast<unsigned PY_LONG_LONG> (-1)); #else - unsigned long value = PyLong_AsUnsignedLong (obj); - bool overflow = (value == static_cast<unsigned long> (-1)); + unsigned long value = PyLong_AsUnsignedLong (obj); + bool overflow = (value == static_cast<unsigned long> (-1)); #endif - if (overflow) - { - value = std::numeric_limits<uint64_t>::max (); - PyErr_Clear (); - } + if (overflow) + { + value = std::numeric_limits<uint64_t>::max (); + PyErr_Clear (); + } - return static_cast<uint64_t> (value); - } + return static_cast<uint64_t> (value); + } #if PY_VERSION_HEX < 0x03000000 - else if (PyInt_Check (obj)) - return static_cast<uint64_t> (PyInt_AsLong (obj)); + else if (PyInt_Check (obj)) + return static_cast<uint64_t> (PyInt_AsLong (obj)); #endif - else - throw object_convert_exception ("failed to extract integer: wrong type"); + else + throw object_convert_exception ("failed to extract integer: wrong type"); - return 0; -} + return 0; + } -PyObject * -make_py_tuple (const Cell& cell) -{ - if (! (cell.is_empty () || cell.is_vector ())) - throw value_convert_exception ( - "unable to convert multidimensional cell array into Python tuple"); + PyObject * + make_py_tuple (const Cell& cell) + { + if (! (cell.is_empty () || cell.is_vector ())) + throw value_convert_exception ( + "unable to convert multidimensional cell array into Python tuple"); - octave_idx_type size = cell.numel (); - PyObject *tuple = PyTuple_New (size); - if (! tuple) - octave_throw_bad_alloc (); + octave_idx_type size = cell.numel (); + PyObject *tuple = PyTuple_New (size); + if (! tuple) + octave_throw_bad_alloc (); - for (octave_idx_type i = 0; i < size; ++i) - { - PyObject *item = wrap_octvalue_to_pyobj (cell.xelem (i)); - PyTuple_SET_ITEM (tuple, i, item); - } + for (octave_idx_type i = 0; i < size; ++i) + { + PyObject *item = wrap_octvalue_to_pyobj (cell.xelem (i)); + PyTuple_SET_ITEM (tuple, i, item); + } - return tuple; -} + return tuple; + } -std::string -extract_py_str (PyObject *obj) -{ - std::string retval; + std::string + extract_py_str (PyObject *obj) + { + std::string retval; - if (! obj) - throw object_convert_exception ("failed to extract string: null object"); - if (PyBytes_Check (obj)) - { - retval.assign (PyBytes_AsString (obj), PyBytes_Size (obj)); - } - else if (PyUnicode_Check (obj)) - { - bool ok = false; - PyObject *enc = PyUnicode_AsUTF8String (obj); - if (enc) - { - if (PyBytes_Check (enc)) - { - ok = true; - retval.assign (PyBytes_AsString (enc), PyBytes_Size (enc)); - } - Py_DECREF (enc); - } - if (! ok) - throw object_convert_exception ("failed to extract string: UTF-8 error"); - } - else - throw object_convert_exception ("failed to extract string: wrong type"); + if (! obj) + throw object_convert_exception ("failed to extract string: null object"); + if (PyBytes_Check (obj)) + { + retval.assign (PyBytes_AsString (obj), PyBytes_Size (obj)); + } + else if (PyUnicode_Check (obj)) + { + bool ok = false; + PyObject *enc = PyUnicode_AsUTF8String (obj); + if (enc) + { + if (PyBytes_Check (enc)) + { + ok = true; + retval.assign (PyBytes_AsString (enc), PyBytes_Size (enc)); + } + Py_DECREF (enc); + } + if (! ok) + throw object_convert_exception + ("failed to extract string: UTF-8 error"); + } + else + throw object_convert_exception ("failed to extract string: wrong type"); - return retval; -} + return retval; + } -PyObject * -make_py_str (const std::string& str) -{ + PyObject * + make_py_str (const std::string& str) + { #if PY_VERSION_HEX >= 0x03000000 - return PyUnicode_FromStringAndSize (str.data (), str.size ()); + return PyUnicode_FromStringAndSize (str.data (), str.size ()); #else - return PyString_FromStringAndSize (str.data (), str.size ()); + return PyString_FromStringAndSize (str.data (), str.size ()); #endif -} + } }