tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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_