зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
d7e93fa211
Коммит
8773058b99
|
@ -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());
|
||||||
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче