#ifndef GOOGLE_APIS_COMMON_TASK_UTIL_H_
#define GOOGLE_APIS_COMMON_TASK_UTIL_H_
#include "base/functional/bind.h"
#include "base/task/single_thread_task_runner.h"
namespace google_apis {
void RunTaskWithTaskRunner(scoped_refptr<base::TaskRunner> task_runner,
base::OnceClosure task);
namespace internal {
template <typename Sig>
struct ComposedCallback;
template <typename... Args>
struct ComposedCallback<void(Args...)> {
static void Run(base::OnceCallback<void(base::OnceClosure)> runner,
base::OnceCallback<void(Args...)> callback,
Args... args) {
std::move(runner).Run(
base::BindOnce(std::move(callback), std::forward<Args>(args)...));
}
};
}
template <typename... Args>
base::OnceCallback<void(Args...)> CreateComposedCallback(
base::OnceCallback<void(base::OnceClosure)> runner,
base::OnceCallback<void(Args...)> callback) {
DCHECK(runner);
DCHECK(callback);
return base::BindOnce(&internal::ComposedCallback<void(Args...)>::Run,
std::move(runner), std::move(callback));
}
template <typename... Args>
base::RepeatingCallback<void(Args...)> CreateComposedCallback(
base::RepeatingCallback<void(base::OnceClosure)> runner,
base::RepeatingCallback<void(Args...)> callback) {
DCHECK(runner);
DCHECK(callback);
return base::BindRepeating(&internal::ComposedCallback<void(Args...)>::Run,
std::move(runner), std::move(callback));
}
template <typename Sig>
base::OnceCallback<Sig> CreateRelayCallback(base::OnceCallback<Sig> callback) {
return CreateComposedCallback(
base::BindOnce(&RunTaskWithTaskRunner,
base::SingleThreadTaskRunner::GetCurrentDefault()),
std::move(callback));
}
template <typename Sig>
base::RepeatingCallback<Sig> CreateRelayCallback(
base::RepeatingCallback<Sig> callback) {
return CreateComposedCallback(
base::BindRepeating(&RunTaskWithTaskRunner,
base::SingleThreadTaskRunner::GetCurrentDefault()),
std::move(callback));
}
}
#endif