diff --git a/src/python/boostPyExtension.h b/src/python/boostPyExtension.h new file mode 100644 index 000000000..bfdc780ca --- /dev/null +++ b/src/python/boostPyExtension.h @@ -0,0 +1,44 @@ +#pragma once +#include + + +namespace boost { namespace python { namespace converter { + + template + PyObject* shared_ptr_to_python(std::shared_ptr const& x) + { + if (!x) + return python::detail::none(); + else if (shared_ptr_deleter* d = std::get_deleter(x)) + return incref( d->owner.get() ); + else + return converter::registered const&>::converters.to_python(&x); + } + + /// @brief Adapter a non-member function that returns a unique_ptr to + /// a python function object that returns a raw pointer but + /// explicitly passes ownership to Python. + template + object adapt_unique(std::unique_ptr (*fn)(Args...)) + { + return make_function( + [fn](Args... args) { return fn(args...).release(); }, + return_value_policy(), + boost::mpl::vector() + ); + } + + /// @brief Adapter a member function that returns a unique_ptr to + /// a python function object that returns a raw pointer but + /// explicitly passes ownership to Python. + template + object adapt_unique(std::unique_ptr (C::*fn)(Args...)) + { + return make_function( + [fn](C& self, Args... args) { return (self.*fn)(args...).release(); }, + python::return_value_policy(), + boost::mpl::vector() + ); + } + + }}} // namespace boost::python::converter diff --git a/src/python/helpers.h b/src/python/helpers.h new file mode 100644 index 000000000..9e96700e0 --- /dev/null +++ b/src/python/helpers.h @@ -0,0 +1,56 @@ +#pragma once + +#include + +template +void shared_ptr_implicitly_convertible() { + boost::python::implicitly_convertible, std::shared_ptr>(); +} + + +template +void register_shared_ptr() { + boost::python::register_ptr_to_python>(); +} + + + +namespace dtl{ +// primary class template + template + struct ImplConversionSharedPtr { + void c() { shared_ptr_implicitly_convertible(); } + }; + +// specialized class template + template + struct ImplConversionSharedPtr::value>::type> { + void c() { } + }; + + template + struct bases_holder { + typedef boost::python::bases Type; + }; + + template<> + struct bases_holder { + typedef boost::python::bases<> Type; + }; +} + +template +boost::python::class_, typename dtl::bases_holder::Type, NC> defineClass(char const* name, char const* docstring, typename std::enable_if_t::value>::type* = 0) { + auto inst = boost::python::class_, typename dtl::bases_holder::Type, NC>(name, docstring); + register_shared_ptr(); + dtl::ImplConversionSharedPtr().c(); + return inst; +}; + +template +boost::python::class_, typename dtl::bases_holder::Type, NC> defineClass(char const* name, char const* docstring) { + auto inst = boost::python::class_, typename dtl::bases_holder::Type, NC>(name, docstring, boost::python::no_init); + register_shared_ptr(); + dtl::ImplConversionSharedPtr().c(); + return inst; +}; diff --git a/src/python/storm-core.cpp b/src/python/storm-core.cpp index 4945fc272..4f9dcd2a5 100644 --- a/src/python/storm-core.cpp +++ b/src/python/storm-core.cpp @@ -5,62 +5,8 @@ #include -namespace boost { - template T* get_pointer(std::shared_ptr p) { return p.get(); } -} - -namespace boost { namespace python { namespace converter { - - template - PyObject* shared_ptr_to_python(std::shared_ptr const& x) - { - if (!x) - return python::detail::none(); - else if (shared_ptr_deleter* d = std::get_deleter(x)) - return incref( d->owner.get() ); - else - return converter::registered const&>::converters.to_python(&x); - } - - /// @brief Adapter a non-member function that returns a unique_ptr to - /// a python function object that returns a raw pointer but - /// explicitly passes ownership to Python. - template - object adapt_unique(std::unique_ptr (*fn)(Args...)) - { - return make_function( - [fn](Args... args) { return fn(args...).release(); }, - return_value_policy(), - boost::mpl::vector() - ); - } - - /// @brief Adapter a member function that returns a unique_ptr to - /// a python function object that returns a raw pointer but - /// explicitly passes ownership to Python. - template - object adapt_unique(std::unique_ptr (C::*fn)(Args...)) - { - return make_function( - [fn](C& self, Args... args) { return (self.*fn)(args...).release(); }, - python::return_value_policy(), - boost::mpl::vector() - ); - } - - }}} // namespace boost::python::converter - - -template -void shared_ptr_implicitly_convertible() { - boost::python::implicitly_convertible, std::shared_ptr>(); -} - - -template -void register_shared_ptr() { - boost::python::register_ptr_to_python>(); -} +#include "helpers.h" +#include "boostPyExtension.h" @@ -77,46 +23,6 @@ void setupStormLib(std::string const& args) { storm::settings::SettingsManager::manager().setFromString(args); } -// primary class template -template -struct ImplConversionSharedPtr -{ - void c() { shared_ptr_implicitly_convertible(); } -}; - -// specialized class template -template -struct ImplConversionSharedPtr::value>::type> -{ - void c() { } -}; - -template -struct bases_holder { - typedef boost::python::bases Type; -}; - -template<> -struct bases_holder { - typedef boost::python::bases<> Type; -}; - - -template -boost::python::class_, typename bases_holder::Type, NC> defineClass(char const* name, char const* docstring, typename std::enable_if_t::value>::type* = 0) { - auto inst = boost::python::class_, typename bases_holder::Type, NC>(name, docstring); - register_shared_ptr(); - ImplConversionSharedPtr().c(); - return inst; -}; - -template -boost::python::class_, typename bases_holder::Type, NC> defineClass(char const* name, char const* docstring) { - auto inst = boost::python::class_, typename bases_holder::Type, NC>(name, docstring, boost::python::no_init); - register_shared_ptr(); - ImplConversionSharedPtr().c(); - return inst; -}; BOOST_PYTHON_MODULE(_core) @@ -172,27 +78,19 @@ BOOST_PYTHON_MODULE(_core) .add_property("nr_states", &storm::models::ModelBase::getNumberOfStates) .add_property("nr_transitions", &storm::models::ModelBase::getNumberOfTransitions) .add_property("model_type", &storm::models::ModelBase::getType) - .def("asPdtmc", &storm::models::ModelBase::as>) - .def("asPmdp", &storm::models::ModelBase::as>) + .def("as_dtmc", &storm::models::ModelBase::as>) + .def("as_pdtmc", &storm::models::ModelBase::as>) + .def("as_pmdp", &storm::models::ModelBase::as>) + ; defineClass, storm::models::ModelBase, boost::noncopyable>("SparseParametricModel", ""); - //class_, std::shared_ptr >, boost::noncopyable, bases>("SparseParametricModel", no_init); - //register_shared_ptr>(); - //shared_ptr_implicitly_convertible, storm::models::ModelBase>(); - class_, std::shared_ptr>, boost::noncopyable, bases>("SparseModel", no_init); - register_shared_ptr>(); - shared_ptr_implicitly_convertible, storm::models::sparse::Model>(); + defineClass, storm::models::ModelBase, boost::noncopyable>("SparseModel", ""); + defineClass, storm::models::sparse::Model, boost::noncopyable>("Dtmc", ""); defineClass, storm::models::sparse::Model>("SparseParametricMc", ""); - //class_, std::shared_ptr>, boost::noncopyable, bases>>("SparseParametricMc", no_init); - //register_shared_ptr>(); - //shared_ptr_implicitly_convertible, storm::models::sparse::Model>(); - - class_, std::shared_ptr>, boost::noncopyable, bases>>("SparseParametricMdp", no_init); - register_shared_ptr>(); - + defineClass, storm::models::sparse::Model>("SparseParametricMdp", ""); def("parse_formulae", storm::parseFormulasForProgram);