1 // This file was GENERATED by command: 2 // pump.py bind.h.pump 3 // DO NOT EDIT BY HAND!!! 4 5 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. 9 10 #ifndef BASE_BIND_H_ 11 #define BASE_BIND_H_ 12 13 #include "base/bind_internal.h" 14 #include "base/callback_internal.h" 15 16 // ----------------------------------------------------------------------------- 17 // Usage documentation 18 // ----------------------------------------------------------------------------- 19 // 20 // See base/callback.h for documentation. 21 // 22 // 23 // ----------------------------------------------------------------------------- 24 // Implementation notes 25 // ----------------------------------------------------------------------------- 26 // 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. 30 // 31 // RETURN TYPES 32 // 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. 39 // 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. 46 // 47 // TODO(ajwong): We might be able to avoid this now, but need to test. 48 // 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. 53 54 namespace base { 55 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; 67 68 typedef internal::BindState<RunnableType, RunType, void()> BindState; 69 70 71 return Callback<typename BindState::UnboundRunType>( 72 new BindState(internal::MakeRunnable(functor))); 73 } 74 75 template <typename Functor, typename P1> 76 base::Callback< 77 typename internal::BindState< 78 typename internal::FunctorTraits<Functor>::RunnableType, 79 typename internal::FunctorTraits<Functor>::RunType, 80 void(typename internal::CallbackParamTraits<P1>::StorageType)> 81 ::UnboundRunType> 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; 86 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> 91 BoundFunctorTraits; 92 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. 98 COMPILE_ASSERT( 99 !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ), 100 do_not_bind_functions_with_nonconst_ref); 101 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 105 // object. 106 COMPILE_ASSERT( 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; 115 116 117 return Callback<typename BindState::UnboundRunType>( 118 new BindState(internal::MakeRunnable(functor), p1)); 119 } 120 121 template <typename Functor, typename P1, typename P2> 122 base::Callback< 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)> 128 ::UnboundRunType> 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; 133 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> 138 BoundFunctorTraits; 139 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. 145 COMPILE_ASSERT( 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); 149 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 153 // object. 154 COMPILE_ASSERT( 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; 166 167 168 return Callback<typename BindState::UnboundRunType>( 169 new BindState(internal::MakeRunnable(functor), p1, p2)); 170 } 171 172 template <typename Functor, typename P1, typename P2, typename P3> 173 base::Callback< 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)> 180 ::UnboundRunType> 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; 185 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> 190 BoundFunctorTraits; 191 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. 197 COMPILE_ASSERT( 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); 202 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 206 // object. 207 COMPILE_ASSERT( 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; 222 223 224 return Callback<typename BindState::UnboundRunType>( 225 new BindState(internal::MakeRunnable(functor), p1, p2, p3)); 226 } 227 228 template <typename Functor, typename P1, typename P2, typename P3, typename P4> 229 base::Callback< 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)> 237 ::UnboundRunType> 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; 242 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> 247 BoundFunctorTraits; 248 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. 254 COMPILE_ASSERT( 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); 260 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 264 // object. 265 COMPILE_ASSERT( 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; 283 284 285 return Callback<typename BindState::UnboundRunType>( 286 new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4)); 287 } 288 289 template <typename Functor, typename P1, typename P2, typename P3, typename P4, 290 typename P5> 291 base::Callback< 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)> 300 ::UnboundRunType> 301 Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4, 302 const P5& p5) { 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; 306 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> 311 BoundFunctorTraits; 312 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. 318 COMPILE_ASSERT( 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); 325 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 329 // object. 330 COMPILE_ASSERT( 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; 351 352 353 return Callback<typename BindState::UnboundRunType>( 354 new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5)); 355 } 356 357 template <typename Functor, typename P1, typename P2, typename P3, typename P4, 358 typename P5, typename P6> 359 base::Callback< 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)> 369 ::UnboundRunType> 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; 375 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> 380 BoundFunctorTraits; 381 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. 387 COMPILE_ASSERT( 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); 395 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 399 // object. 400 COMPILE_ASSERT( 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; 424 425 426 return Callback<typename BindState::UnboundRunType>( 427 new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6)); 428 } 429 430 template <typename Functor, typename P1, typename P2, typename P3, typename P4, 431 typename P5, typename P6, typename P7> 432 base::Callback< 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)> 443 ::UnboundRunType> 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; 449 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> 454 BoundFunctorTraits; 455 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. 461 COMPILE_ASSERT( 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); 470 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 474 // object. 475 COMPILE_ASSERT( 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; 502 503 504 return Callback<typename BindState::UnboundRunType>( 505 new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6, 506 p7)); 507 } 508 509 } // namespace base 510 511 #endif // BASE_BIND_H_ 512