mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			576 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			576 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright (c) 2014 Marshall A. Greenblatt. Portions copyright (c) 2011
 | |
| // Google Inc. All rights reserved.
 | |
| //
 | |
| // Redistribution and use in source and binary forms, with or without
 | |
| // modification, are permitted provided that the following conditions are
 | |
| // met:
 | |
| //
 | |
| //    * Redistributions of source code must retain the above copyright
 | |
| // notice, this list of conditions and the following disclaimer.
 | |
| //    * Redistributions in binary form must reproduce the above
 | |
| // copyright notice, this list of conditions and the following disclaimer
 | |
| // in the documentation and/or other materials provided with the
 | |
| // distribution.
 | |
| //    * Neither the name of Google Inc. nor the name Chromium Embedded
 | |
| // Framework nor the names of its contributors may be used to endorse
 | |
| // or promote products derived from this software without specific prior
 | |
| // written permission.
 | |
| //
 | |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
| 
 | |
| #ifndef CEF_INCLUDE_BASE_CEF_BIND_H_
 | |
| #define CEF_INCLUDE_BASE_CEF_BIND_H_
 | |
| #pragma once
 | |
| 
 | |
| #if defined(BASE_BIND_H_)
 | |
| // Do nothing if the Chromium header has already been included.
 | |
| // This can happen in cases where Chromium code is used directly by the
 | |
| // client application. When using Chromium code directly always include
 | |
| // the Chromium header first to avoid type conflicts.
 | |
| #elif defined(USING_CHROMIUM_INCLUDES)
 | |
| // When building CEF include the Chromium header directly.
 | |
| #include "base/bind.h"
 | |
| #else  // !USING_CHROMIUM_INCLUDES
 | |
| // The following is substantially similar to the Chromium implementation.
 | |
| // If the Chromium implementation diverges the below implementation should be
 | |
| // updated to match.
 | |
| 
 | |
| #include "include/base/internal/cef_bind_internal.h"
 | |
| #include "include/base/internal/cef_callback_internal.h"
 | |
| 
 | |
| // -----------------------------------------------------------------------------
 | |
| // Usage documentation
 | |
| // -----------------------------------------------------------------------------
 | |
| //
 | |
| // See base/cef_callback.h for documentation.
 | |
| //
 | |
| //
 | |
| // -----------------------------------------------------------------------------
 | |
| // Implementation notes
 | |
| // -----------------------------------------------------------------------------
 | |
| //
 | |
| // If you're reading the implementation, before proceeding further, you should
 | |
| // read the top comment of base/bind_internal.h for a definition of common
 | |
| // terms and concepts.
 | |
| //
 | |
| // RETURN TYPES
 | |
| //
 | |
| // Though Bind()'s result is meant to be stored in a Callback<> type, it
 | |
| // cannot actually return the exact type without requiring a large amount
 | |
| // of extra template specializations. The problem is that in order to
 | |
| // discern the correct specialization of Callback<>, Bind would need to
 | |
| // unwrap the function signature to determine the signature's arity, and
 | |
| // whether or not it is a method.
 | |
| //
 | |
| // Each unique combination of (arity, function_type, num_prebound) where
 | |
| // function_type is one of {function, method, const_method} would require
 | |
| // one specialization.  We eventually have to do a similar number of
 | |
| // specializations anyways in the implementation (see the Invoker<>,
 | |
| // classes).  However, it is avoidable in Bind if we return the result
 | |
| // via an indirection like we do below.
 | |
| //
 | |
| // TODO(ajwong): We might be able to avoid this now, but need to test.
 | |
| //
 | |
| // It is possible to move most of the COMPILE_ASSERT asserts into BindState<>,
 | |
| // but it feels a little nicer to have the asserts here so people do not
 | |
| // need to crack open bind_internal.h.  On the other hand, it makes Bind()
 | |
| // harder to read.
 | |
| 
 | |
