diff --git a/modules/base/src/export_helper/generic_property_def.hh b/modules/base/src/export_helper/generic_property_def.hh index ef13e3490ac3b298fc0c50f1f192cb620672c4fd..912a598c6f06534759d800a6046c893edfb32232 100644 --- a/modules/base/src/export_helper/generic_property_def.hh +++ b/modules/base/src/export_helper/generic_property_def.hh @@ -19,7 +19,8 @@ #ifndef GENERIC_PROPERTY_DEF_HH #define GENERIC_PROPERTY_DEF_HH - +#include <boost/python.hpp> +#include <cassert> #include <ost/log.hh> /* Author: Marco Biasini @@ -130,6 +131,36 @@ String depr_prop_as_string(C& c, const String& k) return c.GetPropAsString(k); } +template <typename C> +boost::python::object get_attr(C& c, const String& k) { + std::map<String,ost::GenericPropValue>::const_iterator + i = c.GetPropMap().find(k); + boost::python::object obj; + if (i != c.GetPropMap().end()) { + switch (i->second.which()) { + case 0: + return boost::python::object(boost::get<String>(i->second)); + case 1: + return boost::python::object(boost::get<Real>(i->second)); + case 2: + return boost::python::object(boost::get<int>(i->second)); + case 3: + return boost::python::object(boost::get<bool>(i->second)); + default: + assert(0 && "unhandled type"); + } + } + std::string msg = "no such attribute '" + k + "'"; + PyErr_SetString(PyExc_AttributeError, msg.c_str()); + boost::python::throw_error_already_set(); + // throw_error_already_set is not marked noreturn in some versions of + // boost. That's why we need a return statement at the end, even if we + // never get here! + return obj; +} + + + template <typename C, typename O> void const_generic_prop_def(O& bp_class) { @@ -167,6 +198,7 @@ void const_generic_prop_def(O& bp_class) .def("GetGenericStringProperty", &depr_get_string_b<C>) .def("HasGenericProperty", &depr_has_prop<C>) .def("GetGenericPropertyStringRepresentation", &depr_prop_as_string<C>) + .def("__getattr__", &get_attr<C>) ; } @@ -188,6 +220,10 @@ void generic_prop_def(O& bp_class) .def("SetGenericBoolProperty", &depr_set_bool<C>) .def("SetGenericStringProperty", &depr_set_string<C>) .def("RemoveProp", &C::RemoveProp) + .def("__setattr__", &C::SetBoolProp) + .def("__setattr__", &C::SetIntProp) + .def("__setattr__", &C::SetStringProp) + .def("__setattr__", &C::SetFloatProp) ; }