diff options
author | tzik <tzik@chromium.org> | 2016-02-15 12:51:34 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-15 20:53:12 +0000 |
commit | 6ba91a9df7cb8e3fee614639c1ecb5af3f68f807 (patch) | |
tree | 8ff453d34e1f0b80ce561a57ed35836b4e9fa57b | |
parent | 0d2610f23f93aefa30d585d6c26688be110a8034 (diff) | |
download | chromium_src-6ba91a9df7cb8e3fee614639c1ecb5af3f68f807.zip chromium_src-6ba91a9df7cb8e3fee614639c1ecb5af3f68f807.tar.gz chromium_src-6ba91a9df7cb8e3fee614639c1ecb5af3f68f807.tar.bz2 |
Use Perfect Forwarding where possible in bind_internals.h
Most of CallbackForward and CallbackParamTraits in bind_internals.h can
be replaced with Universal References and Perfect Forwarding.
This CL applies the replacement as possible as there's no runtime cost.
BUG=554299
Review URL: https://codereview.chromium.org/1701633002
Cr-Commit-Position: refs/heads/master@{#375488}
-rw-r--r-- | base/bind_internal.h | 59 |
1 files changed, 30 insertions, 29 deletions
diff --git a/base/bind_internal.h b/base/bind_internal.h index ce6b5d6..90889d5 100644 --- a/base/bind_internal.h +++ b/base/bind_internal.h @@ -154,8 +154,9 @@ class RunnableAdapter<R(*)(Args...)> { : function_(function) { } - R Run(typename CallbackParamTraits<Args>::ForwardType... args) { - return function_(CallbackForward(args)...); + template <typename... RunArgs> + R Run(RunArgs&&... args) { + return function_(std::forward<RunArgs>(args)...); } private: @@ -175,8 +176,9 @@ class RunnableAdapter<R(T::*)(Args...)> { : method_(method) { } - R Run(T* object, typename CallbackParamTraits<Args>::ForwardType... args) { - return (object->*method_)(CallbackForward(args)...); + template <typename... RunArgs> + R Run(T* object, RunArgs&&... args) { + return (object->*method_)(std::forward<RunArgs>(args)...); } private: @@ -194,9 +196,9 @@ class RunnableAdapter<R(T::*)(Args...) const> { : method_(method) { } - R Run(const T* object, - typename CallbackParamTraits<Args>::ForwardType... args) { - return (object->*method_)(CallbackForward(args)...); + template <typename... RunArgs> + R Run(const T* object, RunArgs&&... args) { + return (object->*method_)(std::forward<RunArgs>(args)...); } private: @@ -281,38 +283,42 @@ MakeRunnable(const Callback<T>& t) { // // WeakCalls similarly need special syntax that is applied to the first // argument to check if they should no-op themselves. -template <bool IsWeakCall, typename ReturnType, typename Runnable, - typename ArgsType> +template <bool IsWeakCall, typename ReturnType, typename Runnable> struct InvokeHelper; -template <typename ReturnType, typename Runnable, typename... Args> -struct InvokeHelper<false, ReturnType, Runnable, TypeList<Args...>> { - static ReturnType MakeItSo(Runnable runnable, Args... args) { - return runnable.Run(CallbackForward(args)...); +template <typename ReturnType, typename Runnable> +struct InvokeHelper<false, ReturnType, Runnable> { + template <typename... RunArgs> + static ReturnType MakeItSo(Runnable runnable, RunArgs&&... args) { + return runnable.Run(std::forward<RunArgs>(args)...); } }; -template <typename Runnable, typename... Args> -struct InvokeHelper<false, void, Runnable, TypeList<Args...>> { - static void MakeItSo(Runnable runnable, Args... args) { - runnable.Run(CallbackForward(args)...); +template <typename Runnable> +struct InvokeHelper<false, void, Runnable> { + template <typename... RunArgs> + static void MakeItSo(Runnable runnable, RunArgs&&... args) { + runnable.Run(std::forward<RunArgs>(args)...); } }; -template <typename Runnable, typename BoundWeakPtr, typename... Args> -struct InvokeHelper<true, void, Runnable, TypeList<BoundWeakPtr, Args...>> { - static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, Args... args) { +template <typename Runnable> +struct InvokeHelper<true, void, Runnable> { + template <typename BoundWeakPtr, typename... RunArgs> + static void MakeItSo(Runnable runnable, + BoundWeakPtr weak_ptr, + RunArgs&&... args) { if (!weak_ptr.get()) { return; } - runnable.Run(weak_ptr.get(), CallbackForward(args)...); + runnable.Run(weak_ptr.get(), std::forward<RunArgs>(args)...); } }; #if !defined(_MSC_VER) -template <typename ReturnType, typename Runnable, typename ArgsType> -struct InvokeHelper<true, ReturnType, Runnable, ArgsType> { +template <typename ReturnType, typename Runnable> +struct InvokeHelper<true, ReturnType, Runnable> { // WeakCalls are only supported for functions with a void return type. // Otherwise, the function result would be undefined if the the WeakPtr<> // is invalidated. @@ -388,12 +394,7 @@ struct BindState<Runnable, R(Args...), BoundArgs...> final sizeof...(BoundArgs), TypeList<typename CallbackParamTraits<Args>::ForwardType...>>; using UnboundForwardRunType = MakeFunctionType<R, UnboundForwardArgs>; - - using InvokeHelperArgs = ConcatTypeLists< - TypeList<typename UnwrapTraits<BoundArgs>::ForwardType...>, - UnboundForwardArgs>; - using InvokeHelperType = - InvokeHelper<IsWeakCall::value, R, Runnable, InvokeHelperArgs>; + using InvokeHelperType = InvokeHelper<IsWeakCall::value, R, Runnable>; using UnboundArgs = DropTypeListItem<sizeof...(BoundArgs), TypeList<Args...>>; |