| namespace base {
 | |
| 
 | |
| template <typename Functor>
 | |
| base::Callback<typename cef_internal::BindState<
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunnableType,
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunType,
 | |
|     void()>::UnboundRunType>
 | |
| Bind(Functor functor) {
 | |
|   // Typedefs for how to store and run the functor.
 | |
|   typedef
 | |
|       typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
 | |
|   typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType;
 | |
| 
 | |
|   typedef cef_internal::BindState<RunnableType, RunType, void()> BindState;
 | |
| 
 | |
|   return Callback<typename BindState::UnboundRunType>(
 | |
|       new BindState(cef_internal::MakeRunnable(functor)));
 | |
| }
 | |
| 
 | |
| template <typename Functor, typename P1>
 | |
| base::Callback<typename cef_internal::BindState<
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunnableType,
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunType,
 | |
|     void(typename cef_internal::CallbackParamTraits<P1>::StorageType)>::
 | |
|                    UnboundRunType>
 | |
| Bind(Functor functor, const P1& p1) {
 | |
|   // Typedefs for how to store and run the functor.
 | |
|   typedef
 | |
|       typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
 | |
|   typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType;
 | |
| 
 | |
|   // Use RunnableType::RunType instead of RunType above because our
 | |
|   // checks should below for bound references need to know what the actual
 | |
|   // functor is going to interpret the argument as.
 | |
|   typedef cef_internal::FunctionTraits<typename RunnableType::RunType>
 | |
|       BoundFunctorTraits;
 | |
| 
 | |
|   // Do not allow binding a non-const reference parameter. Non-const reference
 | |
|   // parameters are disallowed by the Google style guide.  Also, binding a
 | |
|   // non-const reference parameter can make for subtle bugs because the
 | |
|   // invoked function will receive a reference to the stored copy of the
 | |
|   // argument and not the original.
 | |
|   COMPILE_ASSERT(
 | |
|       !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value),
 | |
|       do_not_bind_functions_with_nonconst_ref);
 | |
| 
 | |
|   // For methods, we need to be careful for parameter 1.  We do not require
 | |
|   // a scoped_refptr because BindState<> itself takes care of AddRef() for
 | |
|   // methods. We also disallow binding of an array as the method's target
 | |
|   // object.
 | |
|   COMPILE_ASSERT(cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
 | |
|                  p1_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !is_array<P1>::value,
 | |
|                  first_bound_argument_to_method_cannot_be_array);
 | |
|   typedef cef_internal::BindState<
 | |
|       RunnableType, RunType,
 | |
|       void(typename cef_internal::CallbackParamTraits<P1>::StorageType)>
 | |
|       BindState;
 | |
| 
 | |
|   return Callback<typename BindState::UnboundRunType>(
 | |
|       new BindState(cef_internal::MakeRunnable(functor), p1));
 | |
| }
 | |
| 
 | |
| template <typename Functor, typename P1, typename P2>
 | |
| base::Callback<typename cef_internal::BindState<
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunnableType,
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunType,
 | |
|     void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P2>::StorageType)>::
 | |
|                    UnboundRunType>
 | |
| Bind(Functor functor, const P1& p1, const P2& p2) {
 | |
|   // Typedefs for how to store and run the functor.
 | |
|   typedef
 | |
|       typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
 | |
|   typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType;
 | |
| 
 | |
|   // Use RunnableType::RunType instead of RunType above because our
 | |
|   // checks should below for bound references need to know what the actual
 | |
|   // functor is going to interpret the argument as.
 | |
|   typedef cef_internal::FunctionTraits<typename RunnableType::RunType>
 | |
|       BoundFunctorTraits;
 | |
| 
 | |
|   // Do not allow binding a non-const reference parameter. Non-const reference
 | |
|   // parameters are disallowed by the Google style guide.  Also, binding a
 | |
|   // non-const reference parameter can make for subtle bugs because the
 | |
|   // invoked function will receive a reference to the stored copy of the
 | |
|   // argument and not the original.
 | |
|   COMPILE_ASSERT(
 | |
|       !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A2Type>::value),
 | |
|       do_not_bind_functions_with_nonconst_ref);
 | |
| 
 | |
|   // For methods, we need to be careful for parameter 1.  We do not require
 | |
|   // a scoped_refptr because BindState<> itself takes care of AddRef() for
 | |
|   // methods. We also disallow binding of an array as the method's target
 | |
|   // object.
 | |
|   COMPILE_ASSERT(cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
 | |
|                  p1_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !is_array<P1>::value,
 | |
|                  first_bound_argument_to_method_cannot_be_array);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
 | |
|                  p2_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   typedef cef_internal::BindState<
 | |
|       RunnableType, RunType,
 | |
|       void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P2>::StorageType)>
 | |
|       BindState;
 | |
| 
 | |
|   return Callback<typename BindState::UnboundRunType>(
 | |
|       new BindState(cef_internal::MakeRunnable(functor), p1, p2));
 | |
| }
 | |
| 
 | |
| template <typename Functor, typename P1, typename P2, typename P3>
 | |
| base::Callback<typename cef_internal::BindState<
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunnableType,
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunType,
 | |
