19#include <QtCore/private/qglobal_p.h>
20#include <QtCore/qtconfigmacros.h>
22#if defined(Q_OS_WIN) || defined(Q_QDOC)
25#include <QtCore/qt_windows.h>
26#include <wrl/client.h>
33template <
typename,
typename,
typename =
void>
34struct has_equal_to_operator : std::false_type
38template <
typename T,
typename U>
39struct has_equal_to_operator<
40 T, U, std::void_t<
decltype(operator==(std::declval<T>(), std::declval<U>()))>>
45template <
typename T,
typename U>
46using EnableIfMissingEqualToOperator = std::enable_if_t<!has_equal_to_operator<T, U>::value,
bool>;
48template <
typename,
typename,
typename =
void>
49struct has_not_equal_to_operator : std::false_type
53template <
typename T,
typename U>
54struct has_not_equal_to_operator<
55 T, U, std::void_t<
decltype(operator!=(std::declval<T>(), std::declval<U>()))>>
60template <
typename T,
typename U>
61using EnableIfMissingNotEqualToOperator =
62 std::enable_if_t<!has_not_equal_to_operator<T, U>::value,
bool>;
64template <
typename,
typename,
typename =
void>
65struct has_less_than_operator : std::false_type
69template <
typename T,
typename U>
70struct has_less_than_operator<
71 T, U, std::void_t<
decltype(operator<(std::declval<T>(), std::declval<U>()))>>
76template <
typename T,
typename U>
77using EnableIfMissingLessThanOperator =
78 std::enable_if_t<!has_less_than_operator<T, U>::value,
bool>;
89template <
typename T,
typename U,
90 QT_PREPEND_NAMESPACE(Detail)::EnableIfMissingEqualToOperator<ComPtr<T>, ComPtr<U>> =
true>
91bool operator==(
const ComPtr<T> &lhs,
const ComPtr<U> &rhs)
noexcept
93 static_assert(std::is_base_of_v<T, U> || std::is_base_of_v<U, T>);
94 return lhs.Get() == rhs.Get();
98 QT_PREPEND_NAMESPACE(Detail)::EnableIfMissingEqualToOperator<ComPtr<T>, std::nullptr_t> =
100bool operator==(
const ComPtr<T> &lhs, std::nullptr_t)
noexcept
102 return lhs.Get() ==
nullptr;
106 QT_PREPEND_NAMESPACE(Detail)::EnableIfMissingEqualToOperator<std::nullptr_t, ComPtr<T>> =
108bool operator==(std::nullptr_t,
const ComPtr<T> &rhs)
noexcept
110 return rhs.Get() ==
nullptr;
113template <
typename T,
typename U,
114 QT_PREPEND_NAMESPACE(Detail)::EnableIfMissingNotEqualToOperator<ComPtr<T>, ComPtr<U>> =
116bool operator!=(
const ComPtr<T> &a,
const ComPtr<U> &b)
noexcept
118 static_assert(std::is_base_of_v<T, U> || std::is_base_of_v<U, T>);
119 return a.Get() != b.Get();
123 QT_PREPEND_NAMESPACE(
124 Detail)::EnableIfMissingNotEqualToOperator<ComPtr<T>, std::nullptr_t> =
true>
125bool operator!=(
const ComPtr<T> &a, std::nullptr_t)
noexcept
127 return a.Get() !=
nullptr;
131 QT_PREPEND_NAMESPACE(
132 Detail)::EnableIfMissingNotEqualToOperator<std::nullptr_t, ComPtr<T>> =
true>
133bool operator!=(std::nullptr_t,
const ComPtr<T> &a)
noexcept
135 return a.Get() !=
nullptr;
141 QT_PREPEND_NAMESPACE(Detail)::EnableIfMissingLessThanOperator<ComPtr<T>, ComPtr<U>> =
true>
142bool operator<(
const ComPtr<T> &a,
const ComPtr<U> &b)
noexcept
144 static_assert(std::is_base_of_v<T, U> || std::is_base_of_v<U, T>);
145 return a.Get() < b.Get();
153using Microsoft::WRL::ComPtr;
155template <
typename T,
typename... Args>
156ComPtr<T> makeComObject(Args &&...args)
161 *p.GetAddressOf() =
new T(std::forward<Args>(args)...);