diff --git a/CMakeLists.txt b/CMakeLists.txt index fe143b1f57c2de58a915fb2bfaa02c77efa01c6d..5e1f1b42074348798e95080832206f68cdd011c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -207,6 +207,7 @@ set(${PROJECT_NAME}_SOURCES src/quaternion.cpp src/geometry-conversion.cpp src/std-vector.cpp + src/optional.cpp src/version.cpp) add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SOURCES} diff --git a/include/eigenpy/optional.hpp b/include/eigenpy/optional.hpp index 8394ba7244ad43c5f548a241979338f24fafa8af..be6fbe4742a6939982641512233ac6a50305b3e5 100644 --- a/include/eigenpy/optional.hpp +++ b/include/eigenpy/optional.hpp @@ -56,6 +56,15 @@ struct nullopt_helper<std::optional> { }; #endif +template <typename NoneType> +struct NoneToPython { + static PyObject *convert(const NoneType &) { Py_RETURN_NONE; } + + static void registration() { + bp::to_python_converter<NoneType, NoneToPython, false>(); + } +}; + template <typename T, template <typename> class OptionalTpl = EIGENPY_DEFAULT_OPTIONAL> struct OptionalToPython { diff --git a/src/eigenpy.cpp b/src/eigenpy.cpp index 62b9f88c8b5302476dc2f54613ddf663d0b3c885..6e13f13f3a9256d32bfb2186c8d616db677ca759 100644 --- a/src/eigenpy.cpp +++ b/src/eigenpy.cpp @@ -22,6 +22,8 @@ void exposeMatrixComplexFloat(); void exposeMatrixComplexDouble(); void exposeMatrixComplexLongDouble(); +void exposeNoneType(); + /* Enable Eigen-Numpy serialization for a set of standard MatrixBase instances. */ void enableEigenPy() { @@ -54,6 +56,8 @@ void enableEigenPy() { exposeMatrixComplexFloat(); exposeMatrixComplexDouble(); exposeMatrixComplexLongDouble(); + + exposeNoneType(); } } // namespace eigenpy diff --git a/src/optional.cpp b/src/optional.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eb56912111f9c1b7c0b374b3459e74904025ae88 --- /dev/null +++ b/src/optional.cpp @@ -0,0 +1,12 @@ +/// Copyright 2023 CNRS, INRIA + +#include "eigenpy/optional.hpp" + +namespace eigenpy { +void exposeNoneType() { + detail::NoneToPython<boost::none_t>::registration(); +#ifdef EIGENPY_WITH_CXX17_SUPPORT + detail::NoneToPython<std::nullopt_t>::registration(); +#endif +} +} // namespace eigenpy diff --git a/unittest/bind_optional.cpp.in b/unittest/bind_optional.cpp.in index f71773d6505fa7dd5c76174c8b9ac6db5359ab9e..844449b19e0437cdd5b7d6248586d74f4e43800a 100644 --- a/unittest/bind_optional.cpp.in +++ b/unittest/bind_optional.cpp.in @@ -74,6 +74,6 @@ BOOST_PYTHON_MODULE(@MODNAME@) { bp::make_setter(&mystruct::msg)); bp::def("none_if_zero", none_if_zero, bp::args("i")); - bp::def("create_if_true", create_if_true, bp::args("flag", "b")); + bp::def("create_if_true", create_if_true, (bp::arg("flag"), bp::arg("b") = OPT_NONE)); bp::def("random_mat_if_true", random_mat_if_true, bp::args("flag")); }