/* * Copyright 2015-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once // included by Future.h, do not include directly. namespace folly { template class Promise; template class SemiFuture; template struct isSemiFuture : std::false_type { using Inner = typename lift_unit::type; }; template struct isSemiFuture> : std::true_type { typedef T Inner; }; template struct isFuture : std::false_type { using Inner = typename lift_unit::type; }; template struct isFuture> : std::true_type { typedef T Inner; }; template struct isFutureOrSemiFuture : std::false_type { using Inner = typename lift_unit::type; using Return = Inner; }; template struct isFutureOrSemiFuture> : std::true_type { typedef T Inner; using Return = Future; }; template struct isFutureOrSemiFuture> : std::true_type { typedef T Inner; using Return = SemiFuture; }; template struct isTry : std::false_type {}; template struct isTry> : std::true_type {}; namespace futures { namespace detail { template class Core; template struct ArgType; template struct ArgType { typedef Arg FirstArg; }; template <> struct ArgType<> { typedef void FirstArg; }; template struct argResult { using Function = F; using ArgList = ArgType; using Result = invoke_result_t; using ArgsSize = index_constant; static constexpr bool isTry() { return isTry_; } }; template struct callableResult { typedef typename std::conditional< is_invocable::value, detail::argResult, typename std::conditional< is_invocable::value, detail::argResult, detail::argResult&&>>::type>::type Arg; typedef isFutureOrSemiFuture ReturnsFuture; typedef Future Return; }; template struct tryCallableResult { typedef detail::argResult&&> Arg; typedef isFutureOrSemiFuture ReturnsFuture; typedef typename ReturnsFuture::Inner value_type; typedef Future Return; }; template struct valueCallableResult { typedef detail::argResult Arg; typedef isFutureOrSemiFuture ReturnsFuture; typedef typename ReturnsFuture::Inner value_type; typedef typename Arg::ArgList::FirstArg FirstArg; typedef Future Return; }; template struct Extract : Extract {}; template struct Extract { typedef isFutureOrSemiFuture ReturnsFuture; typedef Future Return; typedef typename ReturnsFuture::Inner RawReturn; typedef typename ArgType::FirstArg FirstArg; }; template struct Extract { typedef isFutureOrSemiFuture ReturnsFuture; typedef Future Return; typedef typename ReturnsFuture::Inner RawReturn; typedef typename ArgType::FirstArg FirstArg; }; template struct Extract { typedef isFutureOrSemiFuture ReturnsFuture; typedef Future Return; typedef typename ReturnsFuture::Inner RawReturn; typedef typename ArgType::FirstArg FirstArg; }; template struct Extract { typedef isFutureOrSemiFuture ReturnsFuture; typedef Future Return; typedef typename ReturnsFuture::Inner RawReturn; typedef typename ArgType::FirstArg FirstArg; }; class DeferredExecutor; } // namespace detail } // namespace futures class Timekeeper; } // namespace folly