Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qcomvariant_p.h
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QCOMVARIANT_P_H
5#define QCOMVARIANT_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#if defined(Q_OS_WIN) || defined(Q_QDOC)
19
20// clang-format off
21#include <QtCore/private/qglobal_p.h>
22#include <QtCore/qt_windows.h>
23#include <QtCore/private/qbstr_p.h>
24#include <QtCore/private/qcomptr_p.h>
25// clang-format on
26
27QT_BEGIN_NAMESPACE
28
29struct QComVariant
30{
31 // clang-format off
32 QComVariant() noexcept
33 {
34 VariantInit(&m_variant);
35 }
36
37 ~QComVariant() noexcept
38 {
39 clear();
40 }
41
42 explicit QComVariant(bool value) noexcept
43 {
44 m_variant.vt = VT_BOOL;
45 m_variant.boolVal = value ? VARIANT_TRUE : VARIANT_FALSE;
46 }
47
48 explicit QComVariant(int value) noexcept
49 {
50 m_variant.vt = VT_INT;
51 m_variant.intVal = value;
52 }
53
54 explicit QComVariant(long value) noexcept
55 {
56 m_variant.vt = VT_I4;
57 m_variant.lVal = value;
58 }
59
60 explicit QComVariant(double value) noexcept
61 {
62 m_variant.vt = VT_R8;
63 m_variant.dblVal = value;
64 }
65
66 template <typename T>
67 QComVariant(const ComPtr<T> &value) noexcept
68 {
69 static_assert(std::is_base_of_v<IUnknown, T>, "Invalid COM interface");
70 ComPtr<IUnknown> unknown = value;
71 m_variant.vt = VT_UNKNOWN;
72 m_variant.punkVal = unknown.Detach(); // Transfer ownership
73 }
74
75 QComVariant(QBStr &&value) noexcept
76 {
77 m_variant.vt = VT_BSTR;
78 m_variant.bstrVal = value.release(); // Transfer ownership
79 }
80
81 QComVariant(const QString &str)
82 {
83 m_variant.vt = VT_BSTR;
84 m_variant.bstrVal = QBStr{ str }.release(); // Transfer ownership of copy
85 }
86
87 const VARIANT &get() const noexcept
88 {
89 return m_variant;
90 }
91
92 VARIANT &get() noexcept
93 {
94 return m_variant;
95 }
96 // clang-format on
97
98 [[nodiscard]] VARIANT *operator&() noexcept // NOLINT(google-runtime-operator)
99 {
100 clear();
101 return &m_variant;
102 }
103
104 VARIANT release() noexcept
105 {
106 const VARIANT detached{ m_variant };
107 VariantInit(&m_variant);
108 return detached;
109 }
110
111 QComVariant(const QComVariant &) = delete;
112 QComVariant &operator=(const QComVariant &) = delete;
113 QComVariant(QComVariant && other) = delete;
114 QComVariant &operator=(QComVariant &&) = delete;
115
116private:
117
118 void clear()
119 {
120 const HRESULT hr = VariantClear(&m_variant);
121 Q_ASSERT(hr == S_OK);
122 Q_UNUSED(hr)
123
124 VariantInit(&m_variant); // Clear value field
125 }
126
127 VARIANT m_variant{};
128};
129
130QT_END_NAMESPACE
131
132#endif // Q_OS_WIN
133
134#endif // QCOMVARIANT_P_H