diff --git a/panda/src/event/asyncTaskManager.I b/panda/src/event/asyncTaskManager.I index 6be7ef3508..976e445671 100644 --- a/panda/src/event/asyncTaskManager.I +++ b/panda/src/event/asyncTaskManager.I @@ -34,14 +34,32 @@ get_clock() { #ifndef CPPPARSER /** - * Adds a new task which calls the indicated function to the task manager. - * Returns the newly created FunctionAsyncTask object. + * Adds a new task to the task manager which calls the indicated callable. + * This method is defined as a more convenient alternative to subclassing + * AsyncTask. + * + * This given callable allowed to be any object defining a call operator that + * accepts an AsyncTask pointer and returns a DoneStatus. + * + * Returns the newly created AsyncTask object. * * @since 1.11.0 */ +template INLINE AsyncTask *AsyncTaskManager:: -add(const std::string &name, FunctionAsyncTask::TaskFunction function) { - AsyncTask *task = new FunctionAsyncTask(name, std::move(function)); +add(const std::string &name, Callable callable) { + class InlineTask final : public AsyncTask { + public: + InlineTask(Callable callable) : _callable(std::move(callable)) {} + + private: + virtual DoneStatus do_task() override final { + return _callable(this); + } + + Callable _callable; + }; + AsyncTask *task = new InlineTask(std::move(callable)); add(task); return task; } diff --git a/panda/src/event/asyncTaskManager.h b/panda/src/event/asyncTaskManager.h index 0982e5e2c7..00b5329e9e 100644 --- a/panda/src/event/asyncTaskManager.h +++ b/panda/src/event/asyncTaskManager.h @@ -66,7 +66,8 @@ PUBLISHED: void add(AsyncTask *task); #ifndef CPPPARSER - INLINE AsyncTask *add(const std::string &name, FunctionAsyncTask::TaskFunction function); + template + INLINE AsyncTask *add(const std::string &name, Callable callable); #endif bool has_task(AsyncTask *task) const;