|     void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P2>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P3>::StorageType)>::
 | |
|                    UnboundRunType>
 | |
| Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3) {
 | |
|   // Typedefs for how to store and run the functor.
 | |
|   typedef
 | |
|       typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
 | |
|   typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType;
 | |
| 
 | |
|   // Use RunnableType::RunType instead of RunType above because our
 | |
|   // checks should below for bound references need to know what the actual
 | |
|   // functor is going to interpret the argument as.
 | |
|   typedef cef_internal::FunctionTraits<typename RunnableType::RunType>
 | |
|       BoundFunctorTraits;
 | |
| 
 | |
|   // Do not allow binding a non-const reference parameter. Non-const reference
 | |
|   // parameters are disallowed by the Google style guide.  Also, binding a
 | |
|   // non-const reference parameter can make for subtle bugs because the
 | |
|   // invoked function will receive a reference to the stored copy of the
 | |
|   // argument and not the original.
 | |
|   COMPILE_ASSERT(
 | |
|       !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A3Type>::value),
 | |
|       do_not_bind_functions_with_nonconst_ref);
 | |
| 
 | |
|   // For methods, we need to be careful for parameter 1.  We do not require
 | |
|   // a scoped_refptr because BindState<> itself takes care of AddRef() for
 | |
|   // methods. We also disallow binding of an array as the method's target
 | |
|   // object.
 | |
|   COMPILE_ASSERT(cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
 | |
|                  p1_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !is_array<P1>::value,
 | |
|                  first_bound_argument_to_method_cannot_be_array);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
 | |
|                  p2_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
 | |
|                  p3_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   typedef cef_internal::BindState<
 | |
|       RunnableType, RunType,
 | |
|       void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P2>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P3>::StorageType)>
 | |
|       BindState;
 | |
| 
 | |
|   return Callback<typename BindState::UnboundRunType>(
 | |
|       new BindState(cef_internal::MakeRunnable(functor), p1, p2, p3));
 | |
| }
 | |
| 
 | |
| template <typename Functor, typename P1, typename P2, typename P3, typename P4>
 | |
| base::Callback<typename cef_internal::BindState<
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunnableType,
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunType,
 | |
|     void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P2>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P3>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P4>::StorageType)>::
 | |
|                    UnboundRunType>
 | |
| Bind(Functor functor, const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
 | |
|   // Typedefs for how to store and run the functor.
 | |
|   typedef
 | |
|       typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
 | |
|   typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType;
 | |
| 
 | |
|   // Use RunnableType::RunType instead of RunType above because our
 | |
|   // checks should below for bound references need to know what the actual
 | |
|   // functor is going to interpret the argument as.
 | |
|   typedef cef_internal::FunctionTraits<typename RunnableType::RunType>
 | |
|       BoundFunctorTraits;
 | |
| 
 | |
|   // Do not allow binding a non-const reference parameter. Non-const reference
 | |
|   // parameters are disallowed by the Google style guide.  Also, binding a
 | |
|   // non-const reference parameter can make for subtle bugs because the
 | |
|   // invoked function will receive a reference to the stored copy of the
 | |
|   // argument and not the original.
 | |
|   COMPILE_ASSERT(
 | |
|       !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A4Type>::value),
 | |
|       do_not_bind_functions_with_nonconst_ref);
 | |
| 
 | |
|   // For methods, we need to be careful for parameter 1.  We do not require
 | |
|   // a scoped_refptr because BindState<> itself takes care of AddRef() for
 | |
|   // methods. We also disallow binding of an array as the method's target
 | |
|   // object.
 | |
|   COMPILE_ASSERT(cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
 | |
|                  p1_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !is_array<P1>::value,
 | |
|                  first_bound_argument_to_method_cannot_be_array);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
 | |
|                  p2_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
 | |
|                  p3_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
 | |
|                  p4_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   typedef cef_internal::BindState<
 | |
|       RunnableType, RunType,
 | |
|       void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P2>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P3>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P4>::StorageType)>
 | |
|       BindState;
 | |
| 
 | |
|   return Callback<typename BindState::UnboundRunType>(
 | |
|       new BindState(cef_internal::MakeRunnable(functor), p1, p2, p3, p4));
 | |
| }
 | |
| 
 | |
| template <typename Functor,
 | |
|           typename P1,
 | |
|           typename P2,
 | |
|           typename P3,
 | |
|           typename P4,
 | |
|           typename P5>
 | |
| base::Callback<typename cef_internal::BindState<
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunnableType,
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunType,
 | |
