Home | History | Annotate | Download | only in base
      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   // 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;
     73 
     74   typedef internal::BindState<RunnableType, RunType, void()> BindState;
     75 
     76 
     77   return Callback<typename BindState::UnboundRunType>(
     78       new BindState(internal::MakeRunnable(functor)));
     79 }
     80 
     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;
     92 
     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;
     98 
     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);
    107 
    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;
    121 
    122 
    123   return Callback<typename BindState::UnboundRunType>(
    124       new BindState(internal::MakeRunnable(functor), p1));
    125 }
    126 
    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;
    139 
    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;
    145 
    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);
    155 
    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;
    172 
    173 
    174   return Callback<typename BindState::UnboundRunType>(
    175       new BindState(internal::MakeRunnable(functor), p1, p2));
    176 }
    177 
    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;
    191 
    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;
    197 
    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);
    208 
    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;
    228 
    229 
    230   return Callback<typename BindState::UnboundRunType>(
    231       new BindState(internal::MakeRunnable(functor), p1, p2, p3));
    232 }
    233 
    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;
    248 
    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;
    254 
    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);
    266 
    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;
    289 
    290 
    291   return Callback<typename BindState::UnboundRunType>(
    292       new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4));
    293 }
    294 
    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;
    312 
    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;
    318 
    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);
    331 
    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;
    357 
    358 
    359   return Callback<typename BindState::UnboundRunType>(
    360       new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5));
    361 }
    362 
    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;
    381 
    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;
    387 
    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);
    401 
    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;
    430 
    431 
    432   return Callback<typename BindState::UnboundRunType>(
    433       new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6));
    434 }
    435 
    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;
    455 
    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;
    461 
    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);
    476 
    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;
    508 
    509 
    510   return Callback<typename BindState::UnboundRunType>(
    511       new BindState(internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6,
    512           p7));
    513 }
    514 
    515 }  // namespace base
    516 
    517 #endif  // BASE_BIND_H_
    518