1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_TASK_RUNNER_UTIL_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_TASK_RUNNER_UTIL_H_
7*635a8641SAndroid Build Coastguard Worker
8*635a8641SAndroid Build Coastguard Worker #include <utility>
9*635a8641SAndroid Build Coastguard Worker
10*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/bind_helpers.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/callback.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/post_task_and_reply_with_result_internal.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/task_runner.h"
16*635a8641SAndroid Build Coastguard Worker
17*635a8641SAndroid Build Coastguard Worker namespace base {
18*635a8641SAndroid Build Coastguard Worker
19*635a8641SAndroid Build Coastguard Worker // When you have these methods
20*635a8641SAndroid Build Coastguard Worker //
21*635a8641SAndroid Build Coastguard Worker // R DoWorkAndReturn();
22*635a8641SAndroid Build Coastguard Worker // void Callback(const R& result);
23*635a8641SAndroid Build Coastguard Worker //
24*635a8641SAndroid Build Coastguard Worker // and want to call them in a PostTaskAndReply kind of fashion where the
25*635a8641SAndroid Build Coastguard Worker // result of DoWorkAndReturn is passed to the Callback, you can use
26*635a8641SAndroid Build Coastguard Worker // PostTaskAndReplyWithResult as in this example:
27*635a8641SAndroid Build Coastguard Worker //
28*635a8641SAndroid Build Coastguard Worker // PostTaskAndReplyWithResult(
29*635a8641SAndroid Build Coastguard Worker // target_thread_.task_runner(),
30*635a8641SAndroid Build Coastguard Worker // FROM_HERE,
31*635a8641SAndroid Build Coastguard Worker // BindOnce(&DoWorkAndReturn),
32*635a8641SAndroid Build Coastguard Worker // BindOnce(&Callback));
33*635a8641SAndroid Build Coastguard Worker template <typename TaskReturnType, typename ReplyArgType>
PostTaskAndReplyWithResult(TaskRunner * task_runner,const Location & from_here,OnceCallback<TaskReturnType ()> task,OnceCallback<void (ReplyArgType)> reply)34*635a8641SAndroid Build Coastguard Worker bool PostTaskAndReplyWithResult(TaskRunner* task_runner,
35*635a8641SAndroid Build Coastguard Worker const Location& from_here,
36*635a8641SAndroid Build Coastguard Worker OnceCallback<TaskReturnType()> task,
37*635a8641SAndroid Build Coastguard Worker OnceCallback<void(ReplyArgType)> reply) {
38*635a8641SAndroid Build Coastguard Worker DCHECK(task);
39*635a8641SAndroid Build Coastguard Worker DCHECK(reply);
40*635a8641SAndroid Build Coastguard Worker TaskReturnType* result = new TaskReturnType();
41*635a8641SAndroid Build Coastguard Worker return task_runner->PostTaskAndReply(
42*635a8641SAndroid Build Coastguard Worker from_here,
43*635a8641SAndroid Build Coastguard Worker BindOnce(&internal::ReturnAsParamAdapter<TaskReturnType>, std::move(task),
44*635a8641SAndroid Build Coastguard Worker result),
45*635a8641SAndroid Build Coastguard Worker BindOnce(&internal::ReplyAdapter<TaskReturnType, ReplyArgType>,
46*635a8641SAndroid Build Coastguard Worker std::move(reply), Owned(result)));
47*635a8641SAndroid Build Coastguard Worker }
48*635a8641SAndroid Build Coastguard Worker
49*635a8641SAndroid Build Coastguard Worker // Callback version of PostTaskAndReplyWithResult above.
50*635a8641SAndroid Build Coastguard Worker // Though RepeatingCallback is convertible to OnceCallback, we need this since
51*635a8641SAndroid Build Coastguard Worker // we cannot use template deduction and object conversion at once on the
52*635a8641SAndroid Build Coastguard Worker // overload resolution.
53*635a8641SAndroid Build Coastguard Worker // TODO(crbug.com/714018): Update all callers of the Callback version to use
54*635a8641SAndroid Build Coastguard Worker // OnceCallback.
55*635a8641SAndroid Build Coastguard Worker template <typename TaskReturnType, typename ReplyArgType>
PostTaskAndReplyWithResult(TaskRunner * task_runner,const Location & from_here,Callback<TaskReturnType ()> task,Callback<void (ReplyArgType)> reply)56*635a8641SAndroid Build Coastguard Worker bool PostTaskAndReplyWithResult(TaskRunner* task_runner,
57*635a8641SAndroid Build Coastguard Worker const Location& from_here,
58*635a8641SAndroid Build Coastguard Worker Callback<TaskReturnType()> task,
59*635a8641SAndroid Build Coastguard Worker Callback<void(ReplyArgType)> reply) {
60*635a8641SAndroid Build Coastguard Worker return PostTaskAndReplyWithResult(
61*635a8641SAndroid Build Coastguard Worker task_runner, from_here, OnceCallback<TaskReturnType()>(std::move(task)),
62*635a8641SAndroid Build Coastguard Worker OnceCallback<void(ReplyArgType)>(std::move(reply)));
63*635a8641SAndroid Build Coastguard Worker }
64*635a8641SAndroid Build Coastguard Worker
65*635a8641SAndroid Build Coastguard Worker } // namespace base
66*635a8641SAndroid Build Coastguard Worker
67*635a8641SAndroid Build Coastguard Worker #endif // BASE_TASK_RUNNER_UTIL_H_
68