Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qsharedhandle_p.h
Go to the documentation of this file.
1
// Copyright (C) 2025 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
QSHAREDHANDLE_P_H
5
#
define
QSHAREDHANDLE_P_H
6
7
#
include
<
QtCore
/
private
/
quniquehandle_p
.
h
>
8
#
include
<
QtCore
/
qtconfigmacros
.
h
>
9
#
include
<
QtCore
/
qcompare
.
h
>
10
11
#
if
__cpp_lib_concepts
12
#
include
<
concepts
>
13
#
endif
14
15
//
16
// W A R N I N G
17
// -------------
18
//
19
// This file is not part of the Qt API. It exists purely as an
20
// implementation detail. This header file may change from version to
21
// version without notice, or even be removed.
22
//
23
// We mean it.
24
//
25
26
QT_BEGIN_NAMESPACE
27
28
namespace
QtPrivate
{
29
30
#
if
__cpp_lib_concepts
31
32
// clang-format off
33
34
// Define a concept for the traits
35
template
<
typename
T
>
36
concept
QSharedHandleTraitsConcept
=
requires
37
{
38
typename
T
::
Type
;
39
40
{
T
::
invalidValue
() }
noexcept
->
std
::
same_as
<
typename
T
::
Type
>;
41
{
T
::
ref
(
std
::
declval
<
typename
T
::
Type
>()) } ->
std
::
same_as
<
typename
T
::
Type
>;
42
{
T
::
unref
(
std
::
declval
<
typename
T
::
Type
>()) } ->
std
::
same_as
<
bool
>;
43
};
44
45
// clang-format on
46
47
#
endif
48
49
#
if
__cpp_lib_concepts
50
template
<
QSharedHandleTraitsConcept
SharedHandleTraits
>
51
#
else
52
template
<
typename
SharedHandleTraits>
53
#
endif
54
struct
UniqueHandleTraitsFromSharedHandleTraits
55
{
56
using
Type
=
typename
SharedHandleTraits::
Type
;
57
58
[[nodiscard]]
static
Type
invalidValue
()
noexcept
(
noexcept
(
SharedHandleTraits
::
invalidValue
()))
59
{
60
return
SharedHandleTraits::invalidValue();
61
}
62
63
[[nodiscard]]
static
bool
64
close
(
Type
handle)
noexcept
(
noexcept
(
SharedHandleTraits
::
unref
(
handle
)))
65
{
66
return
SharedHandleTraits::unref(handle);
67
}
68
};
69
70
#
if
__cpp_lib_concepts
71
template
<
QSharedHandleTraitsConcept
HandleTraits
>
72
#
else
73
template
<
typename
HandleTraits>
74
#
endif
75
struct
QSharedHandle
:
private
QUniqueHandle
<
UniqueHandleTraitsFromSharedHandleTraits
<
HandleTraits
>>
76
{
77
private
:
78
using
BaseClass
=
QUniqueHandle
<
UniqueHandleTraitsFromSharedHandleTraits
<
HandleTraits
>>;
79
80
static
constexpr
bool
BaseResetIsNoexcept =
81
noexcept
(
std
::
declval
<
BaseClass
>().
reset
(
std
::
declval
<
typename
HandleTraits
::
Type
>()));
82
83
static
constexpr
bool
RefIsNoexcept =
84
noexcept
(HandleTraits::ref(std::declval<
typename
HandleTraits::Type>()));
85
86
static
constexpr
bool
BaseMoveIsNoexcept =
87
noexcept
(
std
::
declval
<
BaseClass
>().
operator
=(
std
::
move
(
std
::
declval
<
BaseClass
>())));
88
89
public
:
90
using
typename
BaseClass
::
Type
;
91
92
enum
RefMode
:
uint8_t
93
{
94
HasRef
,
95
NeedsRef
,
96
97
// syntactic sugar
98
AddRef
=
NeedsRef
,
99
NoAddRef
=
HasRef
,
100
};
101
102
QSharedHandle
() =
default
;
103
104
explicit
QSharedHandle
(
typename
HandleTraits::Type object,
RefMode
mode)
105
:
BaseClass
{
mode
==
NeedsRef
?
HandleTraits
::
ref
(
object
) :
object
}
106
{
107
}
108
109
QSharedHandle
(
const
QSharedHandle
&o)
110
:
BaseClass
{
111
HandleTraits
::
ref
(
o
.
get
()),
112
}
113
{
114
}
115
116
QSharedHandle
(
QSharedHandle
&&)
noexcept
=
default
;
117
118
// NOLINTNEXTLINE: bugprone-unhandled-self-assign
119
QSharedHandle
&
operator
=(
const
QSharedHandle
&o)
noexcept
(
RefIsNoexcept
&&
BaseResetIsNoexcept
)
120
{
121
if
(BaseClass::get() != o.get())
122
BaseClass::reset(HandleTraits::ref(o.get()));
123
return
*
this
;
124
};
125
126
QSharedHandle
&
operator
=(
QSharedHandle
&&o)
noexcept
(
BaseMoveIsNoexcept
)
127
{
128
BaseClass::operator=(std::forward<QSharedHandle>(o));
129
return
*
this
;
130
}
131
132
void
reset
(
typename
HandleTraits::Type o,
133
RefMode
mode)
noexcept
(
RefIsNoexcept
&&
BaseResetIsNoexcept
)
134
{
135
if
(mode ==
NeedsRef
)
136
BaseClass::reset(HandleTraits::ref(o));
137
else
138
BaseClass::reset(o);
139
}
140
141
void
reset
()
noexcept
(
BaseResetIsNoexcept
) { BaseClass::reset(); }
142
143
Q_DECLARE_STRONGLY_ORDERED
(
QSharedHandle
);
144
145
using
BaseClass
::
get
;
146
using
BaseClass
::
isValid
;
147
using
BaseClass
::
operator
bool
;
148
using
BaseClass
::
release
;
149
using
BaseClass
::
operator
&;
150
151
void
swap
(
QSharedHandle
&other)
noexcept
(
noexcept
(
std
::
declval
<
BaseClass
>().
swap
(
other
)))
152
{
153
BaseClass::swap(other);
154
}
155
};
156
157
template
<
typename
Trait>
158
void
swap
(
QSharedHandle
<Trait> &lhs,
QSharedHandle
<Trait> &rhs)
noexcept
(
noexcept
(
lhs
.
swap
(
rhs
)))
159
{
160
lhs.swap(rhs);
161
}
162
163
}
// namespace QtPrivate
164
165
QT_END_NAMESPACE
166
167
#
endif
// QSHAREDHANDLE_P_H
QtPrivate
Definition
qalloc.h:29
QtPrivate::swap
void swap(QSharedHandle< Trait > &lhs, QSharedHandle< Trait > &rhs) noexcept(noexcept(lhs.swap(rhs)))
Definition
qsharedhandle_p.h:158
QtPrivate::QSharedHandle
Definition
qsharedhandle_p.h:76
QtPrivate::QSharedHandle::reset
void reset(typename HandleTraits::Type o, RefMode mode) noexcept(RefIsNoexcept &&BaseResetIsNoexcept)
Definition
qsharedhandle_p.h:132
QtPrivate::QSharedHandle::reset
void reset() noexcept(BaseResetIsNoexcept)
Definition
qsharedhandle_p.h:141
QtPrivate::QSharedHandle::RefMode
RefMode
Definition
qsharedhandle_p.h:93
QtPrivate::QSharedHandle::AddRef
@ AddRef
Definition
qsharedhandle_p.h:98
QtPrivate::QSharedHandle::HasRef
@ HasRef
Definition
qsharedhandle_p.h:94
QtPrivate::QSharedHandle::NeedsRef
@ NeedsRef
Definition
qsharedhandle_p.h:95
QtPrivate::QSharedHandle::NoAddRef
@ NoAddRef
Definition
qsharedhandle_p.h:99
QtPrivate::QSharedHandle::operator=
QSharedHandle & operator=(const QSharedHandle &o) noexcept(RefIsNoexcept &&BaseResetIsNoexcept)
Definition
qsharedhandle_p.h:119
QtPrivate::QSharedHandle::operator=
QSharedHandle & operator=(QSharedHandle &&o) noexcept(BaseMoveIsNoexcept)
Definition
qsharedhandle_p.h:126
QtPrivate::QSharedHandle::swap
void swap(QSharedHandle &other) noexcept(noexcept(std::declval< BaseClass >().swap(other)))
Definition
qsharedhandle_p.h:151
QtPrivate::QSharedHandle::QSharedHandle
QSharedHandle()=default
QtPrivate::QSharedHandle::QSharedHandle
QSharedHandle(const QSharedHandle &o)
Definition
qsharedhandle_p.h:109
QtPrivate::QSharedHandle::QSharedHandle
QSharedHandle(typename HandleTraits::Type object, RefMode mode)
Definition
qsharedhandle_p.h:104
QtPrivate::QSharedHandle::QSharedHandle
QSharedHandle(QSharedHandle &&) noexcept=default
QtPrivate::UniqueHandleTraitsFromSharedHandleTraits
Definition
qsharedhandle_p.h:55
QtPrivate::UniqueHandleTraitsFromSharedHandleTraits::invalidValue
static Type invalidValue() noexcept(noexcept(SharedHandleTraits::invalidValue()))
Definition
qsharedhandle_p.h:58
QtPrivate::UniqueHandleTraitsFromSharedHandleTraits::Type
typename SharedHandleTraits::Type Type
Definition
qsharedhandle_p.h:56
QtPrivate::UniqueHandleTraitsFromSharedHandleTraits::close
static bool close(Type handle) noexcept(noexcept(SharedHandleTraits::unref(handle)))
Definition
qsharedhandle_p.h:64
qtmultimedia
src
multimedia
qsharedhandle_p.h
Generated on
for Qt by
1.18.0