Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(157)

Unified Diff: base/bind_internal.h

Issue 1798403002: Support rvalue-reference Runnables in base::Bind internals (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: s/IsWeakCall/is_weak_call/. Perfect Forwarding -> pass-by-value + std::move() Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/bind_internal.h
diff --git a/base/bind_internal.h b/base/bind_internal.h
index 6e0a425eab09fd875b974ec3035c04e6d477fbe5..7d3e2d1c8db56fb1dc501dbac7917bb19e656122 100644
--- a/base/bind_internal.h
+++ b/base/bind_internal.h
@@ -293,42 +293,43 @@ 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>
+template <bool is_weak_call, typename ReturnType>
struct InvokeHelper;
-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 ReturnType>
+struct InvokeHelper<false, ReturnType> {
+ template <typename Runnable, typename... RunArgs>
+ static ReturnType MakeItSo(Runnable&& runnable, RunArgs&&... args) {
+ return std::forward<Runnable>(runnable).Run(std::forward<RunArgs>(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 <>
+struct InvokeHelper<false, void> {
+ template <typename Runnable, typename... RunArgs>
+ static void MakeItSo(Runnable&& runnable, RunArgs&&... args) {
+ std::forward<Runnable>(runnable).Run(std::forward<RunArgs>(args)...);
}
};
-template <typename Runnable>
-struct InvokeHelper<true, void, Runnable> {
- template <typename BoundWeakPtr, typename... RunArgs>
- static void MakeItSo(Runnable runnable,
+template <>
+struct InvokeHelper<true, void> {
+ template <typename Runnable, typename BoundWeakPtr, typename... RunArgs>
+ static void MakeItSo(Runnable&& runnable,
BoundWeakPtr weak_ptr,
RunArgs&&... args) {
if (!weak_ptr.get()) {
return;
}
- runnable.Run(weak_ptr.get(), std::forward<RunArgs>(args)...);
+ std::forward<Runnable>(runnable).Run(
+ weak_ptr.get(), std::forward<RunArgs>(args)...);
}
};
#if !defined(_MSC_VER)
-template <typename ReturnType, typename Runnable>
-struct InvokeHelper<true, ReturnType, Runnable> {
+template <typename ReturnType>
+struct InvokeHelper<true, ReturnType> {
// WeakCalls are only supported for functions with a void return type.
// Otherwise, the function result would be undefined if the the WeakPtr<>
// is invalidated.
@@ -342,24 +343,24 @@ struct InvokeHelper<true, ReturnType, Runnable> {
//
// See description at the top of the file.
template <typename BoundIndices, typename StorageType,
- typename InvokeHelperType, typename UnboundForwardRunType>
+ bool is_weak_call, typename UnboundForwardRunType>
struct Invoker;
template <size_t... bound_indices,
typename StorageType,
- typename InvokeHelperType,
+ bool is_weak_call,
typename R,
typename... UnboundArgs>
struct Invoker<IndexSequence<bound_indices...>,
StorageType,
- InvokeHelperType,
+ is_weak_call,
R(UnboundArgs...)> {
static R Run(BindStateBase* base, UnboundArgs&&... unbound_args) {
StorageType* storage = static_cast<StorageType*>(base);
// Local references to make debugger stepping easier. If in a debugger,
// you really want to warp ahead and step through the
// InvokeHelper<>::MakeItSo() call below.
- return InvokeHelperType::MakeItSo(
+ return InvokeHelper<is_weak_call, R>::MakeItSo(
storage->runnable_, Unwrap(get<bound_indices>(storage->bound_args_))...,
std::forward<UnboundArgs>(unbound_args)...);
}
@@ -406,29 +407,24 @@ struct BindState<Runnable, R(Args...), BoundArgs...> final
: public BindStateBase {
private:
using StorageType = BindState<Runnable, R(Args...), BoundArgs...>;
- using RunnableType = Runnable;
+ using RunnableType = typename std::decay<Runnable>::type;
- enum { is_method = HasIsMethodTag<Runnable>::value };
-
- // true_type if Runnable is a method invocation and the first bound argument
- // is a WeakPtr.
- using IsWeakCall =
- IsWeakMethod<is_method, typename std::decay<BoundArgs>::type...>;
+ enum { is_method = HasIsMethodTag<RunnableType>::value };
+ enum { is_weak_call = IsWeakMethod<
+ is_method, typename std::decay<BoundArgs>::type...>::value};
using BoundIndices = MakeIndexSequence<sizeof...(BoundArgs)>;
- using InvokeHelperType = InvokeHelper<IsWeakCall::value, R, Runnable>;
-
using UnboundArgs = DropTypeListItem<sizeof...(BoundArgs), TypeList<Args...>>;
public:
using UnboundRunType = MakeFunctionType<R, UnboundArgs>;
using InvokerType =
- Invoker<BoundIndices, StorageType, InvokeHelperType, UnboundRunType>;
+ Invoker<BoundIndices, StorageType, is_weak_call, UnboundRunType>;
template <typename... ForwardArgs>
- BindState(const Runnable& runnable, ForwardArgs&&... bound_args)
+ BindState(RunnableType runnable, ForwardArgs&&... bound_args)
: BindStateBase(&Destroy),
- runnable_(runnable),
+ runnable_(std::move(runnable)),
bound_args_(std::forward<ForwardArgs>(bound_args)...) {}
RunnableType runnable_;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698