|     void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P2>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P3>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P4>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P5>::StorageType)>::
 | |
|                    UnboundRunType>
 | |
| Bind(Functor functor,
 | |
|      const P1& p1,
 | |
|      const P2& p2,
 | |
|      const P3& p3,
 | |
|      const P4& p4,
 | |
|      const P5& p5) {
 | |
|   // Typedefs for how to store and run the functor.
 | |
|   typedef
 | |
|       typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
 | |
|   typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType;
 | |
| 
 | |
|   // Use RunnableType::RunType instead of RunType above because our
 | |
|   // checks should below for bound references need to know what the actual
 | |
|   // functor is going to interpret the argument as.
 | |
|   typedef cef_internal::FunctionTraits<typename RunnableType::RunType>
 | |
|       BoundFunctorTraits;
 | |
| 
 | |
|   // Do not allow binding a non-const reference parameter. Non-const reference
 | |
|   // parameters are disallowed by the Google style guide.  Also, binding a
 | |
|   // non-const reference parameter can make for subtle bugs because the
 | |
|   // invoked function will receive a reference to the stored copy of the
 | |
|   // argument and not the original.
 | |
|   COMPILE_ASSERT(
 | |
|       !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A5Type>::value),
 | |
|       do_not_bind_functions_with_nonconst_ref);
 | |
| 
 | |
|   // For methods, we need to be careful for parameter 1.  We do not require
 | |
|   // a scoped_refptr because BindState<> itself takes care of AddRef() for
 | |
|   // methods. We also disallow binding of an array as the method's target
 | |
|   // object.
 | |
|   COMPILE_ASSERT(cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
 | |
|                  p1_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !is_array<P1>::value,
 | |
|                  first_bound_argument_to_method_cannot_be_array);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
 | |
|                  p2_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
 | |
|                  p3_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
 | |
|                  p4_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
 | |
|                  p5_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   typedef cef_internal::BindState<
 | |
|       RunnableType, RunType,
 | |
|       void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P2>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P3>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P4>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P5>::StorageType)>
 | |
|       BindState;
 | |
| 
 | |
|   return Callback<typename BindState::UnboundRunType>(
 | |
|       new BindState(cef_internal::MakeRunnable(functor), p1, p2, p3, p4, p5));
 | |
| }
 | |
| 
 | |
| template <typename Functor,
 | |
|           typename P1,
 | |
|           typename P2,
 | |
|           typename P3,
 | |
|           typename P4,
 | |
|           typename P5,
 | |
|           typename P6>
 | |
| base::Callback<typename cef_internal::BindState<
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunnableType,
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunType,
 | |
|     void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P2>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P3>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P4>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P5>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P6>::StorageType)>::
 | |
|                    UnboundRunType>
 | |
| Bind(Functor functor,
 | |
|      const P1& p1,
 | |
|      const P2& p2,
 | |
|      const P3& p3,
 | |
|      const P4& p4,
 | |
|      const P5& p5,
 | |
|      const P6& p6) {
 | |
|   // Typedefs for how to store and run the functor.
 | |
|   typedef
 | |
|       typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
 | |
|   typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType;
 | |
| 
 | |
|   // Use RunnableType::RunType instead of RunType above because our
 | |
|   // checks should below for bound references need to know what the actual
 | |
|   // functor is going to interpret the argument as.
 | |
|   typedef cef_internal::FunctionTraits<typename RunnableType::RunType>
 | |
|       BoundFunctorTraits;
 | |
| 
 | |
|   // Do not allow binding a non-const reference parameter. Non-const reference
 | |
|   // parameters are disallowed by the Google style guide.  Also, binding a
 | |
|   // non-const reference parameter can make for subtle bugs because the
 | |
|   // invoked function will receive a reference to the stored copy of the
 | |
|   // argument and not the original.
 | |
|   COMPILE_ASSERT(
 | |
|       !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A5Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A6Type>::value),
 | |
|       do_not_bind_functions_with_nonconst_ref);
 | |
| 
 | |
|   // For methods, we need to be careful for parameter 1.  We do not require
 | |
|   // a scoped_refptr because BindState<> itself takes care of AddRef() for
 | |
|   // methods. We also disallow binding of an array as the method's target
 | |
|   // object.
 | |
|   COMPILE_ASSERT(cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
 | |
|                  p1_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !is_array<P1>::value,
 | |
|                  first_bound_argument_to_method_cannot_be_array);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
 | |
|                  p2_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
 | |
|                  p3_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
 | |
|                  p4_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
 | |
