Bug 1659909 - ToResultInvoke should also work with RefPtr/nsCOMPtr on win32; r=dom-workers-and-storage-reviewers,sg

Differential Revision: https://phabricator.services.mozilla.com/D87556
This commit is contained in:
Jan Varga 2020-08-19 14:34:06 +00:00
Родитель d7e93fa211
Коммит 8773058b99
2 изменённых файлов: 29 добавлений и 2 удалений

Просмотреть файл

@ -242,14 +242,16 @@ auto ToResultInvoke(const SmartPtr<const T>& aObj,
} }
#if defined(XP_WIN) && !defined(_WIN64) #if defined(XP_WIN) && !defined(_WIN64)
template <typename T, typename U, typename... XArgs, typename... Args> template <typename T, typename U, typename... XArgs, typename... Args,
typename = std::enable_if_t<std::is_base_of_v<U, T>>>
auto ToResultInvoke(T& aObj, nsresult (__stdcall U::*aFunc)(XArgs...), auto ToResultInvoke(T& aObj, nsresult (__stdcall U::*aFunc)(XArgs...),
Args&&... aArgs) { Args&&... aArgs) {
return detail::ToResultInvokeMemberFunction<detail::select_last_t<XArgs...>>( return detail::ToResultInvokeMemberFunction<detail::select_last_t<XArgs...>>(
aObj, aFunc, std::forward<Args>(aArgs)...); aObj, aFunc, std::forward<Args>(aArgs)...);
} }
template <typename T, typename U, typename... XArgs, typename... Args> template <typename T, typename U, typename... XArgs, typename... Args,
typename = std::enable_if_t<std::is_base_of_v<U, T>>>
auto ToResultInvoke(const T& aObj, auto ToResultInvoke(const T& aObj,
nsresult (__stdcall U::*aFunc)(XArgs...) const, nsresult (__stdcall U::*aFunc)(XArgs...) const,
Args&&... aArgs) { Args&&... aArgs) {
@ -269,6 +271,25 @@ auto ToResultInvoke(const T* const aObj,
Args&&... aArgs) { Args&&... aArgs) {
return ToResultInvoke(*aObj, aFunc, std::forward<Args>(aArgs)...); return ToResultInvoke(*aObj, aFunc, std::forward<Args>(aArgs)...);
} }
template <template <class> class SmartPtr, typename T, typename U,
typename... XArgs, typename... Args,
typename = std::enable_if_t<std::is_base_of_v<U, T>>,
typename = decltype(*std::declval<const SmartPtr<T>>())>
auto ToResultInvoke(const SmartPtr<T>& aObj,
nsresult (__stdcall U::*aFunc)(XArgs...), Args&&... aArgs) {
return ToResultInvoke(*aObj, aFunc, std::forward<Args>(aArgs)...);
}
template <template <class> class SmartPtr, typename T, typename U,
typename... XArgs, typename... Args,
typename = std::enable_if_t<std::is_base_of_v<U, T>>,
typename = decltype(*std::declval<const SmartPtr<T>>())>
auto ToResultInvoke(const SmartPtr<const T>& aObj,
nsresult (__stdcall U::*aFunc)(XArgs...) const,
Args&&... aArgs) {
return ToResultInvoke(*aObj, aFunc, std::forward<Args>(aArgs)...);
}
#endif #endif
// Macro version of ToResultInvoke for member functions. The macro has the // Macro version of ToResultInvoke for member functions. The macro has the

Просмотреть файл

@ -412,3 +412,9 @@ TEST(ResultExtensions_ToResultInvoke, RefPtr_MemberFunction_NoInput_Macro)
ASSERT_EQ(NS_ERROR_FAILURE, valOrErr.unwrapErr()); ASSERT_EQ(NS_ERROR_FAILURE, valOrErr.unwrapErr());
} }
} }
TEST(ResultExtensions_ToResultInvoke, nsCOMPtr_NS_IMETHOD_bool_Result)
{
nsCOMPtr<nsIFile> file = MakeAndAddRef<nsLocalFile>();
ASSERT_TRUE(ToResultInvoke(file, &nsIFile::Equals, file).isOk());
}