18#include <QtCore/private/qglobal_p.h>
19#include <QtCore/qtconfigmacros.h>
21#if defined(Q_OS_WIN) || defined(Q_QDOC)
24#include <QtCore/qt_windows.h>
25#include <wrl/client.h>
32template <
typename,
typename,
typename =
void>
33struct has_equal_to_operator : std::false_type
37template <
typename T,
typename U>
38struct has_equal_to_operator<
39 T, U, std::void_t<
decltype(operator==(std::declval<T>(), std::declval<U>()))>>
44template <
typename T,
typename U>
45using EnableIfMissingEqualToOperator = std::enable_if_t<!has_equal_to_operator<T, U>::value,
bool>;
47template <
typename,
typename,
typename =
void>
48struct has_not_equal_to_operator : std::false_type
52template <
typename T,
typename U>
53struct has_not_equal_to_operator<
54 T, U, std::void_t<
decltype(operator!=(std::declval<T>(), std::declval<U>()))>>
59template <
typename T,
typename U>
60using EnableIfMissingNotEqualToOperator =
61 std::enable_if_t<!has_not_equal_to_operator<T, U>::value,
bool>;
63template <
typename,
typename,
typename =
void>
64struct has_less_than_operator : std::false_type
68template <
typename T,
typename U>
69struct has_less_than_operator<
70 T, U, std::void_t<
decltype(operator<(std::declval<T>(), std::declval<U>()))>>
75template <
typename T,
typename U>
76using EnableIfMissingLessThanOperator =
77 std::enable_if_t<!has_less_than_operator<T, U>::value,
bool>;
88template <
typename T,
typename U,
89 QT_PREPEND_NAMESPACE(Detail)::EnableIfMissingEqualToOperator<ComPtr<T>, ComPtr<U>> =
true>
90bool operator==(
const ComPtr<T> &lhs,
const ComPtr<U> &rhs)
noexcept
92 static_assert(std::is_base_of_v<T, U> || std::is_base_of_v<U, T>);
93 return lhs.Get() == rhs.Get();
97 QT_PREPEND_NAMESPACE(Detail)::EnableIfMissingEqualToOperator<ComPtr<T>, std::nullptr_t> =
99bool operator==(
const ComPtr<T> &lhs, std::nullptr_t)
noexcept
101 return lhs.Get() ==
nullptr;
105 QT_PREPEND_NAMESPACE(Detail)::EnableIfMissingEqualToOperator<std::nullptr_t, ComPtr<T>> =
107bool operator==(std::nullptr_t,
const ComPtr<T> &rhs)
noexcept
109 return rhs.Get() ==
nullptr;
112template <
typename T,
typename U,
113 QT_PREPEND_NAMESPACE(Detail)::EnableIfMissingNotEqualToOperator<ComPtr<T>, ComPtr<U>> =
115bool operator!=(
const ComPtr<T> &a,
const ComPtr<U> &b)
noexcept
117 static_assert(std::is_base_of_v<T, U> || std::is_base_of_v<U, T>);
118 return a.Get() != b.Get();
122 QT_PREPEND_NAMESPACE(
123 Detail)::EnableIfMissingNotEqualToOperator<ComPtr<T>, std::nullptr_t> =
true>
124bool operator!=(
const ComPtr<T> &a, std::nullptr_t)
noexcept
126 return a.Get() !=
nullptr;
130 QT_PREPEND_NAMESPACE(
131 Detail)::EnableIfMissingNotEqualToOperator<std::nullptr_t, ComPtr<T>> =
true>
132bool operator!=(std::nullptr_t,
const ComPtr<T> &a)
noexcept
134 return a.Get() !=
nullptr;
140 QT_PREPEND_NAMESPACE(Detail)::EnableIfMissingLessThanOperator<ComPtr<T>, ComPtr<U>> =
true>
141bool operator<(
const ComPtr<T> &a,
const ComPtr<U> &b)
noexcept
143 static_assert(std::is_base_of_v<T, U> || std::is_base_of_v<U, T>);
144 return a.Get() < b.Get();
152using Microsoft::WRL::ComPtr;
154template <
typename T,
typename... Args>
155ComPtr<T> makeComObject(Args &&...args)
160 *p.GetAddressOf() =
new T(std::forward<Args>(args)...);