| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_BIND_INTERNAL_H_ | 5 #ifndef BASE_BIND_INTERNAL_H_ |
| 6 #define BASE_BIND_INTERNAL_H_ | 6 #define BASE_BIND_INTERNAL_H_ |
| 7 | 7 |
| 8 #include <type_traits> | 8 #include <type_traits> |
| 9 | 9 |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 // call by including a typedef named IsMethod. The value of | 32 // call by including a typedef named IsMethod. The value of |
| 33 // this typedef is NOT inspected, only the existence. When a | 33 // this typedef is NOT inspected, only the existence. When a |
| 34 // Runnable declares itself a method, Bind() will enforce special | 34 // Runnable declares itself a method, Bind() will enforce special |
| 35 // refcounting + WeakPtr handling semantics for the first | 35 // refcounting + WeakPtr handling semantics for the first |
| 36 // parameter which is expected to be an object. | 36 // parameter which is expected to be an object. |
| 37 // Functor -- A copyable type representing something that should be called. | 37 // Functor -- A copyable type representing something that should be called. |
| 38 // All function pointers, Callback<>, and Runnables are functors | 38 // All function pointers, Callback<>, and Runnables are functors |
| 39 // even if the invocation syntax differs. | 39 // even if the invocation syntax differs. |
| 40 // RunType -- A function type (as opposed to function _pointer_ type) for | 40 // RunType -- A function type (as opposed to function _pointer_ type) for |
| 41 // a Run() function. Usually just a convenience typedef. | 41 // a Run() function. Usually just a convenience typedef. |
| 42 // (Bound)ArgsType -- A function type that is being (ab)used to store the | 42 // (Bound)Args -- A set of types that stores the arguments. |
| 43 // types of set of arguments. The "return" type is always | |
| 44 // void here. We use this hack so that we do not need | |
| 45 // a new type name for each arity of type. (eg., | |
| 46 // BindState1, BindState2). This makes forward | |
| 47 // declarations and friending much much easier. | |
| 48 // | 43 // |
| 49 // Types: | 44 // Types: |
| 50 // RunnableAdapter<> -- Wraps the various "function" pointer types into an | 45 // RunnableAdapter<> -- Wraps the various "function" pointer types into an |
| 51 // object that adheres to the Runnable interface. | 46 // object that adheres to the Runnable interface. |
| 52 // ForceVoidReturn<> -- Helper class for translating function signatures to | 47 // ForceVoidReturn<> -- Helper class for translating function signatures to |
| 53 // equivalent forms with a "void" return type. | 48 // equivalent forms with a "void" return type. |
| 54 // FunctorTraits<> -- Type traits used determine the correct RunType and | 49 // FunctorTraits<> -- Type traits used determine the correct RunType and |
| 55 // RunnableType for a Functor. This is where function | 50 // RunnableType for a Functor. This is where function |
| 56 // signature adapters are applied. | 51 // signature adapters are applied. |
| 57 // MakeRunnable<> -- Takes a Functor and returns an object in the Runnable | 52 // MakeRunnable<> -- Takes a Functor and returns an object in the Runnable |
| 58 // type class that represents the underlying Functor. | 53 // type class that represents the underlying Functor. |
| 59 // There are |O(1)| MakeRunnable types. | |
| 60 // InvokeHelper<> -- Take a Runnable + arguments and actully invokes it. | 54 // InvokeHelper<> -- Take a Runnable + arguments and actully invokes it. |
| 61 // Handle the differing syntaxes needed for WeakPtr<> | 55 // Handle the differing syntaxes needed for WeakPtr<> |
| 62 // support, and for ignoring return values. This is separate | 56 // support, and for ignoring return values. This is separate |
| 63 // from Invoker to avoid creating multiple version of | 57 // from Invoker to avoid creating multiple version of |
| 64 // Invoker<>. | 58 // Invoker<>. |
| 65 // Invoker<> -- Unwraps the curried parameters and executes the Runnable. | 59 // Invoker<> -- Unwraps the curried parameters and executes the Runnable. |
| 66 // BindState<> -- Stores the curried parameters, and is the main entry point | 60 // BindState<> -- Stores the curried parameters, and is the main entry point |
| 67 // into the Bind() system, doing most of the type resolution. | 61 // into the Bind() system, doing most of the type resolution. |
| 68 // There are ARITY BindState types. | 62 // There are ARITY BindState types. |
| 69 | 63 |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 // BindState<> | 347 // BindState<> |
| 354 // | 348 // |
| 355 // This stores all the state passed into Bind() and is also where most | 349 // This stores all the state passed into Bind() and is also where most |
| 356 // of the template resolution magic occurs. | 350 // of the template resolution magic occurs. |
| 357 // | 351 // |
| 358 // Runnable is the functor we are binding arguments to. | 352 // Runnable is the functor we are binding arguments to. |
| 359 // RunType is type of the Run() function that the Invoker<> should use. | 353 // RunType is type of the Run() function that the Invoker<> should use. |
| 360 // Normally, this is the same as the RunType of the Runnable, but it can | 354 // Normally, this is the same as the RunType of the Runnable, but it can |
| 361 // be different if an adapter like IgnoreResult() has been used. | 355 // be different if an adapter like IgnoreResult() has been used. |
| 362 // | 356 // |
| 363 // BoundArgsType contains the storage type for all the bound arguments by | 357 // BoundArgs contains the storage type for all the bound arguments. |
| 364 // (ab)using a function type. | 358 template <typename Runnable, typename RunType, typename... BoundArgs> |
| 365 template <typename Runnable, typename RunType, typename BoundArgList> | |
| 366 struct BindState; | 359 struct BindState; |
| 367 | 360 |
| 368 template <typename Runnable, | 361 template <typename Runnable, |
| 369 typename R, | 362 typename R, |
| 370 typename... Args, | 363 typename... Args, |
| 371 typename... BoundArgs> | 364 typename... BoundArgs> |
| 372 struct BindState<Runnable, R(Args...), TypeList<BoundArgs...>> final | 365 struct BindState<Runnable, R(Args...), BoundArgs...> final |
| 373 : public BindStateBase { | 366 : public BindStateBase { |
| 374 private: | 367 private: |
| 375 using StorageType = BindState<Runnable, R(Args...), TypeList<BoundArgs...>>; | 368 using StorageType = BindState<Runnable, R(Args...), BoundArgs...>; |
| 376 using RunnableType = Runnable; | 369 using RunnableType = Runnable; |
| 377 | 370 |
| 378 // true_type if Runnable is a method invocation and the first bound argument | 371 // true_type if Runnable is a method invocation and the first bound argument |
| 379 // is a WeakPtr. | 372 // is a WeakPtr. |
| 380 using IsWeakCall = | 373 using IsWeakCall = |
| 381 IsWeakMethod<HasIsMethodTag<Runnable>::value, BoundArgs...>; | 374 IsWeakMethod<HasIsMethodTag<Runnable>::value, BoundArgs...>; |
| 382 | 375 |
| 383 using BoundIndices = MakeIndexSequence<sizeof...(BoundArgs)>; | 376 using BoundIndices = MakeIndexSequence<sizeof...(BoundArgs)>; |
| 384 using Unwrappers = TypeList<UnwrapTraits<BoundArgs>...>; | 377 using Unwrappers = TypeList<UnwrapTraits<BoundArgs>...>; |
| 385 using UnboundForwardArgs = DropTypeListItem< | 378 using UnboundForwardArgs = DropTypeListItem< |
| (...skipping 29 matching lines...) Expand all Loading... |
| 415 | 408 |
| 416 static void Destroy(BindStateBase* self) { | 409 static void Destroy(BindStateBase* self) { |
| 417 delete static_cast<BindState*>(self); | 410 delete static_cast<BindState*>(self); |
| 418 } | 411 } |
| 419 }; | 412 }; |
| 420 | 413 |
| 421 } // namespace internal | 414 } // namespace internal |
| 422 } // namespace base | 415 } // namespace base |
| 423 | 416 |
| 424 #endif // BASE_BIND_INTERNAL_H_ | 417 #endif // BASE_BIND_INTERNAL_H_ |
| OLD | NEW |