| 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 "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/callback_internal.h" | 9 #include "base/callback_internal.h" |
| 10 #include "base/memory/raw_scoped_refptr_mismatch_checker.h" | 10 #include "base/memory/raw_scoped_refptr_mismatch_checker.h" |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 // RunType is type of the Run() function that the Invoker<> should use. | 357 // RunType is type of the Run() function that the Invoker<> should use. |
| 358 // Normally, this is the same as the RunType of the Runnable, but it can | 358 // Normally, this is the same as the RunType of the Runnable, but it can |
| 359 // be different if an adapter like IgnoreResult() has been used. | 359 // be different if an adapter like IgnoreResult() has been used. |
| 360 // | 360 // |
| 361 // BoundArgsType contains the storage type for all the bound arguments by | 361 // BoundArgsType contains the storage type for all the bound arguments by |
| 362 // (ab)using a function type. | 362 // (ab)using a function type. |
| 363 template <typename Runnable, typename RunType, typename BoundArgList> | 363 template <typename Runnable, typename RunType, typename BoundArgList> |
| 364 struct BindState; | 364 struct BindState; |
| 365 | 365 |
| 366 template <typename Runnable, | 366 template <typename Runnable, |
| 367 typename R, typename... Args, | 367 typename R, |
| 368 typename... Args, |
| 368 typename... BoundArgs> | 369 typename... BoundArgs> |
| 369 struct BindState<Runnable, R(Args...), TypeList<BoundArgs...>> | 370 struct BindState<Runnable, R(Args...), TypeList<BoundArgs...>> final |
| 370 : public BindStateBase { | 371 : public BindStateBase { |
| 371 private: | 372 private: |
| 372 using StorageType = BindState<Runnable, R(Args...), TypeList<BoundArgs...>>; | 373 using StorageType = BindState<Runnable, R(Args...), TypeList<BoundArgs...>>; |
| 373 using RunnableType = Runnable; | 374 using RunnableType = Runnable; |
| 374 | 375 |
| 375 // true_type if Runnable is a method invocation and the first bound argument | 376 // true_type if Runnable is a method invocation and the first bound argument |
| 376 // is a WeakPtr. | 377 // is a WeakPtr. |
| 377 using IsWeakCall = | 378 using IsWeakCall = |
| 378 IsWeakMethod<HasIsMethodTag<Runnable>::value, BoundArgs...>; | 379 IsWeakMethod<HasIsMethodTag<Runnable>::value, BoundArgs...>; |
| 379 | 380 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 391 InvokeHelper<IsWeakCall::value, R, Runnable, InvokeHelperArgs>; | 392 InvokeHelper<IsWeakCall::value, R, Runnable, InvokeHelperArgs>; |
| 392 | 393 |
| 393 using UnboundArgs = DropTypeListItem<sizeof...(BoundArgs), TypeList<Args...>>; | 394 using UnboundArgs = DropTypeListItem<sizeof...(BoundArgs), TypeList<Args...>>; |
| 394 | 395 |
| 395 public: | 396 public: |
| 396 using InvokerType = Invoker<BoundIndices, StorageType, Unwrappers, | 397 using InvokerType = Invoker<BoundIndices, StorageType, Unwrappers, |
| 397 InvokeHelperType, UnboundForwardRunType>; | 398 InvokeHelperType, UnboundForwardRunType>; |
| 398 using UnboundRunType = MakeFunctionType<R, UnboundArgs>; | 399 using UnboundRunType = MakeFunctionType<R, UnboundArgs>; |
| 399 | 400 |
| 400 BindState(const Runnable& runnable, const BoundArgs&... bound_args) | 401 BindState(const Runnable& runnable, const BoundArgs&... bound_args) |
| 401 : runnable_(runnable), ref_(bound_args...), bound_args_(bound_args...) {} | 402 : BindStateBase(&Destroy), |
| 403 runnable_(runnable), |
| 404 ref_(bound_args...), |
| 405 bound_args_(bound_args...) {} |
| 402 | 406 |
| 403 RunnableType runnable_; | 407 RunnableType runnable_; |
| 404 MaybeScopedRefPtr<HasIsMethodTag<Runnable>::value, BoundArgs...> ref_; | 408 MaybeScopedRefPtr<HasIsMethodTag<Runnable>::value, BoundArgs...> ref_; |
| 405 Tuple<BoundArgs...> bound_args_; | 409 Tuple<BoundArgs...> bound_args_; |
| 406 | 410 |
| 407 private: | 411 private: |
| 408 ~BindState() override {} | 412 ~BindState() {} |
| 413 |
| 414 static void Destroy(BindStateBase* self) { |
| 415 delete static_cast<BindState*>(self); |
| 416 } |
| 409 }; | 417 }; |
| 410 | 418 |
| 411 } // namespace internal | 419 } // namespace internal |
| 412 } // namespace base | 420 } // namespace base |
| 413 | 421 |
| 414 #endif // BASE_BIND_INTERNAL_H_ | 422 #endif // BASE_BIND_INTERNAL_H_ |
| OLD | NEW |