Move media/base/simd/x86inc.asm to third_party/x86inc
[chromium-blink-merge.git] / base / bind.h
blob5cf124df32f30bb5b4080d8370d1b05f199cc19e
1 // This file was GENERATED by command:
2 // pump.py bind.h.pump
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.
10 #ifndef BASE_BIND_H_
11 #define BASE_BIND_H_
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.
31 // RETURN TYPES
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()
52 // harder to read.
54 namespace base {
56 template <typename Functor>
57 base::Callback<
58 typename internal::BindState<
59 typename internal::FunctorTraits<Functor>::RunnableType,
60 typename internal::FunctorTraits<Functor>::RunType,
61 void()>
62 ::UnboundRunType>
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 // Use RunnableType::RunType instead of RunType above because our
69 // checks should below for bound references need to know what the actual
70 // functor is going to interpret the argument as.
71 typedef internal::FunctionTraits<typename RunnableType::RunType>
72 BoundFunctorTraits;
74 typedef internal::BindState<RunnableType, RunType, void()> BindState;
77 return Callback<typename BindState::UnboundRunType>(
78 new BindState(internal::MakeRunnable(functor)));
81 template <typename Functor, typename P1>
82 base::Callback<
83 typename internal::BindState<
84 typename internal::FunctorTraits<Functor>::RunnableType,
85 typename internal::FunctorTraits<Functor>::RunType,
86 void(typename internal::CallbackParamTraits<P1>::StorageType)>
87 ::UnboundRunType>
88 Bind(Functor functor, const P1& p1) {
89 // Typedefs for how to store and run the functor.
90 typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
91 typedef typename internal::FunctorTraits<Functor>::RunType RunType;
93 // Use RunnableType::RunType instead of RunType above because our
94 // checks should below for bound references need to know what the actual
95 // functor is going to interpret the argument as.
96 typedef internal::FunctionTraits<typename RunnableType::RunType>
97 BoundFunctorTraits;
99 // Do not allow binding a non-const reference parameter. Non-const reference
100 // parameters are disallowed by the Google style guide. Also, binding a
101 // non-const reference parameter can make for subtle bugs because the
102 // invoked function will receive a reference to the stored copy of the
103 // argument and not the original.
104 COMPILE_ASSERT(
105 !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ),
106 do_not_bind_functions_with_nonconst_ref);
108 // For methods, we need to be careful for parameter 1. We do not require
109 // a scoped_refptr because BindState<> itself takes care of AddRef() for
110 // methods. We also disallow binding of an array as the method's target
111 // object.
112 COMPILE_ASSERT(
113 internal::HasIsMethodTag<RunnableType>::value ||
114 !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
115 p1_is_refcounted_type_and_needs_scoped_refptr);
116 COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
117 !is_array<P1>::value,
118 first_bound_argument_to_method_cannot_be_array);
119 typedef internal::BindState<RunnableType, RunType,
120 void(typename internal::CallbackParamTraits<P1>::StorageType)> BindState;
123 return Callback<typename BindState::UnboundRunType>(
124 new BindState(internal::MakeRunnable(functor), p1));
127 template <typename Functor, typename P1, typename P2>
128 base::Callback<
129 typename internal::BindState<
130 typename internal::FunctorTraits<Functor>::RunnableType,
131 typename internal::FunctorTraits<Functor>::RunType,
132 void(typename internal::CallbackParamTraits<P1>::StorageType,
133 typename internal::CallbackParamTraits<P2>::StorageType)>
134 ::UnboundRunType>
135 Bind(Functor functor, const P1& p1, const P2& p2) {
136 // Typedefs for how to store and run the functor.
137 typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
138 typedef typename internal::FunctorTraits<Functor>::RunType RunType;
140 // Use RunnableType::RunType instead of RunType above because our
141 // checks should below for bound references need to know what the actual
142 // functor is going to interpret the argument as.
143 typedef internal::FunctionTraits<typename RunnableType::RunType>
144 BoundFunctorTraits;
146 // Do not allow binding a non-const reference parameter. Non-const reference
147 // parameters are disallowed by the Google style guide. Also, binding a
148 // non-const reference parameter can make for subtle bugs because the
149 // invoked function will receive a reference to the stored copy of the
150 // argument and not the original.
151 COMPILE_ASSERT(
152 !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
153 is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ),
154 do_not_bind_functions_with_nonconst_ref);
156 // For methods, we need to be careful for parameter 1. We do not require
157 // a scoped_refptr because BindState<> itself takes care of AddRef() for
158 // methods. We also disallow binding of an array as the method's target
159 // object.
160 COMPILE_ASSERT(
161 internal::HasIsMethodTag<RunnableType>::value ||
162 !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
163 p1_is_refcounted_type_and_needs_scoped_refptr);
164 COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
165 !is_array<P1>::value,
166 first_bound_argument_to_method_cannot_be_array);
167 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
168 p2_is_refcounted_type_and_needs_scoped_refptr);
169 typedef internal::BindState<RunnableType, RunType,
170 void(typename internal::CallbackParamTraits<P1>::StorageType,
171 typename internal::CallbackParamTraits<P2>::StorageType)> BindState;
174 return Callback<typename BindState::UnboundRunType>(
175 new BindState(internal::MakeRunnable(functor), p1, p2));
178 template <typename Functor, typename P1, typename P2, typename P3>
179 base::Callback<
180 typename internal::BindState<
181 typename internal::FunctorTraits<Functor>::RunnableType,
182 typename internal::FunctorTraits<Functor>::RunType,
183 void(typename internal::CallbackParamTraits<P1>::StorageType,
184 typename internal::CallbackParamTraits<P2>::StorageType,
185 typename internal::CallbackParamTraits<P3>::StorageType)>
186 ::UnboundRunType>
187 Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3) {
188 // Typedefs for how to store and run the functor.
189 typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
190 typedef typename internal::FunctorTraits<Functor>::RunType RunType;
192 // Use RunnableType::RunType instead of RunType above because our
193 // checks should below for bound references need to know what the actual
194 // functor is going to interpret the argument as.
195 typedef internal::FunctionTraits<typename RunnableType::RunType>
196 BoundFunctorTraits;
198 // Do not allow binding a non-const reference parameter. Non-const reference
199 // parameters are disallowed by the Google style guide. Also, binding a
200 // non-const reference parameter can make for subtle bugs because the
201 // invoked function will receive a reference to the stored copy of the
202 // argument and not the original.
203 COMPILE_ASSERT(
204 !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
205 is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
206 is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ),
207 do_not_bind_functions_with_nonconst_ref);
209 // For methods, we need to be careful for parameter 1. We do not require
210 // a scoped_refptr because BindState<> itself takes care of AddRef() for
211 // methods. We also disallow binding of an array as the method's target
212 // object.
213 COMPILE_ASSERT(
214 internal::HasIsMethodTag<RunnableType>::value ||
215 !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
216 p1_is_refcounted_type_and_needs_scoped_refptr);
217 COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
218 !is_array<P1>::value,
219 first_bound_argument_to_method_cannot_be_array);
220 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
221 p2_is_refcounted_type_and_needs_scoped_refptr);
222 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
223 p3_is_refcounted_type_and_needs_scoped_refptr);
224 typedef internal::BindState<RunnableType, RunType,
225 void(typename internal::CallbackParamTraits<P1>::StorageType,
226 typename internal::CallbackParamTraits<P2>::StorageType,
227 typename internal::CallbackParamTraits<P3>::StorageType)> BindState;
230 return Callback<typename BindState::UnboundRunType>(
231 new BindState(internal::MakeRunnable(functor), p1, p2, p3));
234 template <typename Functor, typename P1, typename P2, typename P3, typename P4>
235 base::Callback<
236 typename internal::BindState<
237 typename internal::FunctorTraits<Functor>::RunnableType,
238 typename internal::FunctorTraits<Functor>::RunType,
239 void(typename internal::CallbackParamTraits<P1>::StorageType,
240 typename internal::CallbackParamTraits<P2>::StorageType,
241 typename internal::CallbackParamTraits<P3>::StorageType,
242 typename internal::CallbackParamTraits<P4>::StorageType)>
243 ::UnboundRunType>
244 Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
245 // Typedefs for how to store and run the functor.
246 typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
247 typedef typename internal::FunctorTraits<Functor>::RunType RunType;
249 // Use RunnableType::RunType instead of RunType above because our
250 // checks should below for bound references need to know what the actual
251 // functor is going to interpret the argument as.
252 typedef internal::FunctionTraits<typename RunnableType::RunType>
253 BoundFunctorTraits;
255 // Do not allow binding a non-const reference parameter. Non-const reference
256 // parameters are disallowed by the Google style guide. Also, binding a
257 // non-const reference parameter can make for subtle bugs because the
258 // invoked function will receive a reference to the stored copy of the
259 // argument and not the original.
260 COMPILE_ASSERT(
261 !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
262 is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
263 is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
264 is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ),
265 do_not_bind_functions_with_nonconst_ref);
267 // For methods, we need to be careful for parameter 1. We do not require
268 // a scoped_refptr because BindState<> itself takes care of AddRef() for
269 // methods. We also disallow binding of an array as the method's target
270 // object.
271 COMPILE_ASSERT(
272 internal::HasIsMethodTag<RunnableType>::value ||
273 !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
274 p1_is_refcounted_type_and_needs_scoped_refptr);
275 COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
276 !is_array<P1>::value,
277 first_bound_argument_to_method_cannot_be_array);
278 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
279 p2_is_refcounted_type_and_needs_scoped_refptr);
280 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
281 p3_is_refcounted_type_and_needs_scoped_refptr);
282 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
283 p4_is_refcounted_type_and_needs_scoped_refptr);
284 typedef internal::BindState<RunnableType, RunType,
285 void(typename internal::CallbackParamTraits<P1>::StorageType,
286 typename internal::CallbackParamTraits<P2>::StorageType,
287 typename internal::CallbackParamTraits<P3>::StorageType,
288 typename internal::CallbackParamTraits<P4>::StorageType)> BindState;
291 return Callback<typename BindState::UnboundRunType>(
292 new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4));
295 template <typename Functor, typename P1, typename P2, typename P3, typename P4,
296 typename P5>
297 base::Callback<
298 typename internal::BindState<
299 typename internal::FunctorTraits<Functor>::RunnableType,
300 typename internal::FunctorTraits<Functor>::RunType,
301 void(typename internal::CallbackParamTraits<P1>::StorageType,
302 typename internal::CallbackParamTraits<P2>::StorageType,
303 typename internal::CallbackParamTraits<P3>::StorageType,
304 typename internal::CallbackParamTraits<P4>::StorageType,
305 typename internal::CallbackParamTraits<P5>::StorageType)>
306 ::UnboundRunType>
307 Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4,
308 const P5& p5) {
309 // Typedefs for how to store and run the functor.
310 typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
311 typedef typename internal::FunctorTraits<Functor>::RunType RunType;
313 // Use RunnableType::RunType instead of RunType above because our
314 // checks should below for bound references need to know what the actual
315 // functor is going to interpret the argument as.
316 typedef internal::FunctionTraits<typename RunnableType::RunType>
317 BoundFunctorTraits;
319 // Do not allow binding a non-const reference parameter. Non-const reference
320 // parameters are disallowed by the Google style guide. Also, binding a
321 // non-const reference parameter can make for subtle bugs because the
322 // invoked function will receive a reference to the stored copy of the
323 // argument and not the original.
324 COMPILE_ASSERT(
325 !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
326 is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
327 is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
328 is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
329 is_non_const_reference<typename BoundFunctorTraits::A5Type>::value ),
330 do_not_bind_functions_with_nonconst_ref);
332 // For methods, we need to be careful for parameter 1. We do not require
333 // a scoped_refptr because BindState<> itself takes care of AddRef() for
334 // methods. We also disallow binding of an array as the method's target
335 // object.
336 COMPILE_ASSERT(
337 internal::HasIsMethodTag<RunnableType>::value ||
338 !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
339 p1_is_refcounted_type_and_needs_scoped_refptr);
340 COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
341 !is_array<P1>::value,
342 first_bound_argument_to_method_cannot_be_array);
343 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
344 p2_is_refcounted_type_and_needs_scoped_refptr);
345 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
346 p3_is_refcounted_type_and_needs_scoped_refptr);
347 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
348 p4_is_refcounted_type_and_needs_scoped_refptr);
349 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
350 p5_is_refcounted_type_and_needs_scoped_refptr);
351 typedef internal::BindState<RunnableType, RunType,
352 void(typename internal::CallbackParamTraits<P1>::StorageType,
353 typename internal::CallbackParamTraits<P2>::StorageType,
354 typename internal::CallbackParamTraits<P3>::StorageType,
355 typename internal::CallbackParamTraits<P4>::StorageType,
356 typename internal::CallbackParamTraits<P5>::StorageType)> BindState;
359 return Callback<typename BindState::UnboundRunType>(
360 new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5));
363 template <typename Functor, typename P1, typename P2, typename P3, typename P4,
364 typename P5, typename P6>
365 base::Callback<
366 typename internal::BindState<
367 typename internal::FunctorTraits<Functor>::RunnableType,
368 typename internal::FunctorTraits<Functor>::RunType,
369 void(typename internal::CallbackParamTraits<P1>::StorageType,
370 typename internal::CallbackParamTraits<P2>::StorageType,
371 typename internal::CallbackParamTraits<P3>::StorageType,
372 typename internal::CallbackParamTraits<P4>::StorageType,
373 typename internal::CallbackParamTraits<P5>::StorageType,
374 typename internal::CallbackParamTraits<P6>::StorageType)>
375 ::UnboundRunType>
376 Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4,
377 const P5& p5, const P6& p6) {
378 // Typedefs for how to store and run the functor.
379 typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
380 typedef typename internal::FunctorTraits<Functor>::RunType RunType;
382 // Use RunnableType::RunType instead of RunType above because our
383 // checks should below for bound references need to know what the actual
384 // functor is going to interpret the argument as.
385 typedef internal::FunctionTraits<typename RunnableType::RunType>
386 BoundFunctorTraits;
388 // Do not allow binding a non-const reference parameter. Non-const reference
389 // parameters are disallowed by the Google style guide. Also, binding a
390 // non-const reference parameter can make for subtle bugs because the
391 // invoked function will receive a reference to the stored copy of the
392 // argument and not the original.
393 COMPILE_ASSERT(
394 !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
395 is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
396 is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
397 is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
398 is_non_const_reference<typename BoundFunctorTraits::A5Type>::value ||
399 is_non_const_reference<typename BoundFunctorTraits::A6Type>::value ),
400 do_not_bind_functions_with_nonconst_ref);
402 // For methods, we need to be careful for parameter 1. We do not require
403 // a scoped_refptr because BindState<> itself takes care of AddRef() for
404 // methods. We also disallow binding of an array as the method's target
405 // object.
406 COMPILE_ASSERT(
407 internal::HasIsMethodTag<RunnableType>::value ||
408 !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
409 p1_is_refcounted_type_and_needs_scoped_refptr);
410 COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
411 !is_array<P1>::value,
412 first_bound_argument_to_method_cannot_be_array);
413 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
414 p2_is_refcounted_type_and_needs_scoped_refptr);
415 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
416 p3_is_refcounted_type_and_needs_scoped_refptr);
417 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
418 p4_is_refcounted_type_and_needs_scoped_refptr);
419 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
420 p5_is_refcounted_type_and_needs_scoped_refptr);
421 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P6>::value,
422 p6_is_refcounted_type_and_needs_scoped_refptr);
423 typedef internal::BindState<RunnableType, RunType,
424 void(typename internal::CallbackParamTraits<P1>::StorageType,
425 typename internal::CallbackParamTraits<P2>::StorageType,
426 typename internal::CallbackParamTraits<P3>::StorageType,
427 typename internal::CallbackParamTraits<P4>::StorageType,
428 typename internal::CallbackParamTraits<P5>::StorageType,
429 typename internal::CallbackParamTraits<P6>::StorageType)> BindState;
432 return Callback<typename BindState::UnboundRunType>(
433 new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6));
436 template <typename Functor, typename P1, typename P2, typename P3, typename P4,
437 typename P5, typename P6, typename P7>
438 base::Callback<
439 typename internal::BindState<
440 typename internal::FunctorTraits<Functor>::RunnableType,
441 typename internal::FunctorTraits<Functor>::RunType,
442 void(typename internal::CallbackParamTraits<P1>::StorageType,
443 typename internal::CallbackParamTraits<P2>::StorageType,
444 typename internal::CallbackParamTraits<P3>::StorageType,
445 typename internal::CallbackParamTraits<P4>::StorageType,
446 typename internal::CallbackParamTraits<P5>::StorageType,
447 typename internal::CallbackParamTraits<P6>::StorageType,
448 typename internal::CallbackParamTraits<P7>::StorageType)>
449 ::UnboundRunType>
450 Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4,
451 const P5& p5, const P6& p6, const P7& p7) {
452 // Typedefs for how to store and run the functor.
453 typedef typename internal::FunctorTraits<Functor>::RunnableType RunnableType;
454 typedef typename internal::FunctorTraits<Functor>::RunType RunType;
456 // Use RunnableType::RunType instead of RunType above because our
457 // checks should below for bound references need to know what the actual
458 // functor is going to interpret the argument as.
459 typedef internal::FunctionTraits<typename RunnableType::RunType>
460 BoundFunctorTraits;
462 // Do not allow binding a non-const reference parameter. Non-const reference
463 // parameters are disallowed by the Google style guide. Also, binding a
464 // non-const reference parameter can make for subtle bugs because the
465 // invoked function will receive a reference to the stored copy of the
466 // argument and not the original.
467 COMPILE_ASSERT(
468 !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
469 is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
470 is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
471 is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
472 is_non_const_reference<typename BoundFunctorTraits::A5Type>::value ||
473 is_non_const_reference<typename BoundFunctorTraits::A6Type>::value ||
474 is_non_const_reference<typename BoundFunctorTraits::A7Type>::value ),
475 do_not_bind_functions_with_nonconst_ref);
477 // For methods, we need to be careful for parameter 1. We do not require
478 // a scoped_refptr because BindState<> itself takes care of AddRef() for
479 // methods. We also disallow binding of an array as the method's target
480 // object.
481 COMPILE_ASSERT(
482 internal::HasIsMethodTag<RunnableType>::value ||
483 !internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
484 p1_is_refcounted_type_and_needs_scoped_refptr);
485 COMPILE_ASSERT(!internal::HasIsMethodTag<RunnableType>::value ||
486 !is_array<P1>::value,
487 first_bound_argument_to_method_cannot_be_array);
488 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
489 p2_is_refcounted_type_and_needs_scoped_refptr);
490 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
491 p3_is_refcounted_type_and_needs_scoped_refptr);
492 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
493 p4_is_refcounted_type_and_needs_scoped_refptr);
494 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
495 p5_is_refcounted_type_and_needs_scoped_refptr);
496 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P6>::value,
497 p6_is_refcounted_type_and_needs_scoped_refptr);
498 COMPILE_ASSERT(!internal::NeedsScopedRefptrButGetsRawPtr<P7>::value,
499 p7_is_refcounted_type_and_needs_scoped_refptr);
500 typedef internal::BindState<RunnableType, RunType,
501 void(typename internal::CallbackParamTraits<P1>::StorageType,
502 typename internal::CallbackParamTraits<P2>::StorageType,
503 typename internal::CallbackParamTraits<P3>::StorageType,
504 typename internal::CallbackParamTraits<P4>::StorageType,
505 typename internal::CallbackParamTraits<P5>::StorageType,
506 typename internal::CallbackParamTraits<P6>::StorageType,
507 typename internal::CallbackParamTraits<P7>::StorageType)> BindState;
510 return Callback<typename BindState::UnboundRunType>(
511 new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6,
512 p7));
515 } // namespace base
517 #endif // BASE_BIND_H_