зеркало из 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)
|
||||
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...),
|
||||
Args&&... aArgs) {
|
||||
return detail::ToResultInvokeMemberFunction<detail::select_last_t<XArgs...>>(
|
||||
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,
|
||||
nsresult (__stdcall U::*aFunc)(XArgs...) const,
|
||||
Args&&... aArgs) {
|
||||
|
@ -269,6 +271,25 @@ auto ToResultInvoke(const T* const aObj,
|
|||
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
|
||||
|
||||
// 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());
|
||||
}
|
||||
}
|
||||
|
||||
TEST(ResultExtensions_ToResultInvoke, nsCOMPtr_NS_IMETHOD_bool_Result)
|
||||
{
|
||||
nsCOMPtr<nsIFile> file = MakeAndAddRef<nsLocalFile>();
|
||||
ASSERT_TRUE(ToResultInvoke(file, &nsIFile::Equals, file).isOk());
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче