summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/pykms/pykmsbase.cpp35
1 files changed, 15 insertions, 20 deletions
diff --git a/py/pykms/pykmsbase.cpp b/py/pykms/pykmsbase.cpp
index dd09fae..2c97bd7 100644
--- a/py/pykms/pykmsbase.cpp
+++ b/py/pykms/pykmsbase.cpp
@@ -7,6 +7,16 @@ namespace py = pybind11;
using namespace kms;
using namespace std;
+// Helper to convert vector<T*> to vector<unique_ptr<T, py::nodelete>>
+template<typename T>
+static vector<unique_ptr<T, py::nodelete>> convert_vector(const vector<T*>& source)
+{
+ vector<unique_ptr<T, py::nodelete>> v;
+ for (T* p : source)
+ v.push_back(unique_ptr<T, py::nodelete>(p));
+ return v;
+}
+
void init_pykmsbase(py::module &m)
{
py::class_<Card>(m, "Card")
@@ -18,31 +28,19 @@ void init_pykmsbase(py::module &m)
// RuntimeError: return_value_policy = move, but the object is neither movable nor copyable!
// So we do this manually.
.def_property_readonly("connectors", [](Card* self) {
- vector<unique_ptr<Connector, py::nodelete>> v;
- for (Connector* p : self->get_connectors())
- v.push_back(unique_ptr<Connector, py::nodelete>(p));
- return v;
+ return convert_vector(self->get_connectors());
})
.def_property_readonly("crtcs", [](Card* self) {
- vector<unique_ptr<Crtc, py::nodelete>> v;
- for (Crtc* p : self->get_crtcs())
- v.push_back(unique_ptr<Crtc, py::nodelete>(p));
- return v;
+ return convert_vector(self->get_crtcs());
})
.def_property_readonly("encoders", [](Card* self) {
- vector<unique_ptr<Encoder, py::nodelete>> v;
- for (Encoder* p : self->get_encoders())
- v.push_back(unique_ptr<Encoder, py::nodelete>(p));
- return v;
+ return convert_vector(self->get_encoders());
})
.def_property_readonly("planes", [](Card* self) {
- vector<unique_ptr<Plane, py::nodelete>> v;
- for (Plane* p : self->get_planes())
- v.push_back(unique_ptr<Plane, py::nodelete>(p));
- return v;
+ return convert_vector(self->get_planes());
})
.def_property_readonly("has_atomic", &Card::has_atomic)
@@ -69,10 +67,7 @@ void init_pykmsbase(py::module &m)
.def("get_default_mode", &Connector::get_default_mode)
.def("get_current_crtc", &Connector::get_current_crtc)
.def("get_possible_crtcs", [](Connector* self) {
- vector<unique_ptr<Crtc, py::nodelete>> v;
- for (Crtc* p : self->get_possible_crtcs())
- v.push_back(unique_ptr<Crtc, py::nodelete>(p));
- return v;
+ return convert_vector(self->get_possible_crtcs());
})
.def("get_modes", &Connector::get_modes)
.def("get_mode", (Videomode (Connector::*)(const string& mode) const)&Connector::get_mode)