5 #include <boost/python.hpp> 6 #include <boost/python/suite/indexing/map_indexing_suite.hpp> 11 auto getItem(T& obj, int64_t index) -> decltype(obj[0]) {
15 if (index >= 0 &&
size_t(index) < obj.size()) {
16 return obj[size_t(index)];
18 PyErr_SetString(PyExc_IndexError,
"index out of range");
19 py::throw_error_already_set();
23 template <
typename T,
typename ValT>
24 void setItem(T& obj, int64_t index, ValT value) {
28 if (index >= 0 &&
size_t(index) < obj.size()) {
29 obj[size_t(index)] = value;
32 PyErr_SetString(PyExc_IndexError,
"index out of range");
33 py::throw_error_already_set();
41 if (index >= 0 &&
size_t(index) < obj.size()) {
42 obj.erase(std::next(obj.begin(), index));
45 PyErr_SetString(PyExc_IndexError,
"index out of range");
46 py::throw_error_already_set();
56 template <
typename Container>
58 boost::python::converter::registry::push_back(
59 &IterableConverter::convertible, &IterableConverter::construct<Container>, boost::python::type_id<Container>());
67 auto* it = PyObject_GetIter(
object);
72 if (PyErr_ExceptionMatches(PyExc_TypeError) != 0) {
85 template <
typename Container>
86 static void construct(PyObject*
object, boost::python::converter::rvalue_from_python_stage1_data* data) {
90 python::handle<> handle(python::borrowed(
object));
94 using StorageType = python::converter::rvalue_from_python_storage<Container>;
95 void* storage =
reinterpret_cast<StorageType*
>(data)->storage.bytes;
97 using Iterator = python::stl_input_iterator<typename Container::value_type>;
103 new (storage) Container(Iterator(python::object(handle)),
105 data->convertible = storage;
111 template <
typename OptionalT>
113 boost::python::converter::registry::push_back(&ToOptionalConverter::convertible,
114 &ToOptionalConverter::construct<OptionalT>,
124 template <
typename OptionalT>
125 static void construct(PyObject*
object, boost::python::converter::rvalue_from_python_stage1_data* data) {
127 using StorageType = python::converter::rvalue_from_python_storage<lanelet::Optional<OptionalT>>;
128 void* storage =
reinterpret_cast<StorageType*
>(data)->storage.bytes;
130 if (
object == Py_None) {
135 data->convertible = storage;
139 template <
typename T>
143 template <
typename Type>
145 return boost::python::incref(boost::python::object(t).ptr());
149 template <
typename T>
156 return py::incref(l.ptr());
160 template <
typename T>
164 return py::incref(py::object(v.get()).ptr());
167 return py::incref(py::object().ptr());
171 template <
typename T>
175 return py::incref(py::object(v.lock()).ptr());
178 return py::incref(py::object().ptr());
182 template <
typename T1,
typename T2>
184 static PyObject*
convert(
const std::pair<T1, T2>& pair) {
185 return py::incref(py::make_tuple(pair.first, pair.second).ptr());
189 template <
typename T1,
typename T2>
192 py::converter::registry::push_back(&convertible, &construct, py::type_id<std::pair<T1, T2>>());
195 if (!PyTuple_CheckExact(obj)) {
198 if (PyTuple_Size(obj) != 2) {
203 static void construct(PyObject* obj, py::converter::rvalue_from_python_stage1_data* data) {
204 py::tuple tuple(py::borrowed(obj));
205 using StorageType = py::converter::rvalue_from_python_storage<std::pair<T1, T2>>;
206 void* storage =
reinterpret_cast<StorageType*
>(data)->storage.bytes;
207 new (storage) std::pair<T1, T2>(py::extract<T1>(tuple[0])(), py::extract<T2>(tuple[1])());
208 data->convertible = storage;
212 template <
typename T1,
typename T2>
218 template <
typename T>
221 template <
typename T>
224 template <
typename T>
227 template <
typename T>
230 template <
typename T>
py::to_python_converter< T, VariantToObject< T > > VariantConverter
static void * convertible(PyObject *object)
Check PyObject.
static PyObject * convert(const lanelet::Optional< T > &v)
py::to_python_converter< std::pair< T1, T2 >, PairToPythonConverter< T1, T2 > > toPy
result_type operator()(const Type &t) const
static PyObject * convert(const T &v)
void delItem(T &obj, int64_t index)
void setItem(T &obj, int64_t index, ValT value)
py::to_python_converter< T, VectorToList< T > > VectorToListConverter
static PyObject * convert(const std::pair< T1, T2 > &pair)
boost::optional< T > Optional
static result_type convert(const T &v)
static void construct(PyObject *object, boost::python::converter::rvalue_from_python_stage1_data *data)
Convert iterable PyObject to C++ container type.
static PyObject * convert(const T &v)
IterableConverter & fromPython()
auto getItem(T &obj, int64_t index) -> decltype(obj[0])
static void construct(PyObject *obj, py::converter::rvalue_from_python_stage1_data *data)
py::to_python_converter< T, WeakToObject< T > > WeakConverter
ToOptionalConverter & fromPython()
py::to_python_converter< lanelet::Optional< T >, OptionalToObject< T > > OptionalConverter
static void * convertible(PyObject *object)
Check if PyObject is iterable.
PythonToPairConverter< T1, T2 > fromPy
static void construct(PyObject *object, boost::python::converter::rvalue_from_python_stage1_data *data)
Convert PyObject to C++ type.
static void * convertible(PyObject *obj)