Index: base/callback.h |
diff --git a/base/callback.h b/base/callback.h |
index c6b8ca3c448a92fbcf0be7d083f63e3aa852aec5..8f2f2503fb12c26c39c5c5dd08d7f4ea60b856dd 100644 |
--- a/base/callback.h |
+++ b/base/callback.h |
@@ -21,6 +21,12 @@ namespace base { |
namespace internal { |
+template <typename CallbackType> |
+struct IsOnceCallback : std::false_type {}; |
+ |
+template <typename Signature> |
+struct IsOnceCallback<OnceCallback<Signature>> : std::true_type {}; |
+ |
// RunMixin provides different variants of `Run()` function to `Callback<>` |
// based on the type of callback. |
template <typename CallbackType> |
@@ -28,14 +34,19 @@ class RunMixin; |
// Specialization for OnceCallback. |
template <typename R, typename... Args> |
-class RunMixin<Callback<R(Args...), CopyMode::MoveOnly, RepeatMode::Once>> { |
+class RunMixin<OnceCallback<R(Args...)>> { |
private: |
- using CallbackType = |
- Callback<R(Args...), CopyMode::MoveOnly, RepeatMode::Once>; |
+ using CallbackType = OnceCallback<R(Args...)>; |
public: |
using PolymorphicInvoke = R(*)(internal::BindStateBase*, Args&&...); |
+ R Run(Args... args) & { |
dcheng
2016/11/19 08:07:59
All overloads must either use ref-qualifiers or no
|
+ static_assert(!IsOnceCallback<CallbackType>::value, |
dcheng
2016/11/19 08:07:59
This feels a bit silly, but we need to make sure t
vmpstr
2016/11/21 20:00:40
14.7.1 of the standard is so dense that I don't un
dcheng
2016/11/22 01:48:28
Added a language lawyering explanation; hopefully
|
+ "OnceCallback::Run() may only be invoked on an rvalue, i.e. " |
+ "std::move(callback).Run()."); |
+ } |
+ |
R Run(Args... args) && { |
// Move the callback instance into a local variable before the invocation, |
// that ensures the internal state is cleared after the invocation. |
@@ -49,10 +60,10 @@ class RunMixin<Callback<R(Args...), CopyMode::MoveOnly, RepeatMode::Once>> { |
}; |
// Specialization for RepeatingCallback. |
-template <typename R, typename... Args, CopyMode copy_mode> |
-class RunMixin<Callback<R(Args...), copy_mode, RepeatMode::Repeating>> { |
+template <typename R, typename... Args> |
+class RunMixin<RepeatingCallback<R(Args...)>> { |
private: |
- using CallbackType = Callback<R(Args...), copy_mode, RepeatMode::Repeating>; |
+ using CallbackType = RepeatingCallback<R(Args...)>; |
public: |
using PolymorphicInvoke = R(*)(internal::BindStateBase*, Args&&...); |
@@ -69,10 +80,8 @@ template <typename From, typename To> |
struct IsCallbackConvertible : std::false_type {}; |
template <typename Signature> |
-struct IsCallbackConvertible< |
- Callback<Signature, CopyMode::Copyable, RepeatMode::Repeating>, |
- Callback<Signature, CopyMode::MoveOnly, RepeatMode::Once>> : std::true_type { |
-}; |
+struct IsCallbackConvertible<RepeatingCallback<Signature>, |
+ OnceCallback<Signature>> : std::true_type {}; |
} // namespace internal |