diff options
| -rw-r--r-- | py/pykms/pykmsbase.cpp | 35 | 
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) | 
