Index: base/callback_internal.h |
diff --git a/base/callback_internal.h b/base/callback_internal.h |
index 3e8ee82e4f246c5a875ba97d5ae219097e745f19..fbeac185a1037d163d6d2745bc7d330f6aea0135 100644 |
--- a/base/callback_internal.h |
+++ b/base/callback_internal.h |
@@ -22,7 +22,7 @@ |
namespace base { |
namespace internal { |
-class CallbackBase; |
+class MoveOnlyCallbackBase; |
// BindStateBase is used to provide an opaque handle that the Callback |
// class can use to represent a function object with bound arguments. It |
@@ -43,7 +43,7 @@ class BindStateBase { |
private: |
friend class scoped_refptr<BindStateBase>; |
- friend class CallbackBase; |
+ friend class MoveOnlyCallbackBase; |
void AddRef(); |
void Release(); |
@@ -58,10 +58,12 @@ class BindStateBase { |
// Holds the Callback methods that don't require specialization to reduce |
// template bloat. |
-class BASE_EXPORT CallbackBase { |
+// MoveOnlyCallbackBase is a direct base class of MoveOnly callbacks, and |
+// CopyableCallbackBase uses MoveOnlyCallbackBase for its implementation. |
+class BASE_EXPORT MoveOnlyCallbackBase { |
public: |
- CallbackBase(const CallbackBase& c); |
- CallbackBase& operator=(const CallbackBase& c); |
+ MoveOnlyCallbackBase(MoveOnlyCallbackBase&& c); |
+ MoveOnlyCallbackBase& operator=(MoveOnlyCallbackBase&& c); |
// Returns true if Callback is null (doesn't refer to anything). |
bool is_null() const { return bind_state_.get() == NULL; } |
@@ -77,21 +79,31 @@ class BASE_EXPORT CallbackBase { |
using InvokeFuncStorage = void(*)(); |
// Returns true if this callback equals |other|. |other| may be null. |
- bool Equals(const CallbackBase& other) const; |
+ bool EqualsInternal(const MoveOnlyCallbackBase& other) const; |
- // Allow initializing of |bind_state_| via the constructor to avoid default |
- // initialization of the scoped_refptr. We do not also initialize |
- // |polymorphic_invoke_| here because doing a normal assignment in the |
- // derived Callback templates makes for much nicer compiler errors. |
- explicit CallbackBase(BindStateBase* bind_state); |
+ void set_bind_state(BindStateBase* bind_state); |
+ |
+ MoveOnlyCallbackBase(); |
// Force the destructor to be instantiated inside this translation unit so |
// that our subclasses will not get inlined versions. Avoids more template |
// bloat. |
- ~CallbackBase(); |
+ ~MoveOnlyCallbackBase(); |
scoped_refptr<BindStateBase> bind_state_; |
- InvokeFuncStorage polymorphic_invoke_; |
+ InvokeFuncStorage polymorphic_invoke_ = nullptr; |
+}; |
+ |
+// CopyableCallbackBase is a direct base class of Copyable Callbacks. |
+class BASE_EXPORT CopyableCallbackBase : public MoveOnlyCallbackBase { |
+ public: |
+ CopyableCallbackBase(const CopyableCallbackBase& c); |
+ CopyableCallbackBase(CopyableCallbackBase&& c); |
+ CopyableCallbackBase& operator=(const CopyableCallbackBase& c); |
+ CopyableCallbackBase& operator=(CopyableCallbackBase&& c); |
+ protected: |
+ CopyableCallbackBase() {} |
+ ~CopyableCallbackBase() {} |
}; |
// A helper template to determine if given type is non-const move-only-type, |