mirror of
https://github.com/facebook/sapling.git
synced 2024-10-05 06:18:07 +03:00
de6ca0c970
Summary: Lambda returning no values would cause the compiler to try to instantiate an ImmediateFuture<void>, which doesn't compile. We could try special casing the void type, but it's easier if we simply consider these lambda to return unit. Reviewed By: genevievehelsel Differential Revision: D28372253 fbshipit-source-id: 1368ae5dc5e2d4d6a5c3e31bc87ed7d230027c3a
72 lines
1.7 KiB
C++
72 lines
1.7 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This software may be used and distributed according to the terms of the
|
|
* GNU General Public License version 2.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <folly/Try.h>
|
|
#include <folly/futures/Future.h>
|
|
|
|
namespace facebook::eden {
|
|
|
|
template <typename T>
|
|
class ImmediateFuture;
|
|
|
|
namespace detail {
|
|
template <typename T>
|
|
struct isImmediateFuture : std::false_type {};
|
|
|
|
template <typename T>
|
|
struct isImmediateFuture<ImmediateFuture<T>> : std::true_type {};
|
|
|
|
template <typename T, typename enabled = void>
|
|
struct continuation_result_impl {
|
|
using type = T;
|
|
};
|
|
|
|
template <typename T>
|
|
struct continuation_result_impl<
|
|
T,
|
|
typename std::enable_if_t<folly::isSemiFuture<T>::value>> {
|
|
using type = typename T::value_type;
|
|
};
|
|
|
|
template <typename T>
|
|
struct continuation_result_impl<
|
|
T,
|
|
typename std::enable_if_t<isImmediateFuture<T>::value>> {
|
|
using type = typename T::value_type;
|
|
};
|
|
|
|
template <typename T>
|
|
struct continuation_result_impl<
|
|
T,
|
|
typename std::enable_if_t<folly::isTry<T>::value>> {
|
|
using type = typename T::element_type;
|
|
};
|
|
|
|
template <>
|
|
struct continuation_result_impl<void> {
|
|
using type = folly::Unit;
|
|
};
|
|
|
|
template <
|
|
typename Func,
|
|
typename Arg,
|
|
typename enabled = std::enable_if_t<std::is_invocable_v<Func, Arg>>>
|
|
struct continuation_result
|
|
: continuation_result_impl<std::invoke_result_t<Func, Arg>> {};
|
|
|
|
/**
|
|
* Returns the actual return type of a continuation callback, removing the
|
|
* Future/Try/ImmediateFuture wrapping.
|
|
*/
|
|
template <typename Func, typename Arg>
|
|
using continuation_result_t = typename continuation_result<Func, Arg>::type;
|
|
|
|
} // namespace detail
|
|
} // namespace facebook::eden
|