Future-pre.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * Copyright 2015-present Facebook, Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #pragma once
  17. // included by Future.h, do not include directly.
  18. namespace folly {
  19. template <class>
  20. class Promise;
  21. template <class T>
  22. class SemiFuture;
  23. template <typename T>
  24. struct isSemiFuture : std::false_type {
  25. using Inner = typename lift_unit<T>::type;
  26. };
  27. template <typename T>
  28. struct isSemiFuture<SemiFuture<T>> : std::true_type {
  29. typedef T Inner;
  30. };
  31. template <typename T>
  32. struct isFuture : std::false_type {
  33. using Inner = typename lift_unit<T>::type;
  34. };
  35. template <typename T>
  36. struct isFuture<Future<T>> : std::true_type {
  37. typedef T Inner;
  38. };
  39. template <typename T>
  40. struct isFutureOrSemiFuture : std::false_type {
  41. using Inner = typename lift_unit<T>::type;
  42. using Return = Inner;
  43. };
  44. template <typename T>
  45. struct isFutureOrSemiFuture<Future<T>> : std::true_type {
  46. typedef T Inner;
  47. using Return = Future<Inner>;
  48. };
  49. template <typename T>
  50. struct isFutureOrSemiFuture<SemiFuture<T>> : std::true_type {
  51. typedef T Inner;
  52. using Return = SemiFuture<Inner>;
  53. };
  54. template <typename T>
  55. struct isTry : std::false_type {};
  56. template <typename T>
  57. struct isTry<Try<T>> : std::true_type {};
  58. namespace futures {
  59. namespace detail {
  60. template <class>
  61. class Core;
  62. template <typename...>
  63. struct ArgType;
  64. template <typename Arg, typename... Args>
  65. struct ArgType<Arg, Args...> {
  66. typedef Arg FirstArg;
  67. };
  68. template <>
  69. struct ArgType<> {
  70. typedef void FirstArg;
  71. };
  72. template <bool isTry_, typename F, typename... Args>
  73. struct argResult {
  74. using Function = F;
  75. using ArgList = ArgType<Args...>;
  76. using Result = invoke_result_t<F, Args...>;
  77. using ArgsSize = index_constant<sizeof...(Args)>;
  78. static constexpr bool isTry() {
  79. return isTry_;
  80. }
  81. };
  82. template <typename T, typename F>
  83. struct callableResult {
  84. typedef typename std::conditional<
  85. is_invocable<F>::value,
  86. detail::argResult<false, F>,
  87. typename std::conditional<
  88. is_invocable<F, T&&>::value,
  89. detail::argResult<false, F, T&&>,
  90. detail::argResult<true, F, Try<T>&&>>::type>::type Arg;
  91. typedef isFutureOrSemiFuture<typename Arg::Result> ReturnsFuture;
  92. typedef Future<typename ReturnsFuture::Inner> Return;
  93. };
  94. template <typename T, typename F>
  95. struct tryCallableResult {
  96. typedef detail::argResult<true, F, Try<T>&&> Arg;
  97. typedef isFutureOrSemiFuture<typename Arg::Result> ReturnsFuture;
  98. typedef typename ReturnsFuture::Inner value_type;
  99. typedef Future<value_type> Return;
  100. };
  101. template <typename T, typename F>
  102. struct valueCallableResult {
  103. typedef detail::argResult<false, F, T&&> Arg;
  104. typedef isFutureOrSemiFuture<typename Arg::Result> ReturnsFuture;
  105. typedef typename ReturnsFuture::Inner value_type;
  106. typedef typename Arg::ArgList::FirstArg FirstArg;
  107. typedef Future<value_type> Return;
  108. };
  109. template <typename L>
  110. struct Extract : Extract<decltype(&L::operator())> {};
  111. template <typename Class, typename R, typename... Args>
  112. struct Extract<R (Class::*)(Args...) const> {
  113. typedef isFutureOrSemiFuture<R> ReturnsFuture;
  114. typedef Future<typename ReturnsFuture::Inner> Return;
  115. typedef typename ReturnsFuture::Inner RawReturn;
  116. typedef typename ArgType<Args...>::FirstArg FirstArg;
  117. };
  118. template <typename Class, typename R, typename... Args>
  119. struct Extract<R (Class::*)(Args...)> {
  120. typedef isFutureOrSemiFuture<R> ReturnsFuture;
  121. typedef Future<typename ReturnsFuture::Inner> Return;
  122. typedef typename ReturnsFuture::Inner RawReturn;
  123. typedef typename ArgType<Args...>::FirstArg FirstArg;
  124. };
  125. template <typename R, typename... Args>
  126. struct Extract<R (*)(Args...)> {
  127. typedef isFutureOrSemiFuture<R> ReturnsFuture;
  128. typedef Future<typename ReturnsFuture::Inner> Return;
  129. typedef typename ReturnsFuture::Inner RawReturn;
  130. typedef typename ArgType<Args...>::FirstArg FirstArg;
  131. };
  132. template <typename R, typename... Args>
  133. struct Extract<R (&)(Args...)> {
  134. typedef isFutureOrSemiFuture<R> ReturnsFuture;
  135. typedef Future<typename ReturnsFuture::Inner> Return;
  136. typedef typename ReturnsFuture::Inner RawReturn;
  137. typedef typename ArgType<Args...>::FirstArg FirstArg;
  138. };
  139. class DeferredExecutor;
  140. } // namespace detail
  141. } // namespace futures
  142. class Timekeeper;
  143. } // namespace folly