116 <<
"Comparison is not supported when |this| owns a SAFEARRAY";
118 <<
"Comparison is not supported when |other| owns a SAFEARRAY";
120 const bool this_is_empty =
var_.vt == VT_EMPTY ||
var_.vt == VT_NULL;
121 const bool other_is_empty = other.vt == VT_EMPTY || other.vt == VT_NULL;
125 return other_is_empty ? 0 : -1;
133 const bool this_is_unknown =
var_.vt == VT_UNKNOWN ||
var_.vt == VT_DISPATCH;
134 const bool other_is_unknown =
135 other.vt == VT_UNKNOWN || other.vt == VT_DISPATCH;
136 if (this_is_unknown && other_is_unknown) {
140 Microsoft::WRL::ComPtr<IUnknown> this_unknown;
141 Microsoft::WRL::ComPtr<IUnknown> other_unknown;
142 V_UNKNOWN(&
var_)->QueryInterface(IID_PPV_ARGS(&this_unknown));
143 V_UNKNOWN(&other)->QueryInterface(IID_PPV_ARGS(&other_unknown));
144 if (this_unknown.Get() == other_unknown.Get())
148 return std::less<>{}(this_unknown.Get(), other_unknown.Get()) ? -1 : 1;
152 if (V_VT(&
var_) != V_VT(&other))
153 return (V_VT(&
var_) < V_VT(&other)) ? -1 : 1;
155 const VARTYPE shared_vartype = V_VT(&
var_);
158 if (shared_vartype == VT_BSTR) {
159 ULONG flags = ignore_case ? NORM_IGNORECASE : 0;
161 ::VarBstrCmp(V_BSTR(&
var_), V_BSTR(&other), LOCALE_USER_DEFAULT,
flags);
163 <<
"unsupported variant comparison: " <<
var_.vt <<
" and " << other.vt;
178 return ::VariantCompare(
var_, other);