event: New C++ AsyncTaskManager::add() no longer uses std::function

std::function has unnecessary overhead, better to just create an AsyncTask subclass in-place storing the closure

This obsoletes FunctionAsyncTask, it will be removed in a future commit
This commit is contained in:
rdb 2022-02-22 17:02:42 +01:00
parent 72c891c0df
commit 7baeaf3809
2 changed files with 24 additions and 5 deletions

View File

@ -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<class Callable>
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;
}

View File

@ -66,7 +66,8 @@ PUBLISHED:
void add(AsyncTask *task);
#ifndef CPPPARSER
INLINE AsyncTask *add(const std::string &name, FunctionAsyncTask::TaskFunction function);
template<class Callable>
INLINE AsyncTask *add(const std::string &name, Callable callable);
#endif
bool has_task(AsyncTask *task) const;