|                  p5_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P6>::value,
 | |
|                  p6_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   typedef cef_internal::BindState<
 | |
|       RunnableType, RunType,
 | |
|       void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P2>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P3>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P4>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P5>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P6>::StorageType)>
 | |
|       BindState;
 | |
| 
 | |
|   return Callback<typename BindState::UnboundRunType>(new BindState(
 | |
|       cef_internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6));
 | |
| }
 | |
| 
 | |
| template <typename Functor,
 | |
|           typename P1,
 | |
|           typename P2,
 | |
|           typename P3,
 | |
|           typename P4,
 | |
|           typename P5,
 | |
|           typename P6,
 | |
|           typename P7>
 | |
| base::Callback<typename cef_internal::BindState<
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunnableType,
 | |
|     typename cef_internal::FunctorTraits<Functor>::RunType,
 | |
|     void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P2>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P3>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P4>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P5>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P6>::StorageType,
 | |
|          typename cef_internal::CallbackParamTraits<P7>::StorageType)>::
 | |
|                    UnboundRunType>
 | |
| Bind(Functor functor,
 | |
|      const P1& p1,
 | |
|      const P2& p2,
 | |
|      const P3& p3,
 | |
|      const P4& p4,
 | |
|      const P5& p5,
 | |
|      const P6& p6,
 | |
|      const P7& p7) {
 | |
|   // Typedefs for how to store and run the functor.
 | |
|   typedef
 | |
|       typename cef_internal::FunctorTraits<Functor>::RunnableType RunnableType;
 | |
|   typedef typename cef_internal::FunctorTraits<Functor>::RunType RunType;
 | |
| 
 | |
|   // Use RunnableType::RunType instead of RunType above because our
 | |
|   // checks should below for bound references need to know what the actual
 | |
|   // functor is going to interpret the argument as.
 | |
|   typedef cef_internal::FunctionTraits<typename RunnableType::RunType>
 | |
|       BoundFunctorTraits;
 | |
| 
 | |
|   // Do not allow binding a non-const reference parameter. Non-const reference
 | |
|   // parameters are disallowed by the Google style guide.  Also, binding a
 | |
|   // non-const reference parameter can make for subtle bugs because the
 | |
|   // invoked function will receive a reference to the stored copy of the
 | |
|   // argument and not the original.
 | |
|   COMPILE_ASSERT(
 | |
|       !(is_non_const_reference<typename BoundFunctorTraits::A1Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A2Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A3Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A4Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A5Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A6Type>::value ||
 | |
|         is_non_const_reference<typename BoundFunctorTraits::A7Type>::value),
 | |
|       do_not_bind_functions_with_nonconst_ref);
 | |
| 
 | |
|   // For methods, we need to be careful for parameter 1.  We do not require
 | |
|   // a scoped_refptr because BindState<> itself takes care of AddRef() for
 | |
|   // methods. We also disallow binding of an array as the method's target
 | |
|   // object.
 | |
|   COMPILE_ASSERT(cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !cef_internal::NeedsScopedRefptrButGetsRawPtr<P1>::value,
 | |
|                  p1_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::HasIsMethodTag<RunnableType>::value ||
 | |
|                      !is_array<P1>::value,
 | |
|                  first_bound_argument_to_method_cannot_be_array);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P2>::value,
 | |
|                  p2_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P3>::value,
 | |
|                  p3_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P4>::value,
 | |
|                  p4_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P5>::value,
 | |
|                  p5_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P6>::value,
 | |
|                  p6_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   COMPILE_ASSERT(!cef_internal::NeedsScopedRefptrButGetsRawPtr<P7>::value,
 | |
|                  p7_is_refcounted_type_and_needs_scoped_refptr);
 | |
|   typedef cef_internal::BindState<
 | |
|       RunnableType, RunType,
 | |
|       void(typename cef_internal::CallbackParamTraits<P1>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P2>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P3>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P4>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P5>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P6>::StorageType,
 | |
|            typename cef_internal::CallbackParamTraits<P7>::StorageType)>
 | |
|       BindState;
 | |
| 
 | |
|   return Callback<typename BindState::UnboundRunType>(new BindState(
 | |
|       cef_internal::MakeRunnable(functor), p1, p2, p3, p4, p5, p6, p7));
 | |
| }
 | |
| 
 | |
| }  // namespace base
 | |
| 
 | |
| #endif  // !USING_CHROMIUM_INCLUDES
 | |
| 
 | |
| #endif  // CEF_INCLUDE_BASE_CEF_BIND_H_
 |