MozPromiseUtils.h (3788B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef DOM_QUOTA_MOZPROMISEUTILS_H_ 8 #define DOM_QUOTA_MOZPROMISEUTILS_H_ 9 10 #include "mozilla/MozPromise.h" 11 #include "nsThreadUtils.h" 12 13 namespace mozilla::dom::quota { 14 15 namespace detail { 16 17 template <typename T> 18 struct IsExclusiveMozPromise { 19 static constexpr bool value = false; 20 }; 21 22 // Specialization for MozPromise 23 template <typename ResolveValueT, typename RejectValueT, bool IsExclusive> 24 struct IsExclusiveMozPromise< 25 MozPromise<ResolveValueT, RejectValueT, IsExclusive>> { 26 static constexpr bool value = IsExclusive; 27 }; 28 29 } // namespace detail 30 31 template <typename T, typename U, typename F> 32 auto Map(RefPtr<U> aPromise, F&& aFunc) -> std::enable_if_t< 33 !detail::IsExclusiveMozPromise<RemoveSmartPointer<T>>::value && 34 detail::IsExclusiveMozPromise<RemoveSmartPointer<U>>::value, 35 RefPtr<T>> { 36 return aPromise->Then( 37 GetCurrentSerialEventTarget(), __func__, 38 [func = 39 std::forward<F>(aFunc)](typename U::ResolveOrRejectValue&& aValue) { 40 if (aValue.IsReject()) { 41 return T::CreateAndReject(aValue.RejectValue(), __func__); 42 } 43 44 auto value = func(std::move(aValue)); 45 46 return T::CreateAndResolve(value, __func__); 47 }); 48 } 49 50 template <typename T, typename U, typename F> 51 auto Map(RefPtr<U> aPromise, F&& aFunc) -> std::enable_if_t< 52 !detail::IsExclusiveMozPromise<RemoveSmartPointer<T>>::value && 53 !detail::IsExclusiveMozPromise<RemoveSmartPointer<U>>::value, 54 RefPtr<T>> { 55 return aPromise->Then(GetCurrentSerialEventTarget(), __func__, 56 [func = std::forward<F>(aFunc)]( 57 const typename U::ResolveOrRejectValue& aValue) { 58 if (aValue.IsReject()) { 59 return T::CreateAndReject(aValue.RejectValue(), 60 __func__); 61 } 62 63 auto value = func(aValue); 64 65 return T::CreateAndResolve(value, __func__); 66 }); 67 } 68 69 template <typename T, typename U, typename F> 70 auto Map(RefPtr<U> aPromise, F&& aFunc) -> std::enable_if_t< 71 detail::IsExclusiveMozPromise<RemoveSmartPointer<T>>::value && 72 detail::IsExclusiveMozPromise<RemoveSmartPointer<U>>::value, 73 RefPtr<T>> { 74 return aPromise->Then( 75 GetCurrentSerialEventTarget(), __func__, 76 [func = std::forward<F>(aFunc)]( 77 typename U::ResolveOrRejectValue&& aValue) mutable { 78 if (aValue.IsReject()) { 79 return T::CreateAndReject(aValue.RejectValue(), __func__); 80 } 81 82 auto value = func(std::move(aValue)); 83 84 return T::CreateAndResolve(std::move(value), __func__); 85 }); 86 } 87 88 template <typename T, typename U, typename F> 89 auto Map(RefPtr<U> aPromise, F&& aFunc) -> std::enable_if_t< 90 detail::IsExclusiveMozPromise<RemoveSmartPointer<T>>::value && 91 !detail::IsExclusiveMozPromise<RemoveSmartPointer<U>>::value, 92 RefPtr<T>> { 93 return aPromise->Then( 94 GetCurrentSerialEventTarget(), __func__, 95 [func = std::forward<F>(aFunc)]( 96 const typename U::ResolveOrRejectValue& aValue) mutable { 97 if (aValue.IsReject()) { 98 return T::CreateAndReject(aValue.RejectValue(), __func__); 99 } 100 101 auto value = func(aValue); 102 103 return T::CreateAndResolve(std::move(value), __func__); 104 }); 105 } 106 107 } // namespace mozilla::dom::quota 108 109 #endif // DOM_QUOTA_MOZPROMISEUTILS_H_