1 // This file was GENERATED by command:
3 // DO NOT EDIT BY HAND!!!
6 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
7 // Use of this source code is governed by a BSD-style license that can be
8 // found in the LICENSE file.
13 #include "base/bind_internal.h"
14 #include "base/callback_internal.h"
16 // -----------------------------------------------------------------------------
17 // Usage documentation
18 // -----------------------------------------------------------------------------
20 // See base/callback.h for documentation.
23 // -----------------------------------------------------------------------------
24 // Implementation notes
25 // -----------------------------------------------------------------------------
27 // If you're reading the implementation, before proceeding further, you should
28 // read the top comment of base/bind_internal.h for a definition of common
29 // terms and concepts.
33 // Though Bind()'s result is meant to be stored in a Callback<> type, it
34 // cannot actually return the exact type without requiring a large amount
35 // of extra template specializations. The problem is that in order to
36 // discern the correct specialization of Callback<>, Bind would need to
37 // unwrap the function signature to determine the signature's arity, and
38 // whether or not it is a method.
40 // Each unique combination of (arity, function_type, num_prebound) where
41 // function_type is one of {function, method, const_method} would require
42 // one specialization. We eventually have to do a similar number of
43 // specializations anyways in the implementation (see the Invoker<>,
44 // classes). However, it is avoidable in Bind if we return the result
45 // via an indirection like we do below.
47 // TODO(ajwong): We might be able to avoid this now, but need to test.
49 // It is possible to move most of the COMPILE_ASSERT asserts into BindState<>,
50 // but it feels a little nicer to have the asserts here so people do not
51 // need to crack open bind_internal.h. On the other hand, it makes Bind()
56 template <typename Functor
>
58 typename
internal::BindState
<
59 typename
internal::FunctorTraits
<Functor
>::RunnableType
,
60 typename
internal::FunctorTraits
<Functor
>::RunType
,
63 Bind(Functor functor
) {
64 // Typedefs for how to store and run the functor.
65 typedef typename
internal::FunctorTraits
<Functor
>::RunnableType RunnableType
;
66 typedef typename
internal::FunctorTraits
<Functor
>::RunType RunType
;
68 typedef internal::BindState
<RunnableType
, RunType
, void()> BindState
;
71 return Callback
<typename
BindState::UnboundRunType
>(
72 new BindState(internal::MakeRunnable(functor
)));
75 template <typename Functor
, typename P1
>
77 typename
internal::BindState
<
78 typename
internal::FunctorTraits
<Functor
>::RunnableType
,
79 typename
internal::FunctorTraits
<Functor
>::RunType
,
80 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
)>
82 Bind(Functor functor
, const P1
& p1
) {
83 // Typedefs for how to store and run the functor.
84 typedef typename
internal::FunctorTraits
<Functor
>::RunnableType RunnableType
;
85 typedef typename
internal::FunctorTraits
<Functor
>::RunType RunType
;
87 // Use RunnableType::RunType instead of RunType above because our
88 // checks should below for bound references need to know what the actual
89 // functor is going to interpret the argument as.
90 typedef internal::FunctionTraits
<typename
RunnableType::RunType
>
93 // Do not allow binding a non-const reference parameter. Non-const reference
94 // parameters are disallowed by the Google style guide. Also, binding a
95 // non-const reference parameter can make for subtle bugs because the
96 // invoked function will receive a reference to the stored copy of the
97 // argument and not the original.
99 !(is_non_const_reference
<typename
BoundFunctorTraits::A1Type
>::value
),
100 do_not_bind_functions_with_nonconst_ref
);
102 // For methods, we need to be careful for parameter 1. We do not require
103 // a scoped_refptr because BindState<> itself takes care of AddRef() for
104 // methods. We also disallow binding of an array as the method's target
107 internal::HasIsMethodTag
<RunnableType
>::value
||
108 !internal::NeedsScopedRefptrButGetsRawPtr
<P1
>::value
,
109 p1_is_refcounted_type_and_needs_scoped_refptr
);
110 COMPILE_ASSERT(!internal::HasIsMethodTag
<RunnableType
>::value
||
111 !is_array
<P1
>::value
,
112 first_bound_argument_to_method_cannot_be_array
);
113 typedef internal::BindState
<RunnableType
, RunType
,
114 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
)> BindState
;
117 return Callback
<typename
BindState::UnboundRunType
>(
118 new BindState(internal::MakeRunnable(functor
), p1
));
121 template <typename Functor
, typename P1
, typename P2
>
123 typename
internal::BindState
<
124 typename
internal::FunctorTraits
<Functor
>::RunnableType
,
125 typename
internal::FunctorTraits
<Functor
>::RunType
,
126 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
127 typename
internal::CallbackParamTraits
<P2
>::StorageType
)>
129 Bind(Functor functor
, const P1
& p1
, const P2
& p2
) {
130 // Typedefs for how to store and run the functor.
131 typedef typename
internal::FunctorTraits
<Functor
>::RunnableType RunnableType
;
132 typedef typename
internal::FunctorTraits
<Functor
>::RunType RunType
;
134 // Use RunnableType::RunType instead of RunType above because our
135 // checks should below for bound references need to know what the actual
136 // functor is going to interpret the argument as.
137 typedef internal::FunctionTraits
<typename
RunnableType::RunType
>
140 // Do not allow binding a non-const reference parameter. Non-const reference
141 // parameters are disallowed by the Google style guide. Also, binding a
142 // non-const reference parameter can make for subtle bugs because the
143 // invoked function will receive a reference to the stored copy of the
144 // argument and not the original.
146 !(is_non_const_reference
<typename
BoundFunctorTraits::A1Type
>::value
||
147 is_non_const_reference
<typename
BoundFunctorTraits::A2Type
>::value
),
148 do_not_bind_functions_with_nonconst_ref
);
150 // For methods, we need to be careful for parameter 1. We do not require
151 // a scoped_refptr because BindState<> itself takes care of AddRef() for
152 // methods. We also disallow binding of an array as the method's target
155 internal::HasIsMethodTag
<RunnableType
>::value
||
156 !internal::NeedsScopedRefptrButGetsRawPtr
<P1
>::value
,
157 p1_is_refcounted_type_and_needs_scoped_refptr
);
158 COMPILE_ASSERT(!internal::HasIsMethodTag
<RunnableType
>::value
||
159 !is_array
<P1
>::value
,
160 first_bound_argument_to_method_cannot_be_array
);
161 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P2
>::value
,
162 p2_is_refcounted_type_and_needs_scoped_refptr
);
163 typedef internal::BindState
<RunnableType
, RunType
,
164 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
165 typename
internal::CallbackParamTraits
<P2
>::StorageType
)> BindState
;
168 return Callback
<typename
BindState::UnboundRunType
>(
169 new BindState(internal::MakeRunnable(functor
), p1
, p2
));
172 template <typename Functor
, typename P1
, typename P2
, typename P3
>
174 typename
internal::BindState
<
175 typename
internal::FunctorTraits
<Functor
>::RunnableType
,
176 typename
internal::FunctorTraits
<Functor
>::RunType
,
177 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
178 typename
internal::CallbackParamTraits
<P2
>::StorageType
,
179 typename
internal::CallbackParamTraits
<P3
>::StorageType
)>
181 Bind(Functor functor
, const P1
& p1
, const P2
& p2
, const P3
& p3
) {
182 // Typedefs for how to store and run the functor.
183 typedef typename
internal::FunctorTraits
<Functor
>::RunnableType RunnableType
;
184 typedef typename
internal::FunctorTraits
<Functor
>::RunType RunType
;
186 // Use RunnableType::RunType instead of RunType above because our
187 // checks should below for bound references need to know what the actual
188 // functor is going to interpret the argument as.
189 typedef internal::FunctionTraits
<typename
RunnableType::RunType
>
192 // Do not allow binding a non-const reference parameter. Non-const reference
193 // parameters are disallowed by the Google style guide. Also, binding a
194 // non-const reference parameter can make for subtle bugs because the
195 // invoked function will receive a reference to the stored copy of the
196 // argument and not the original.
198 !(is_non_const_reference
<typename
BoundFunctorTraits::A1Type
>::value
||
199 is_non_const_reference
<typename
BoundFunctorTraits::A2Type
>::value
||
200 is_non_const_reference
<typename
BoundFunctorTraits::A3Type
>::value
),
201 do_not_bind_functions_with_nonconst_ref
);
203 // For methods, we need to be careful for parameter 1. We do not require
204 // a scoped_refptr because BindState<> itself takes care of AddRef() for
205 // methods. We also disallow binding of an array as the method's target
208 internal::HasIsMethodTag
<RunnableType
>::value
||
209 !internal::NeedsScopedRefptrButGetsRawPtr
<P1
>::value
,
210 p1_is_refcounted_type_and_needs_scoped_refptr
);
211 COMPILE_ASSERT(!internal::HasIsMethodTag
<RunnableType
>::value
||
212 !is_array
<P1
>::value
,
213 first_bound_argument_to_method_cannot_be_array
);
214 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P2
>::value
,
215 p2_is_refcounted_type_and_needs_scoped_refptr
);
216 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P3
>::value
,
217 p3_is_refcounted_type_and_needs_scoped_refptr
);
218 typedef internal::BindState
<RunnableType
, RunType
,
219 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
220 typename
internal::CallbackParamTraits
<P2
>::StorageType
,
221 typename
internal::CallbackParamTraits
<P3
>::StorageType
)> BindState
;
224 return Callback
<typename
BindState::UnboundRunType
>(
225 new BindState(internal::MakeRunnable(functor
), p1
, p2
, p3
));
228 template <typename Functor
, typename P1
, typename P2
, typename P3
, typename P4
>
230 typename
internal::BindState
<
231 typename
internal::FunctorTraits
<Functor
>::RunnableType
,
232 typename
internal::FunctorTraits
<Functor
>::RunType
,
233 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
234 typename
internal::CallbackParamTraits
<P2
>::StorageType
,
235 typename
internal::CallbackParamTraits
<P3
>::StorageType
,
236 typename
internal::CallbackParamTraits
<P4
>::StorageType
)>
238 Bind(Functor functor
, const P1
& p1
, const P2
& p2
, const P3
& p3
, const P4
& p4
) {
239 // Typedefs for how to store and run the functor.
240 typedef typename
internal::FunctorTraits
<Functor
>::RunnableType RunnableType
;
241 typedef typename
internal::FunctorTraits
<Functor
>::RunType RunType
;
243 // Use RunnableType::RunType instead of RunType above because our
244 // checks should below for bound references need to know what the actual
245 // functor is going to interpret the argument as.
246 typedef internal::FunctionTraits
<typename
RunnableType::RunType
>
249 // Do not allow binding a non-const reference parameter. Non-const reference
250 // parameters are disallowed by the Google style guide. Also, binding a
251 // non-const reference parameter can make for subtle bugs because the
252 // invoked function will receive a reference to the stored copy of the
253 // argument and not the original.
255 !(is_non_const_reference
<typename
BoundFunctorTraits::A1Type
>::value
||
256 is_non_const_reference
<typename
BoundFunctorTraits::A2Type
>::value
||
257 is_non_const_reference
<typename
BoundFunctorTraits::A3Type
>::value
||
258 is_non_const_reference
<typename
BoundFunctorTraits::A4Type
>::value
),
259 do_not_bind_functions_with_nonconst_ref
);
261 // For methods, we need to be careful for parameter 1. We do not require
262 // a scoped_refptr because BindState<> itself takes care of AddRef() for
263 // methods. We also disallow binding of an array as the method's target
266 internal::HasIsMethodTag
<RunnableType
>::value
||
267 !internal::NeedsScopedRefptrButGetsRawPtr
<P1
>::value
,
268 p1_is_refcounted_type_and_needs_scoped_refptr
);
269 COMPILE_ASSERT(!internal::HasIsMethodTag
<RunnableType
>::value
||
270 !is_array
<P1
>::value
,
271 first_bound_argument_to_method_cannot_be_array
);
272 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P2
>::value
,
273 p2_is_refcounted_type_and_needs_scoped_refptr
);
274 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P3
>::value
,
275 p3_is_refcounted_type_and_needs_scoped_refptr
);
276 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P4
>::value
,
277 p4_is_refcounted_type_and_needs_scoped_refptr
);
278 typedef internal::BindState
<RunnableType
, RunType
,
279 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
280 typename
internal::CallbackParamTraits
<P2
>::StorageType
,
281 typename
internal::CallbackParamTraits
<P3
>::StorageType
,
282 typename
internal::CallbackParamTraits
<P4
>::StorageType
)> BindState
;
285 return Callback
<typename
BindState::UnboundRunType
>(
286 new BindState(internal::MakeRunnable(functor
), p1
, p2
, p3
, p4
));
289 template <typename Functor
, typename P1
, typename P2
, typename P3
, typename P4
,
292 typename
internal::BindState
<
293 typename
internal::FunctorTraits
<Functor
>::RunnableType
,
294 typename
internal::FunctorTraits
<Functor
>::RunType
,
295 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
296 typename
internal::CallbackParamTraits
<P2
>::StorageType
,
297 typename
internal::CallbackParamTraits
<P3
>::StorageType
,
298 typename
internal::CallbackParamTraits
<P4
>::StorageType
,
299 typename
internal::CallbackParamTraits
<P5
>::StorageType
)>
301 Bind(Functor functor
, const P1
& p1
, const P2
& p2
, const P3
& p3
, const P4
& p4
,
303 // Typedefs for how to store and run the functor.
304 typedef typename
internal::FunctorTraits
<Functor
>::RunnableType RunnableType
;
305 typedef typename
internal::FunctorTraits
<Functor
>::RunType RunType
;
307 // Use RunnableType::RunType instead of RunType above because our
308 // checks should below for bound references need to know what the actual
309 // functor is going to interpret the argument as.
310 typedef internal::FunctionTraits
<typename
RunnableType::RunType
>
313 // Do not allow binding a non-const reference parameter. Non-const reference
314 // parameters are disallowed by the Google style guide. Also, binding a
315 // non-const reference parameter can make for subtle bugs because the
316 // invoked function will receive a reference to the stored copy of the
317 // argument and not the original.
319 !(is_non_const_reference
<typename
BoundFunctorTraits::A1Type
>::value
||
320 is_non_const_reference
<typename
BoundFunctorTraits::A2Type
>::value
||
321 is_non_const_reference
<typename
BoundFunctorTraits::A3Type
>::value
||
322 is_non_const_reference
<typename
BoundFunctorTraits::A4Type
>::value
||
323 is_non_const_reference
<typename
BoundFunctorTraits::A5Type
>::value
),
324 do_not_bind_functions_with_nonconst_ref
);
326 // For methods, we need to be careful for parameter 1. We do not require
327 // a scoped_refptr because BindState<> itself takes care of AddRef() for
328 // methods. We also disallow binding of an array as the method's target
331 internal::HasIsMethodTag
<RunnableType
>::value
||
332 !internal::NeedsScopedRefptrButGetsRawPtr
<P1
>::value
,
333 p1_is_refcounted_type_and_needs_scoped_refptr
);
334 COMPILE_ASSERT(!internal::HasIsMethodTag
<RunnableType
>::value
||
335 !is_array
<P1
>::value
,
336 first_bound_argument_to_method_cannot_be_array
);
337 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P2
>::value
,
338 p2_is_refcounted_type_and_needs_scoped_refptr
);
339 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P3
>::value
,
340 p3_is_refcounted_type_and_needs_scoped_refptr
);
341 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P4
>::value
,
342 p4_is_refcounted_type_and_needs_scoped_refptr
);
343 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P5
>::value
,
344 p5_is_refcounted_type_and_needs_scoped_refptr
);
345 typedef internal::BindState
<RunnableType
, RunType
,
346 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
347 typename
internal::CallbackParamTraits
<P2
>::StorageType
,
348 typename
internal::CallbackParamTraits
<P3
>::StorageType
,
349 typename
internal::CallbackParamTraits
<P4
>::StorageType
,
350 typename
internal::CallbackParamTraits
<P5
>::StorageType
)> BindState
;
353 return Callback
<typename
BindState::UnboundRunType
>(
354 new BindState(internal::MakeRunnable(functor
), p1
, p2
, p3
, p4
, p5
));
357 template <typename Functor
, typename P1
, typename P2
, typename P3
, typename P4
,
358 typename P5
, typename P6
>
360 typename
internal::BindState
<
361 typename
internal::FunctorTraits
<Functor
>::RunnableType
,
362 typename
internal::FunctorTraits
<Functor
>::RunType
,
363 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
364 typename
internal::CallbackParamTraits
<P2
>::StorageType
,
365 typename
internal::CallbackParamTraits
<P3
>::StorageType
,
366 typename
internal::CallbackParamTraits
<P4
>::StorageType
,
367 typename
internal::CallbackParamTraits
<P5
>::StorageType
,
368 typename
internal::CallbackParamTraits
<P6
>::StorageType
)>
370 Bind(Functor functor
, const P1
& p1
, const P2
& p2
, const P3
& p3
, const P4
& p4
,
371 const P5
& p5
, const P6
& p6
) {
372 // Typedefs for how to store and run the functor.
373 typedef typename
internal::FunctorTraits
<Functor
>::RunnableType RunnableType
;
374 typedef typename
internal::FunctorTraits
<Functor
>::RunType RunType
;
376 // Use RunnableType::RunType instead of RunType above because our
377 // checks should below for bound references need to know what the actual
378 // functor is going to interpret the argument as.
379 typedef internal::FunctionTraits
<typename
RunnableType::RunType
>
382 // Do not allow binding a non-const reference parameter. Non-const reference
383 // parameters are disallowed by the Google style guide. Also, binding a
384 // non-const reference parameter can make for subtle bugs because the
385 // invoked function will receive a reference to the stored copy of the
386 // argument and not the original.
388 !(is_non_const_reference
<typename
BoundFunctorTraits::A1Type
>::value
||
389 is_non_const_reference
<typename
BoundFunctorTraits::A2Type
>::value
||
390 is_non_const_reference
<typename
BoundFunctorTraits::A3Type
>::value
||
391 is_non_const_reference
<typename
BoundFunctorTraits::A4Type
>::value
||
392 is_non_const_reference
<typename
BoundFunctorTraits::A5Type
>::value
||
393 is_non_const_reference
<typename
BoundFunctorTraits::A6Type
>::value
),
394 do_not_bind_functions_with_nonconst_ref
);
396 // For methods, we need to be careful for parameter 1. We do not require
397 // a scoped_refptr because BindState<> itself takes care of AddRef() for
398 // methods. We also disallow binding of an array as the method's target
401 internal::HasIsMethodTag
<RunnableType
>::value
||
402 !internal::NeedsScopedRefptrButGetsRawPtr
<P1
>::value
,
403 p1_is_refcounted_type_and_needs_scoped_refptr
);
404 COMPILE_ASSERT(!internal::HasIsMethodTag
<RunnableType
>::value
||
405 !is_array
<P1
>::value
,
406 first_bound_argument_to_method_cannot_be_array
);
407 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P2
>::value
,
408 p2_is_refcounted_type_and_needs_scoped_refptr
);
409 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P3
>::value
,
410 p3_is_refcounted_type_and_needs_scoped_refptr
);
411 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P4
>::value
,
412 p4_is_refcounted_type_and_needs_scoped_refptr
);
413 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P5
>::value
,
414 p5_is_refcounted_type_and_needs_scoped_refptr
);
415 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P6
>::value
,
416 p6_is_refcounted_type_and_needs_scoped_refptr
);
417 typedef internal::BindState
<RunnableType
, RunType
,
418 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
419 typename
internal::CallbackParamTraits
<P2
>::StorageType
,
420 typename
internal::CallbackParamTraits
<P3
>::StorageType
,
421 typename
internal::CallbackParamTraits
<P4
>::StorageType
,
422 typename
internal::CallbackParamTraits
<P5
>::StorageType
,
423 typename
internal::CallbackParamTraits
<P6
>::StorageType
)> BindState
;
426 return Callback
<typename
BindState::UnboundRunType
>(
427 new BindState(internal::MakeRunnable(functor
), p1
, p2
, p3
, p4
, p5
, p6
));
430 template <typename Functor
, typename P1
, typename P2
, typename P3
, typename P4
,
431 typename P5
, typename P6
, typename P7
>
433 typename
internal::BindState
<
434 typename
internal::FunctorTraits
<Functor
>::RunnableType
,
435 typename
internal::FunctorTraits
<Functor
>::RunType
,
436 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
437 typename
internal::CallbackParamTraits
<P2
>::StorageType
,
438 typename
internal::CallbackParamTraits
<P3
>::StorageType
,
439 typename
internal::CallbackParamTraits
<P4
>::StorageType
,
440 typename
internal::CallbackParamTraits
<P5
>::StorageType
,
441 typename
internal::CallbackParamTraits
<P6
>::StorageType
,
442 typename
internal::CallbackParamTraits
<P7
>::StorageType
)>
444 Bind(Functor functor
, const P1
& p1
, const P2
& p2
, const P3
& p3
, const P4
& p4
,
445 const P5
& p5
, const P6
& p6
, const P7
& p7
) {
446 // Typedefs for how to store and run the functor.
447 typedef typename
internal::FunctorTraits
<Functor
>::RunnableType RunnableType
;
448 typedef typename
internal::FunctorTraits
<Functor
>::RunType RunType
;
450 // Use RunnableType::RunType instead of RunType above because our
451 // checks should below for bound references need to know what the actual
452 // functor is going to interpret the argument as.
453 typedef internal::FunctionTraits
<typename
RunnableType::RunType
>
456 // Do not allow binding a non-const reference parameter. Non-const reference
457 // parameters are disallowed by the Google style guide. Also, binding a
458 // non-const reference parameter can make for subtle bugs because the
459 // invoked function will receive a reference to the stored copy of the
460 // argument and not the original.
462 !(is_non_const_reference
<typename
BoundFunctorTraits::A1Type
>::value
||
463 is_non_const_reference
<typename
BoundFunctorTraits::A2Type
>::value
||
464 is_non_const_reference
<typename
BoundFunctorTraits::A3Type
>::value
||
465 is_non_const_reference
<typename
BoundFunctorTraits::A4Type
>::value
||
466 is_non_const_reference
<typename
BoundFunctorTraits::A5Type
>::value
||
467 is_non_const_reference
<typename
BoundFunctorTraits::A6Type
>::value
||
468 is_non_const_reference
<typename
BoundFunctorTraits::A7Type
>::value
),
469 do_not_bind_functions_with_nonconst_ref
);
471 // For methods, we need to be careful for parameter 1. We do not require
472 // a scoped_refptr because BindState<> itself takes care of AddRef() for
473 // methods. We also disallow binding of an array as the method's target
476 internal::HasIsMethodTag
<RunnableType
>::value
||
477 !internal::NeedsScopedRefptrButGetsRawPtr
<P1
>::value
,
478 p1_is_refcounted_type_and_needs_scoped_refptr
);
479 COMPILE_ASSERT(!internal::HasIsMethodTag
<RunnableType
>::value
||
480 !is_array
<P1
>::value
,
481 first_bound_argument_to_method_cannot_be_array
);
482 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P2
>::value
,
483 p2_is_refcounted_type_and_needs_scoped_refptr
);
484 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P3
>::value
,
485 p3_is_refcounted_type_and_needs_scoped_refptr
);
486 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P4
>::value
,
487 p4_is_refcounted_type_and_needs_scoped_refptr
);
488 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P5
>::value
,
489 p5_is_refcounted_type_and_needs_scoped_refptr
);
490 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P6
>::value
,
491 p6_is_refcounted_type_and_needs_scoped_refptr
);
492 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr
<P7
>::value
,
493 p7_is_refcounted_type_and_needs_scoped_refptr
);
494 typedef internal::BindState
<RunnableType
, RunType
,
495 void(typename
internal::CallbackParamTraits
<P1
>::StorageType
,
496 typename
internal::CallbackParamTraits
<P2
>::StorageType
,
497 typename
internal::CallbackParamTraits
<P3
>::StorageType
,
498 typename
internal::CallbackParamTraits
<P4
>::StorageType
,
499 typename
internal::CallbackParamTraits
<P5
>::StorageType
,
500 typename
internal::CallbackParamTraits
<P6
>::StorageType
,
501 typename
internal::CallbackParamTraits
<P7
>::StorageType
)> BindState
;
504 return Callback
<typename
BindState::UnboundRunType
>(
505 new BindState(internal::MakeRunnable(functor
), p1
, p2
, p3
, p4
, p5
, p6
,
511 #endif // BASE_BIND_H_