mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
8ee2c326d2
commit
6f82ddffdf
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user