5 #include <boost/python.hpp>
6 #include <boost/python/suite/indexing/map_indexing_suite.hpp>
9 namespace py = boost::python;
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();
51 namespace py = boost::python;
56 template <
typename Container>
58 boost::python::converter::registry::push_back(
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) {
87 namespace python = boost::python;
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>
114 &ToOptionalConverter::construct<OptionalT>,
124 template <
typename OptionalT>
125 static void construct(PyObject*
object, boost::python::converter::rvalue_from_python_stage1_data* data) {
126 namespace python = boost::python;
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>
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>