- .def("create", create_actor, "Create an actor from a function, see :cpp:func:`simgrid::s4u::Actor::create()`")
- .def("create", [](std::string name, Host* host) -> std::function<ActorPtr(std::function<void()>)> {
- return [name, host](std::function<void()> f) -> ActorPtr {
- return simgrid::s4u::Actor::create(name, host, std::move(f));
- };
- }, "Create an actor from a functor");
+
+ .def("create", [](py::args args, py::kwargs kwargs) {
+ xbt_assert(args.size()>2, "Creating an actor takes at least 3 parameters: name, host, and main function.");
+ return simgrid::s4u::Actor::create(args[0].cast<std::string>(), args[1].cast<Host*>(), [args]() {
+ py::tuple funargs(args.size()-3);
+ for (size_t i=3; i<args.size(); i++)
+ funargs[i-3] = args[i];
+
+ PyObject *result = PyObject_CallObject(args[2].ptr(), funargs.ptr());
+ if (!result)
+ throw pybind11::error_already_set();
+ });
+ }, "Create an actor from a function or an object, see :cpp:func:`simgrid::s4u::Actor::create()`")
+ /*
+ .def("create", [](std::string name, Host* host, py::object obj) -> ActorPtr {
+ xbt_assert(pybind11::hasattr(obj, "__call__"), "Your object does not implement the __call__() method");
+
+ return simgrid::s4u::Actor::create(name, host, [obj](){
+ obj.attr("__call__")();
+ });
+ }, "Create an actor from a python object")
+ */;