Bug 1367674. P1 - add templates to deal with CV and argument number correctly. r=gerald

MozReview-Commit-ID: 5qeSBDny6uc

--HG--
extra : rebase_source : 92530c9efd7cdaaf50fba56d423532546059f37e
This commit is contained in:
JW Wang 2017-05-25 15:41:01 +08:00
parent 8ee2c326d2
commit 6f82ddffdf

View File

@ -38,6 +38,39 @@ extern LazyLogModule gMozPromiseLog;
MOZ_LOG(gMozPromiseLog, mozilla::LogLevel::Debug, (x, ##__VA_ARGS__))
namespace detail {
template <typename F>
struct MethodTraitsHelper : MethodTraitsHelper<decltype(&F::operator())>
{
};
template <typename ThisType, typename Ret, typename... ArgTypes>
struct MethodTraitsHelper<Ret(ThisType::*)(ArgTypes...)>
{
using ReturnType = Ret;
static const size_t ArgSize = sizeof...(ArgTypes);
};
template <typename ThisType, typename Ret, typename... ArgTypes>
struct MethodTraitsHelper<Ret(ThisType::*)(ArgTypes...) const>
{
using ReturnType = Ret;
static const size_t ArgSize = sizeof...(ArgTypes);
};
template <typename ThisType, typename Ret, typename... ArgTypes>
struct MethodTraitsHelper<Ret(ThisType::*)(ArgTypes...) volatile>
{
using ReturnType = Ret;
static const size_t ArgSize = sizeof...(ArgTypes);
};
template <typename ThisType, typename Ret, typename... ArgTypes>
struct MethodTraitsHelper<Ret(ThisType::*)(ArgTypes...) const volatile>
{
using ReturnType = Ret;
static const size_t ArgSize = sizeof...(ArgTypes);
};
template <typename T>
struct MethodTrait : MethodTraitsHelper<typename RemoveReference<T>::Type>
{
};
template<typename ThisType, typename Ret, typename ArgType>
static TrueType TakesArgumentHelper(Ret (ThisType::*)(ArgType));
template<typename ThisType, typename Ret, typename ArgType>
@ -57,21 +90,20 @@ template<typename ThisType, typename Ret>
static Ret ReturnTypeHelper(Ret (ThisType::*)() const);
template<typename MethodType>
struct ReturnType {
typedef decltype(detail::ReturnTypeHelper(DeclVal<MethodType>())) Type;
struct ReturnType
{
using Type = typename MethodTrait<MethodType>::ReturnType;
};
} // namespace detail
template<typename MethodType>
struct TakesArgument {
static const bool value = decltype(detail::TakesArgumentHelper(DeclVal<MethodType>()))::value;
};
using TakesArgument =
IntegralConstant<bool, detail::MethodTrait<MethodType>::ArgSize != 0>;
template<typename MethodType, typename TargetType>
struct ReturnTypeIs {
static const bool value = IsConvertible<typename detail::ReturnType<MethodType>::Type, TargetType>::value;
};
using ReturnTypeIs =
IsConvertible<typename detail::MethodTrait<MethodType>::ReturnType, TargetType>;
/*
* A promise manages an asynchronous request that may or may not be able to be