Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qcomtaskresource_p.h
Go to the documentation of this file.
1// Copyright (C) 2023 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//
5// W A R N I N G
6// -------------
7//
8// This file is not part of the Qt API. It exists purely as an
9// implementation detail. This header file may change from version to
10// version without notice, or even be removed.
11//
12// We mean it.
13//
14
15#ifndef QCOMTASKRESOURCE_P_H
16#define QCOMTASKRESOURCE_P_H
17
18#include <QtCore/qassert.h>
19
20#include <objbase.h>
21#include <algorithm>
22#include <type_traits>
23#include <utility>
24
25class QEmptyDeleter final
26{
27public:
28 template<typename T>
29 void operator()(T /*element*/) const
30 {
31 }
32};
33
34class QComDeleter final
35{
36public:
37 template<typename T>
38 void operator()(T element) const
39 {
40 element->Release();
41 }
42};
43
44template<typename T>
46{
47public:
48 QComTaskResourceBase(const QComTaskResourceBase<T> &source) = delete;
49 QComTaskResourceBase &operator=(const QComTaskResourceBase<T> &right) = delete;
50
51 explicit operator bool() const { return m_resource != nullptr; }
52
53 T *get() const { return m_resource; }
54
55protected:
57 explicit QComTaskResourceBase(T *const resource) : m_resource(resource) { }
58
59 T *release() { return std::exchange(m_resource, nullptr); }
60
61 void reset(T *const resource = nullptr)
62 {
63 if (m_resource != resource) {
64 if (m_resource)
65 CoTaskMemFree(m_resource);
66 m_resource = resource;
67 }
68 }
69
70 T *m_resource = nullptr;
71};
72
73template<typename T, typename TElementDeleter = QEmptyDeleter>
75{
76 using Base = QComTaskResourceBase<T>;
77
78public:
80
82
83 T *operator->() const { return m_resource; }
84 T &operator*() const { return *m_resource; }
85
86 T **address()
87 {
88 Q_ASSERT(m_resource == nullptr);
89 return &m_resource;
90 }
91
92 using Base::release;
93 using Base::reset;
94
95private:
96 using Base::m_resource;
97};
98
99template<typename T, typename TElementDeleter>
100class QComTaskResource<T[], TElementDeleter> final : public QComTaskResourceBase<T>
101{
102 using Base = QComTaskResourceBase<T>;
103
104public:
105 QComTaskResource() = default;
106 explicit QComTaskResource(T *const resource, const std::size_t size)
107 : Base(resource), m_size(size)
108 {
109 }
110
112
113 T &operator[](const std::size_t index) const
114 {
115 Q_ASSERT(index < m_size);
116 return m_resource[index];
117 }
118
120 {
121 m_size = 0;
122
123 return Base::release();
124 }
125
126 void reset() { reset(nullptr, 0); }
127
128 void reset(T *const resource, const std::size_t size)
129 {
130 if (m_resource != resource) {
131 resetElements();
132
133 Base::reset(resource);
134
135 m_size = size;
136 }
137 }
138
139private:
140 void resetElements()
141 {
142 if constexpr (!std::is_same_v<TElementDeleter, QEmptyDeleter>) {
143 std::for_each(m_resource, m_resource + m_size, TElementDeleter());
144 }
145 }
146
147 std::size_t m_size = 0;
148
149 using Base::m_resource;
150};
151
152#endif
void operator()(T element) const
QComTaskResourceBase & operator=(const QComTaskResourceBase< T > &right)=delete
void reset(T *const resource=nullptr)
QComTaskResourceBase()=default
QComTaskResourceBase(T *const resource)
QComTaskResourceBase(const QComTaskResourceBase< T > &source)=delete
QComTaskResource(T *const resource, const std::size_t size)
T & operator[](const std::size_t index) const
void reset(T *const resource, const std::size_t size)
void operator()(T) const
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint index
[2]
GLdouble GLdouble right
GLsizei GLsizei GLchar * source
GLboolean reset
#define Q_ASSERT(cond)
Definition qrandom.cpp:47