#pragma once #include // These headers are necessary for cross-python compilation. // Python3 does not have PyString_* methods. One should use PyBytes_* instead. // bytesobject.h contains a mapping from PyBytes_* to PyString_*. // See https://docs.python.org/2/howto/cporting.html for more. #include "Python.h" #include "bytesobject.h" #include #include namespace { using namespace boost::python; // Converts a vector to Python2 str or Python3 bytes. struct vector_uint8t_to_str { static PyObject * convert(std::vector const & v) { auto bytes = PyBytes_FromStringAndSize( reinterpret_cast(v.data()), v.size()); Py_INCREF(bytes); return bytes; } }; // Converts a vector from Python2 str or Python3 bytes. struct vector_uint8t_from_python_str { vector_uint8t_from_python_str() { converter::registry::push_back(&convertible, &construct, type_id>()); } static void * convertible(PyObject * obj_ptr) { if (!PyBytes_Check(obj_ptr)) return nullptr; return obj_ptr; } static void construct(PyObject * obj_ptr, converter::rvalue_from_python_stage1_data * data) { const char * value = PyBytes_AsString(obj_ptr); if (value == nullptr) throw_error_already_set(); void * storage = ((converter::rvalue_from_python_storage> *)data)->storage.bytes; new (storage) std::vector(value, value + PyBytes_Size(obj_ptr)); data->convertible = storage; } }; } // namespace