| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef BASE_TASK_RUNNER_UTIL_H_ | 
 | #define BASE_TASK_RUNNER_UTIL_H_ | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "base/bind.h" | 
 | #include "base/bind_helpers.h" | 
 | #include "base/callback.h" | 
 | #include "base/logging.h" | 
 | #include "base/post_task_and_reply_with_result_internal.h" | 
 | #include "base/task_runner.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | // When you have these methods | 
 | // | 
 | //   R DoWorkAndReturn(); | 
 | //   void Callback(const R& result); | 
 | // | 
 | // and want to call them in a PostTaskAndReply kind of fashion where the | 
 | // result of DoWorkAndReturn is passed to the Callback, you can use | 
 | // PostTaskAndReplyWithResult as in this example: | 
 | // | 
 | // PostTaskAndReplyWithResult( | 
 | //     target_thread_.task_runner(), | 
 | //     FROM_HERE, | 
 | //     BindOnce(&DoWorkAndReturn), | 
 | //     BindOnce(&Callback)); | 
 | template <typename TaskReturnType, typename ReplyArgType> | 
 | bool PostTaskAndReplyWithResult(TaskRunner* task_runner, | 
 |                                 const Location& from_here, | 
 |                                 OnceCallback<TaskReturnType()> task, | 
 |                                 OnceCallback<void(ReplyArgType)> reply) { | 
 |   DCHECK(task); | 
 |   DCHECK(reply); | 
 |   TaskReturnType* result = new TaskReturnType(); | 
 |   return task_runner->PostTaskAndReply( | 
 |       from_here, | 
 |       BindOnce(&internal::ReturnAsParamAdapter<TaskReturnType>, std::move(task), | 
 |                result), | 
 |       BindOnce(&internal::ReplyAdapter<TaskReturnType, ReplyArgType>, | 
 |                std::move(reply), Owned(result))); | 
 | } | 
 |  | 
 | // Callback version of PostTaskAndReplyWithResult above. | 
 | // Though RepeatingCallback is convertible to OnceCallback, we need this since | 
 | // we cannot use template deduction and object conversion at once on the | 
 | // overload resolution. | 
 | // TODO(crbug.com/714018): Update all callers of the Callback version to use | 
 | // OnceCallback. | 
 | template <typename TaskReturnType, typename ReplyArgType> | 
 | bool PostTaskAndReplyWithResult(TaskRunner* task_runner, | 
 |                                 const Location& from_here, | 
 |                                 Callback<TaskReturnType()> task, | 
 |                                 Callback<void(ReplyArgType)> reply) { | 
 |   return PostTaskAndReplyWithResult( | 
 |       task_runner, from_here, OnceCallback<TaskReturnType()>(std::move(task)), | 
 |       OnceCallback<void(ReplyArgType)>(std::move(reply))); | 
 | } | 
 |  | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_TASK_RUNNER_UTIL_H_ |