| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_BIND_H_ |
| #define BASE_BIND_H_ |
| |
| #include "base/bind_internal.h" |
| |
| // ----------------------------------------------------------------------------- |
| // Usage documentation |
| // ----------------------------------------------------------------------------- |
| // |
| // See //docs/callback.md 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. |
| |
| namespace base { |
| |
| // Bind as OnceCallback. |
| template <typename Functor, typename... Args> |
| inline OnceCallback<MakeUnboundRunType<Functor, Args...>> |
| BindOnce(Functor&& functor, Args&&... args) { |
| using BindState = internal::MakeBindStateType<Functor, Args...>; |
| using UnboundRunType = MakeUnboundRunType<Functor, Args...>; |
| using Invoker = internal::Invoker<BindState, UnboundRunType>; |
| using CallbackType = OnceCallback<UnboundRunType>; |
| |
| // Store the invoke func into PolymorphicInvoke before casting it to |
| // InvokeFuncStorage, so that we can ensure its type matches to |
| // PolymorphicInvoke, to which CallbackType will cast back. |
| using PolymorphicInvoke = typename CallbackType::PolymorphicInvoke; |
| PolymorphicInvoke invoke_func = &Invoker::RunOnce; |
| |
| using InvokeFuncStorage = internal::BindStateBase::InvokeFuncStorage; |
| return CallbackType(new BindState( |
| reinterpret_cast<InvokeFuncStorage>(invoke_func), |
| std::forward<Functor>(functor), |
| std::forward<Args>(args)...)); |
| } |
| |
| // Bind as RepeatingCallback. |
| template <typename Functor, typename... Args> |
| inline RepeatingCallback<MakeUnboundRunType<Functor, Args...>> |
| BindRepeating(Functor&& functor, Args&&... args) { |
| using BindState = internal::MakeBindStateType<Functor, Args...>; |
| using UnboundRunType = MakeUnboundRunType<Functor, Args...>; |
| using Invoker = internal::Invoker<BindState, UnboundRunType>; |
| using CallbackType = RepeatingCallback<UnboundRunType>; |
| |
| // Store the invoke func into PolymorphicInvoke before casting it to |
| // InvokeFuncStorage, so that we can ensure its type matches to |
| // PolymorphicInvoke, to which CallbackType will cast back. |
| using PolymorphicInvoke = typename CallbackType::PolymorphicInvoke; |
| PolymorphicInvoke invoke_func = &Invoker::Run; |
| |
| using InvokeFuncStorage = internal::BindStateBase::InvokeFuncStorage; |
| return CallbackType(new BindState( |
| reinterpret_cast<InvokeFuncStorage>(invoke_func), |
| std::forward<Functor>(functor), |
| std::forward<Args>(args)...)); |
| } |
| |
| // Unannotated Bind. |
| // TODO(tzik): Deprecate this and migrate to OnceCallback and |
| // RepeatingCallback, once they get ready. |
| template <typename Functor, typename... Args> |
| inline Callback<MakeUnboundRunType<Functor, Args...>> |
| Bind(Functor&& functor, Args&&... args) { |
| return BindRepeating(std::forward<Functor>(functor), |
| std::forward<Args>(args)...); |
| } |
| |
| } // namespace base |
| |
| #endif // BASE_BIND_H_ |