Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef BASE_TASK_RUNNER_HELPERS_H_ | |
| 6 #define BASE_TASK_RUNNER_HELPERS_H_ | |
| 7 #pragma once | |
| 8 | |
| 9 #include "base/bind.h" | |
| 10 #include "base/callback.h" | |
| 11 #include "base/logging.h" | |
| 12 | |
| 13 namespace base { | |
| 14 | |
| 15 // Helper templates to call methods and reply with the returned value. | |
| 16 // | |
| 17 // Typically when you have these methods: | |
| 18 // R DoWorkAndReturn(); | |
| 19 // void Callback(R& result); | |
|
darin (slow to review)
2012/02/29 00:27:48
why does Callback take a non-const reference? sho
battre
2012/03/07 20:01:48
Done.
| |
| 20 // | |
| 21 // You can pass the result of DoWorkAndReturn to the Callback by: | |
| 22 // | |
| 23 // R* result = new R; | |
| 24 // message_loop_proxy->PostTaskAndReply( | |
| 25 // from_here, | |
| 26 // ReturnAsParam<R>(Bind(&DoWorkAndReturn), result), | |
| 27 // RelayHelper(Bind(&Callback), Owned(result))); | |
|
satorux1
2012/02/28 23:58:13
drive-by: Where is RelayHelper defined? 'git grep'
battre
2012/03/07 20:01:48
This was a copy&pasted typo (->ReplyHelper).
Done
| |
| 28 // | |
| 29 // Or just use PostTaskAndReplyWithStatus helper template (see the code below). | |
| 30 // | |
| 31 // PostTaskAndReplyWithStatus( | |
| 32 // message_loop_proxy, from_here, | |
| 33 // Bind(&DoWorkAndReturn), | |
| 34 // Bind(&Callback), | |
| 35 // new R); | |
| 36 template <typename R1, typename R2> | |
|
willchan no longer on Chromium
2012/03/01 02:17:24
I don't think I like ReturnValueTranslator. Do the
battre
2012/03/07 20:01:48
Done.
| |
| 37 struct ReturnValueTranslator { | |
| 38 static R2 Value(const R1& value); | |
| 39 }; | |
| 40 | |
| 41 // Template that may be specialized to convert the return value of the | |
| 42 // DoWorkAndReturn function before being passed to the Callback function. | |
| 43 template <typename R> | |
| 44 struct ReturnValueTranslator<R, R> { | |
| 45 static R Value(const R& value) { return value; } | |
| 46 }; | |
| 47 | |
| 48 template <typename R1, typename R2> | |
| 49 void ReturnAsParamAdapter(const Callback<R1(void)>& func, R2* result) { | |
| 50 if (!func.is_null()) | |
|
willchan no longer on Chromium
2012/03/01 02:17:24
I don't think we should allow func to be NULL. Why
battre
2012/03/07 20:01:48
Some unit tests rely on this (see the failed tests
| |
| 51 *result = ReturnValueTranslator<R1, R2>::Value(func.Run()); | |
|
willchan no longer on Chromium
2012/03/01 02:17:24
I think this should just be *result = fun.Run(); a
battre
2012/03/07 20:01:48
Done.
| |
| 52 } | |
| 53 | |
| 54 template <typename R1, typename R2> | |
| 55 Closure ReturnAsParam(const Callback<R1(void)>& func, R2* result) { | |
| 56 DCHECK(result); | |
| 57 return Bind(&ReturnAsParamAdapter<R1, R2>, func, result); | |
| 58 } | |
| 59 | |
| 60 template <typename R, typename A1> | |
| 61 void ReturnAsParamAdapter1(const Callback<R(A1)>& func, A1 a1, R* result) { | |
|
willchan no longer on Chromium
2012/03/01 02:17:24
Do we need pump to generate multiple variants of t
battre
2012/03/07 20:01:48
No, we can achieve the same effect by using Bind.
| |
| 62 if (!func.is_null()) | |
| 63 *result = func.Run(a1); | |
| 64 } | |
| 65 | |
| 66 template <typename R, typename A1> | |
| 67 Closure ReturnAsParam(const Callback<R(A1)>& func, A1 a1, R* result) { | |
| 68 DCHECK(result); | |
| 69 return Bind(&ReturnAsParamAdapter1<R, A1>, func, a1, result); | |
| 70 } | |
| 71 | |
| 72 template <typename R> | |
| 73 void ReplyAdapter(const Callback<void(R)>& callback, R* result) { | |
| 74 DCHECK(result); | |
| 75 if (!callback.is_null()) | |
|
willchan no longer on Chromium
2012/03/01 02:17:24
I think we should DCHECK in PostTaskAndReplyWithSt
battre
2012/03/07 20:01:48
See above.
| |
| 76 callback.Run(*result); | |
| 77 } | |
| 78 | |
| 79 template <typename R, typename OWNED> | |
|
willchan no longer on Chromium
2012/03/01 02:17:24
I think we should only have one parameter, let's n
battre
2012/03/07 20:01:48
Done.
| |
| 80 Closure ReplyHelper(const Callback<void(R)>& callback, OWNED result) { | |
| 81 return Bind(&ReplyAdapter<R>, callback, result); | |
| 82 } | |
| 83 | |
| 84 template <typename R1, typename R2> | |
| 85 bool PostTaskAndReplyWithStatus( | |
|
darin (slow to review)
2012/02/29 00:27:48
why is this function named *WithStatus?
willchan no longer on Chromium
2012/03/01 02:17:24
I think this should be the only function in base.
battre
2012/03/07 20:01:48
Done.
battre
2012/03/07 20:01:48
I have renamed it to PostTaskAndReplyWithResult. I
| |
| 86 const scoped_refptr<TaskRunner>& task_runner, | |
| 87 const tracked_objects::Location& from_here, | |
| 88 const Callback<R1(void)>& do_work_and_return, | |
| 89 const Callback<void(R2)>& callback, | |
| 90 R2* result) { | |
| 91 return task_runner->PostTaskAndReply( | |
| 92 from_here, | |
| 93 ReturnAsParam<R1>(do_work_and_return, result), | |
| 94 ReplyHelper(callback, Owned(result))); | |
| 95 } | |
| 96 | |
| 97 } // namespace base | |
| 98 | |
| 99 #endif // BASE_TASK_RUNNER_HELPERS_H_ | |
| OLD | NEW |