Bug 1169542 - Make MediaPromise more rvalue-friendly. r=gerald,r=jww

Again, necessary for passing around nsTArrays.
This commit is contained in:
Bobby Holley 2015-05-28 22:57:57 -07:00
Родитель d83126f79a
Коммит 5f7ed91c80
1 изменённых файлов: 34 добавлений и 24 удалений

Просмотреть файл

@ -125,35 +125,40 @@ public:
class ResolveOrRejectValue class ResolveOrRejectValue
{ {
public: public:
void SetResolve(const ResolveValueType& aResolveValue) template<typename ResolveValueType_>
void SetResolve(ResolveValueType_&& aResolveValue)
{ {
MOZ_ASSERT(IsNothing()); MOZ_ASSERT(IsNothing());
mResolveValue.emplace(aResolveValue); mResolveValue.emplace(Forward<ResolveValueType_>(aResolveValue));
} }
void SetReject(const RejectValueType& aRejectValue) template<typename RejectValueType_>
void SetReject(RejectValueType_&& aRejectValue)
{ {
MOZ_ASSERT(IsNothing()); MOZ_ASSERT(IsNothing());
mRejectValue.emplace(aRejectValue); mRejectValue.emplace(Forward<RejectValueType_>(aRejectValue));
} }
static ResolveOrRejectValue MakeResolve(const ResolveValueType aResolveValue) template<typename ResolveValueType_>
static ResolveOrRejectValue MakeResolve(ResolveValueType_&& aResolveValue)
{ {
ResolveOrRejectValue val; ResolveOrRejectValue val;
val.SetResolve(aResolveValue); val.SetResolve(Forward<ResolveValueType_>(aResolveValue));
return val; return val;
} }
static ResolveOrRejectValue MakeReject(const RejectValueType aRejectValue) template<typename RejectValueType_>
static ResolveOrRejectValue MakeReject(RejectValueType_&& aRejectValue)
{ {
ResolveOrRejectValue val; ResolveOrRejectValue val;
val.SetReject(aRejectValue); val.SetReject(Forward<RejectValueType_>(aRejectValue));
return val; return val;
} }
bool IsResolve() const { return mResolveValue.isSome(); } bool IsResolve() const { return mResolveValue.isSome(); }
bool IsReject() const { return mRejectValue.isSome(); } bool IsReject() const { return mRejectValue.isSome(); }
bool IsNothing() const { return mResolveValue.isNothing() && mRejectValue.isNothing(); } bool IsNothing() const { return mResolveValue.isNothing() && mRejectValue.isNothing(); }
const ResolveValueType& ResolveValue() const { return mResolveValue.ref(); } const ResolveValueType& ResolveValue() const { return mResolveValue.ref(); }
const RejectValueType& RejectValue() const { return mRejectValue.ref(); } const RejectValueType& RejectValue() const { return mRejectValue.ref(); }
@ -183,19 +188,21 @@ public:
// NB: We can include the definition of this class inline once B2G ICS is gone. // NB: We can include the definition of this class inline once B2G ICS is gone.
class Private; class Private;
template<typename ResolveValueType_>
static nsRefPtr<MediaPromise> static nsRefPtr<MediaPromise>
CreateAndResolve(ResolveValueType aResolveValue, const char* aResolveSite) CreateAndResolve(ResolveValueType_&& aResolveValue, const char* aResolveSite)
{ {
nsRefPtr<typename MediaPromise::Private> p = new MediaPromise::Private(aResolveSite); nsRefPtr<typename MediaPromise::Private> p = new MediaPromise::Private(aResolveSite);
p->Resolve(aResolveValue, aResolveSite); p->Resolve(Forward<ResolveValueType_>(aResolveValue), aResolveSite);
return Move(p); return Move(p);
} }
template<typename RejectValueType_>
static nsRefPtr<MediaPromise> static nsRefPtr<MediaPromise>
CreateAndReject(RejectValueType aRejectValue, const char* aRejectSite) CreateAndReject(RejectValueType_&& aRejectValue, const char* aRejectSite)
{ {
nsRefPtr<typename MediaPromise::Private> p = new MediaPromise::Private(aRejectSite); nsRefPtr<typename MediaPromise::Private> p = new MediaPromise::Private(aRejectSite);
p->Reject(aRejectValue, aRejectSite); p->Reject(Forward<RejectValueType_>(aRejectValue), aRejectSite);
return Move(p); return Move(p);
} }
@ -353,18 +360,18 @@ protected:
static typename EnableIf<ReturnTypeIs<MethodType, nsRefPtr<MediaPromise>>::value && static typename EnableIf<ReturnTypeIs<MethodType, nsRefPtr<MediaPromise>>::value &&
TakesArgument<MethodType>::value, TakesArgument<MethodType>::value,
already_AddRefed<MediaPromise>>::Type already_AddRefed<MediaPromise>>::Type
InvokeCallbackMethod(ThisType* aThisVal, MethodType aMethod, ValueType aValue) InvokeCallbackMethod(ThisType* aThisVal, MethodType aMethod, ValueType&& aValue)
{ {
return ((*aThisVal).*aMethod)(aValue).forget(); return ((*aThisVal).*aMethod)(Forward<ValueType>(aValue)).forget();
} }
template<typename ThisType, typename MethodType, typename ValueType> template<typename ThisType, typename MethodType, typename ValueType>
static typename EnableIf<ReturnTypeIs<MethodType, void>::value && static typename EnableIf<ReturnTypeIs<MethodType, void>::value &&
TakesArgument<MethodType>::value, TakesArgument<MethodType>::value,
already_AddRefed<MediaPromise>>::Type already_AddRefed<MediaPromise>>::Type
InvokeCallbackMethod(ThisType* aThisVal, MethodType aMethod, ValueType aValue) InvokeCallbackMethod(ThisType* aThisVal, MethodType aMethod, ValueType&& aValue)
{ {
((*aThisVal).*aMethod)(aValue); ((*aThisVal).*aMethod)(Forward<ValueType>(aValue));
return nullptr; return nullptr;
} }
@ -372,7 +379,7 @@ protected:
static typename EnableIf<ReturnTypeIs<MethodType, nsRefPtr<MediaPromise>>::value && static typename EnableIf<ReturnTypeIs<MethodType, nsRefPtr<MediaPromise>>::value &&
!TakesArgument<MethodType>::value, !TakesArgument<MethodType>::value,
already_AddRefed<MediaPromise>>::Type already_AddRefed<MediaPromise>>::Type
InvokeCallbackMethod(ThisType* aThisVal, MethodType aMethod, ValueType aValue) InvokeCallbackMethod(ThisType* aThisVal, MethodType aMethod, ValueType&& aValue)
{ {
return ((*aThisVal).*aMethod)().forget(); return ((*aThisVal).*aMethod)().forget();
} }
@ -381,7 +388,7 @@ protected:
static typename EnableIf<ReturnTypeIs<MethodType, void>::value && static typename EnableIf<ReturnTypeIs<MethodType, void>::value &&
!TakesArgument<MethodType>::value, !TakesArgument<MethodType>::value,
already_AddRefed<MediaPromise>>::Type already_AddRefed<MediaPromise>>::Type
InvokeCallbackMethod(ThisType* aThisVal, MethodType aMethod, ValueType aValue) InvokeCallbackMethod(ThisType* aThisVal, MethodType aMethod, ValueType&& aValue)
{ {
((*aThisVal).*aMethod)(); ((*aThisVal).*aMethod)();
return nullptr; return nullptr;
@ -602,30 +609,33 @@ class MediaPromise<ResolveValueT, RejectValueT, IsExclusive>::Private
public: public:
explicit Private(const char* aCreationSite) : MediaPromise(aCreationSite) {} explicit Private(const char* aCreationSite) : MediaPromise(aCreationSite) {}
void Resolve(ResolveValueT aResolveValue, const char* aResolveSite) template<typename ResolveValueT_>
void Resolve(ResolveValueT_&& aResolveValue, const char* aResolveSite)
{ {
MutexAutoLock lock(mMutex); MutexAutoLock lock(mMutex);
MOZ_ASSERT(IsPending()); MOZ_ASSERT(IsPending());
PROMISE_LOG("%s resolving MediaPromise (%p created at %s)", aResolveSite, this, mCreationSite); PROMISE_LOG("%s resolving MediaPromise (%p created at %s)", aResolveSite, this, mCreationSite);
mValue.SetResolve(aResolveValue); mValue.SetResolve(Forward<ResolveValueT_>(aResolveValue));
DispatchAll(); DispatchAll();
} }
void Reject(RejectValueT aRejectValue, const char* aRejectSite) template<typename RejectValueT_>
void Reject(RejectValueT_&& aRejectValue, const char* aRejectSite)
{ {
MutexAutoLock lock(mMutex); MutexAutoLock lock(mMutex);
MOZ_ASSERT(IsPending()); MOZ_ASSERT(IsPending());
PROMISE_LOG("%s rejecting MediaPromise (%p created at %s)", aRejectSite, this, mCreationSite); PROMISE_LOG("%s rejecting MediaPromise (%p created at %s)", aRejectSite, this, mCreationSite);
mValue.SetReject(aRejectValue); mValue.SetReject(Forward<RejectValueT_>(aRejectValue));
DispatchAll(); DispatchAll();
} }
void ResolveOrReject(ResolveOrRejectValue aValue, const char* aSite) template<typename ResolveOrRejectValue_>
void ResolveOrReject(ResolveOrRejectValue_&& aValue, const char* aSite)
{ {
MutexAutoLock lock(mMutex); MutexAutoLock lock(mMutex);
MOZ_ASSERT(IsPending()); MOZ_ASSERT(IsPending());
PROMISE_LOG("%s resolveOrRejecting MediaPromise (%p created at %s)", aSite, this, mCreationSite); PROMISE_LOG("%s resolveOrRejecting MediaPromise (%p created at %s)", aSite, this, mCreationSite);
mValue = aValue; mValue = Forward<ResolveOrRejectValue_>(aValue);
DispatchAll(); DispatchAll();
} }
}; };