OLD | NEW |
| (Empty) |
1 $$ This is a pump file for generating file templates. Pump is a python | |
2 $$ script that is part of the Google Test suite of utilities. Description | |
3 $$ can be found here: | |
4 $$ | |
5 $$ http://code.google.com/p/googletest/wiki/PumpManual | |
6 $$ | |
7 | |
8 $$ See comment for MAX_ARITY in base/bind.h.pump. | |
9 $var MAX_ARITY = 7 | |
10 | |
11 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
12 // Use of this source code is governed by a BSD-style license that can be | |
13 // found in the LICENSE file. | |
14 | |
15 #ifndef MEDIA_BASE_BIND_TO_LOOP_H_ | |
16 #define MEDIA_BASE_BIND_TO_LOOP_H_ | |
17 | |
18 #include "base/bind.h" | |
19 #include "base/location.h" | |
20 #include "base/message_loop/message_loop_proxy.h" | |
21 #include "base/single_thread_task_runner.h" | |
22 | |
23 // This is a helper utility for base::Bind()ing callbacks to the current | |
24 // MessageLoop. The typical use is when |a| (of class |A|) wants to hand a | |
25 // callback such as base::Bind(&A::AMethod, a) to |b|, but needs to ensure that | |
26 // when |b| executes the callback, it does so on |a|'s current MessageLoop. | |
27 // | |
28 // Typical usage: request to be called back on the current thread: | |
29 // other->StartAsyncProcessAndCallMeBack( | |
30 // media::BindToCurrentLoop(base::Bind(&MyClass::MyMethod, this))); | |
31 // | |
32 // Note that like base::Bind(), BindToCurrentLoop() can't bind non-constant | |
33 // references, and that *unlike* base::Bind(), BindToCurrentLoop() makes copies | |
34 // of its arguments, and thus can't be used with arrays. | |
35 | |
36 namespace media { | |
37 | |
38 // Mimic base::internal::CallbackForward, replacing p.Pass() with | |
39 // base::Passed(&p) to account for the extra layer of indirection. | |
40 namespace internal { | |
41 template <typename T> | |
42 T& TrampolineForward(T& t) { return t; } | |
43 | |
44 template <typename T> | |
45 base::internal::PassedWrapper<scoped_ptr<T> > TrampolineForward( | |
46 scoped_ptr<T>& p) { return base::Passed(&p); } | |
47 | |
48 template <typename T, typename R> | |
49 base::internal::PassedWrapper<scoped_ptr_malloc<T, R> > TrampolineForward( | |
50 scoped_ptr_malloc<T, R>& p) { return base::Passed(&p); } | |
51 | |
52 template <typename T> | |
53 base::internal::PassedWrapper<ScopedVector<T> > TrampolineForward( | |
54 ScopedVector<T>& p) { return base::Passed(&p); } | |
55 | |
56 template <typename T> struct TrampolineHelper; | |
57 | |
58 $range ARITY 0..MAX_ARITY | |
59 $for ARITY [[ | |
60 $range ARG 1..ARITY | |
61 | |
62 template <$for ARG , [[typename A$(ARG)]]> | |
63 struct TrampolineHelper<void($for ARG , [[A$(ARG)]])> { | |
64 static void Run( | |
65 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | |
66 const base::Callback<void($for ARG , [[A$(ARG)]])>& cb | |
67 $if ARITY != 0 [[, ]] | |
68 $for ARG , [[A$(ARG) a$(ARG)]] | |
69 ) { | |
70 task_runner->PostTask(FROM_HERE, base::Bind(cb | |
71 $if ARITY != 0 [[, ]] | |
72 $for ARG , [[internal::TrampolineForward(a$(ARG))]])); | |
73 } | |
74 }; | |
75 | |
76 | |
77 ]] $$ for ARITY | |
78 | |
79 } // namespace internal | |
80 | |
81 // TODO(scherkus): Rename me to something that emphasizes the asynchrony | |
82 // http://crbug.com/167240 | |
83 template<typename T> | |
84 static base::Callback<T> BindToCurrentLoop( | |
85 const base::Callback<T>& cb) { | |
86 return base::Bind(&internal::TrampolineHelper<T>::Run, | |
87 base::MessageLoopProxy::current(), cb); | |
88 } | |
89 | |
90 } // namespace media | |
91 | |
92 #endif // MEDIA_BASE_BIND_TO_LOOP_H_ | |
OLD | NEW |