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
qshareddata.cpp
Go to the documentation of this file.
1
// Copyright (C) 2016 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
#
include
<
qshareddata
.
h
>
5
6
QT_BEGIN_NAMESPACE
7
8
/*!
9
\class QSharedData
10
\inmodule QtCore
11
\brief The QSharedData class is a base class for shared data objects.
12
\reentrant
13
14
QSharedData is designed to be used with QSharedDataPointer or
15
QExplicitlySharedDataPointer to implement custom \l{implicitly
16
shared} or explicitly shared classes. QSharedData provides
17
\l{thread-safe} reference counting.
18
19
See QSharedDataPointer and QExplicitlySharedDataPointer for details.
20
*/
21
22
/*! \fn QSharedData::QSharedData()
23
Constructs a QSharedData object with a reference count of 0.
24
*/
25
26
/*! \fn QSharedData::QSharedData(const QSharedData& )
27
Constructs a QSharedData object with reference count 0.
28
The parameter is ignored.
29
*/
30
31
/*!
32
\class QAdoptSharedDataTag
33
\inmodule QtCore
34
\threadsafe
35
\brief The QAdoptSharedDataTag is a helper tag class.
36
\since 6.0
37
38
QAdoptSharedDataTag objects are used in QSharedDataPointer
39
and QExplicitlySharedDataPointer to adopt a pointer to
40
shared data.
41
42
See QSharedDataPointer and QExplicitlySharedDataPointer for details.
43
*/
44
45
/*!
46
\class QSharedDataPointer
47
\inmodule QtCore
48
\brief The QSharedDataPointer class represents a pointer to an implicitly shared object.
49
\since 4.0
50
\reentrant
51
52
\compares strong
53
\compareswith strong T* std::nullptr_t
54
\endcompareswith
55
56
QSharedDataPointer<T> makes writing your own \l {implicitly
57
shared} classes easy. QSharedDataPointer implements \l {thread-safe}
58
reference counting, ensuring that adding QSharedDataPointers to your
59
\l {reentrant} classes won't make them non-reentrant.
60
61
\l {Implicit sharing} is used by many Qt classes to combine the
62
speed and memory efficiency of pointers with the ease of use of
63
classes. See the \l{Shared Classes} page for more information.
64
65
\target Employee example
66
Suppose you want to make an \c Employee class implicitly shared. The
67
procedure is:
68
69
\list
70
71
\li Define the class \c Employee to have a single data member of
72
type \c {QSharedDataPointer<EmployeeData>}.
73
74
\li Define the \c EmployeeData class derived from \l QSharedData to
75
contain all the data members you would normally have put in the
76
\c Employee class.
77
78
\endlist
79
80
To show this in practice, we review the source code for the
81
implicitly shared \c Employee class. In the header file we define the
82
two classes \c Employee and \c EmployeeData.
83
84
\snippet sharedemployee/employee.h 0
85
86
In class \c Employee, note the single data member, a \e {d pointer}
87
of type \c {QSharedDataPointer<EmployeeData>}. All accesses of
88
employee data must go through the \e {d pointer's} \c
89
{operator->()}. For write accesses, \c {operator->()} will
90
automatically call detach(), which creates a copy of the shared data
91
object if the shared data object's reference count is greater than
92
1. This ensures that writes to one \c Employee object don't affect
93
any other \c Employee objects that share the same \c EmployeeData
94
object.
95
96
Class \c EmployeeData inherits QSharedData, which provides the
97
\e{behind the scenes} reference counter. \c EmployeeData has a default
98
constructor, a copy constructor, and a destructor. Normally, trivial
99
implementations of these are all that is needed in the \e {data}
100
class for an implicitly shared class.
101
102
Implementing the two constructors for class \c Employee is also
103
straightforward. Both create a new instance of \c EmployeeData
104
and assign it to the \e{d pointer} .
105
106
\snippet sharedemployee/employee.h 1
107
\codeline
108
\snippet sharedemployee/employee.h 2
109
110
Note that class \c Employee also has a trivial copy constructor
111
defined, which is not strictly required in this case.
112
113
\snippet sharedemployee/employee.h 7
114
115
The copy constructor is not strictly required here, because class \c
116
EmployeeData is included in the same file as class \c Employee
117
(\c{employee.h}). However, including the private subclass of
118
QSharedData in the same file as the public class containing the
119
QSharedDataPointer is not typical. Normally, the idea is to hide the
120
private subclass of QSharedData from the user by putting it in a
121
separate file which would not be included in the public file. In
122
this case, we would normally put class \c EmployeeData in a separate
123
file, which would \e{not} be included in \c{employee.h}. Instead, we
124
would just predeclare the private subclass \c EmployeeData in \c
125
{employee.h} this way:
126
127
\snippet code/src_corelib_tools_qshareddata.cpp 0
128
129
If we had done it that way here, the copy constructor shown would be
130
required. Since the copy constructor is trivial, you might as well
131
just always include it.
132
133
Behind the scenes, QSharedDataPointer automatically increments the
134
reference count whenever an \c Employee object is copied, assigned,
135
or passed as a parameter. It decrements the reference count whenever
136
an \c Employee object is deleted or goes out of scope. The shared
137
\c EmployeeData object is deleted automatically if and when the
138
reference count reaches 0.
139
140
In a non-const member function of \c Employee, whenever the \e {d
141
pointer} is dereferenced, QSharedDataPointer automatically calls
142
detach() to ensure that the function operates on its own copy of the
143
data.
144
145
\snippet sharedemployee/employee.h 3
146
\codeline
147
\snippet sharedemployee/employee.h 4
148
149
Note that if detach() is called more than once in a member function
150
due to multiple dereferences of the \e {d pointer}, detach() will
151
only create a copy of the shared data the first time it is called,
152
if at all, because on the second and subsequent calls of detach(),
153
the reference count will be 1 again.
154
155
But note that in the second \c Employee constructor, which takes an
156
employee ID and a name, both setId() and setName() are called, but
157
they don't cause \e{copy on write}, because the reference count for
158
the newly constructed \c EmployeeData object has just been set to 1.
159
160
In \c Employee's \e const member functions, dereferencing the \e {d
161
pointer} does \e not cause detach() to be called.
162
163
\snippet sharedemployee/employee.h 5
164
\codeline
165
\snippet sharedemployee/employee.h 6
166
167
Notice that there is no need to implement a copy constructor or an
168
assignment operator for the \c Employee class, because the copy
169
constructor and assignment operator provided by the C++ compiler
170
will do the \e{member by member} shallow copy required. The only
171
member to copy is the \e {d pointer}, which is a QSharedDataPointer,
172
whose \c {operator=()} just increments the reference count of the
173
shared \c EmployeeData object.
174
175
\target Implicit vs Explicit Sharing
176
\section1 Implicit vs Explicit Sharing
177
178
Implicit sharing might not be right for the \c Employee class.
179
Consider a simple example that creates two instances of the
180
implicitly shared \c Employee class.
181
182
\snippet sharedemployee/main.cpp 0
183
184
After the second employee e2 is created and e1 is assigned to it,
185
both \c e1 and \c e2 refer to Albrecht Durer, employee 1001. Both \c
186
Employee objects point to the same instance of \c EmployeeData,
187
which has reference count 2. Then \c {e1.setName("Hans Holbein")} is
188
called to change the employee name, but because the reference count
189
is greater than 1, a \e{copy on write} is performed before the name
190
is changed. Now \c e1 and \c e2 point to different \c EmployeeData
191
objects. They have different names, but both have ID 1001, which is
192
probably not what you want. You can, of course, just continue with
193
\c {e1.setId(1002)}, if you really mean to create a second, unique
194
employee, but if you only want to change the employee's name
195
everywhere, consider using \l {QExplicitlySharedDataPointer}
196
{explicit sharing} in the \c Employee class instead of implicit
197
sharing.
198
199
If you declare the \e {d pointer} in the \c Employee class to be
200
\c {QExplicitlySharedDataPointer<EmployeeData>}, then explicit
201
sharing is used and \e{copy on write} operations are not performed
202
automatically (i.e. detach() is not called in non-const
203
functions). In that case, after \c {e1.setName("Hans Holbein")}, the
204
employee's name has been changed, but both e1 and e2 still refer to
205
the same instance of \c EmployeeData, so there is only one employee
206
with ID 1001.
207
208
In the member function documentation, \e{d pointer} always refers
209
to the internal pointer to the shared data object.
210
211
\section1 Optimize Performance for Usage in Qt Containers
212
213
You should consider marking your implicitly shared class as a movable type
214
using the Q_DECLARE_TYPEINFO() macro if it resembles the \c Employee class
215
above and uses a QSharedDataPointer or QExplicitlySharedDataPointer as the
216
only member. This can improve performance and memory efficiency when using
217
Qt's \l{container classes}.
218
219
\sa QSharedData, QExplicitlySharedDataPointer, QScopedPointer, QSharedPointer
220
*/
221
222
/*! \typedef QSharedDataPointer::Type
223
This is the type of the shared data object. The \e{d pointer}
224
points to an object of this type.
225
*/
226
227
/*! \typedef QSharedDataPointer::pointer
228
\internal
229
*/
230
231
/*! \fn template <class T> T& QSharedDataPointer<T>::operator*()
232
Provides access to the shared data object's members.
233
This function calls detach().
234
*/
235
236
/*! \fn template <class T> const T& QSharedDataPointer<T>::operator*() const
237
Provides const access to the shared data object's members.
238
This function does \e not call detach().
239
*/
240
241
/*! \fn template <class T> T* QSharedDataPointer<T>::operator->()
242
Provides access to the shared data object's members.
243
This function calls detach().
244
*/
245
246
/*! \fn template <class T> const T* QSharedDataPointer<T>::operator->() const
247
Provides const access to the shared data object's members.
248
This function does \e not call detach().
249
*/
250
251
/*! \fn template <class T> QSharedDataPointer<T>::operator T*()
252
Returns a pointer to the shared data object.
253
This function calls detach().
254
255
\sa data(), constData()
256
*/
257
258
/*! \fn template <class T> QSharedDataPointer<T>::operator const T*() const
259
Returns a pointer to the shared data object.
260
This function does \e not call detach().
261
*/
262
263
/*! \fn template <class T> T* QSharedDataPointer<T>::data()
264
Returns a pointer to the shared data object.
265
This function calls detach().
266
267
\sa constData()
268
*/
269
270
/*! \fn template <class T> T* QSharedDataPointer<T>::get()
271
\since 6.0
272
273
Same as data(). This function is provided for STL compatibility.
274
*/
275
276
/*! \fn template <class T> const T* QSharedDataPointer<T>::data() const
277
Returns a pointer to the shared data object.
278
This function does \e not call detach().
279
*/
280
281
/*! \fn template <class T> const T* QSharedDataPointer<T>::get() const
282
\since 6.0
283
284
Same as data(). This function is provided for STL compatibility.
285
*/
286
287
/*! \fn template <class T> const T* QSharedDataPointer<T>::take()
288
\since 6.0
289
290
Returns a pointer to the shared object, and resets \e this to be \nullptr.
291
(That is, this function sets the \e{d pointer} of \e this to \nullptr.)
292
293
\note The reference count of the returned object will \b{not} be
294
decremented. This function can be used together with the
295
constructor that takes a QAdoptSharedDataTag tag object to transfer
296
the shared data object without intervening atomic operations.
297
*/
298
299
/*! \fn template <class T> const T* QSharedDataPointer<T>::constData() const
300
Returns a const pointer to the shared data object.
301
This function does \e not call detach().
302
303
\sa data()
304
*/
305
306
/*! \fn template <class T> void QSharedDataPointer<T>::reset(T *ptr = nullptr)
307
\since 6.0
308
309
Sets the \e{d pointer} of \e this to \a ptr and increments \a{ptr}'s reference
310
count if \a ptr is not \nullptr.
311
The reference count of the old shared data object is decremented,
312
and the object deleted if the reference count reaches 0.
313
*/
314
315
/*! \fn template <class T> void QSharedDataPointer<T>::swap(QSharedDataPointer &other)
316
\memberswap{shared data pointer}
317
*/
318
319
/*!
320
\fn template <class T> QSharedDataPointer<T> &QSharedDataPointer<T>::operator=(QSharedDataPointer<T> &&other)
321
322
Move-assigns \a other to this QSharedDataPointer instance.
323
324
\since 5.2
325
*/
326
327
/*! \fn template <class T> bool QSharedDataPointer<T>::operator==(const QSharedDataPointer<T>& lhs, const QSharedDataPointer<T>& rhs)
328
Returns \c true if \a lhs and \a rhs have the same \e{d pointer}.
329
This function does \e not call detach().
330
*/
331
332
/*! \fn template <class T> bool QSharedDataPointer<T>::operator!=(const QSharedDataPointer<T>& lhs, const QSharedDataPointer<T>& rhs)
333
Returns \c true if \a lhs and \a rhs do \e not have the same
334
\e{d pointer}. This function does \e not call detach().
335
*/
336
337
/*! \fn template <class T> bool QSharedDataPointer<T>::operator==(T* const &lhs, const QSharedDataPointer<T>& rhs)
338
Returns \c true if the \e{d pointer} of \a rhs is \a lhs.
339
This function does \e not call detach().
340
*/
341
342
/*! \fn template <class T> bool QSharedDataPointer<T>::operator!=(T* const &lhs, const QSharedDataPointer<T>& rhs)
343
Returns \c true if the \e{d pointer} of \a rhs is \e not \a lhs.
344
\e{d pointer}. This function does \e not call detach().
345
*/
346
347
/*! \fn template <class T> QSharedDataPointer<T>::QSharedDataPointer()
348
Constructs a QSharedDataPointer initialized with \nullptr as \e{d pointer}.
349
*/
350
351
/*!
352
\fn template <class T> QSharedDataPointer<T>::QSharedDataPointer(QSharedDataPointer &&o)
353
354
Move-constructs a QSharedDataPointer instance, making it point at the same
355
object that \a o was pointing to.
356
357
\since 5.2
358
*/
359
360
/*! \fn template <class T> QSharedDataPointer<T>::~QSharedDataPointer()
361
Decrements the reference count of the shared data object.
362
If the reference count becomes 0, the shared data object
363
is deleted. \e This is then destroyed.
364
*/
365
366
/*! \fn template <class T> QSharedDataPointer<T>::QSharedDataPointer(T* data)
367
Constructs a QSharedDataPointer with \e{d pointer} set to
368
\a data and increments \a{data}'s reference count.
369
*/
370
371
/*! \fn template <class T> QSharedDataPointer<T>::QSharedDataPointer(T* data, QAdoptSharedDataTag)
372
\since 6.0
373
Constructs a QSharedDataPointer with \e{d pointer} set to
374
\a data. \a data's reference counter is \b{not} incremented;
375
this can be used to adopt pointers obtained from take().
376
377
\sa take()
378
*/
379
380
/*! \fn template <class T> QSharedDataPointer<T>::QSharedDataPointer(const QSharedDataPointer<T>& o)
381
Sets the \e{d pointer} of \e this to the \e{d pointer} in
382
\a o and increments the reference count of the shared
383
data object.
384
*/
385
386
/*! \fn template <class T> QSharedDataPointer<T>& QSharedDataPointer<T>::operator=(const QSharedDataPointer<T>& o)
387
Sets the \e{d pointer} of \e this to the \e{d pointer} of
388
\a o and increments the reference count of the shared
389
data object. The reference count of the old shared data
390
object of \e this is decremented. If the reference count
391
of the old shared data object becomes 0, the old shared
392
data object is deleted.
393
*/
394
395
/*! \fn template <class T> QSharedDataPointer& QSharedDataPointer<T>::operator=(T* o)
396
Sets the \e{d pointer} og \e this to \a o and increments
397
\a{o}'s reference count. The reference count of the old
398
shared data object of \e this is decremented. If the reference
399
count of the old shared data object becomes 0, the old shared data
400
object is deleted.
401
*/
402
403
/*! \fn template <class T> bool QSharedDataPointer<T>::operator!() const
404
Returns \c true if the \e{d pointer} of \e this is \nullptr.
405
*/
406
407
/*! \fn template <class T> void QSharedDataPointer<T>::detach()
408
If the shared data object's reference count is greater than 1, this
409
function creates a deep copy of the shared data object and sets the
410
\e{d pointer} of \e this to the copy.
411
412
This function is called automatically by non-const member
413
functions of QSharedDataPointer if \e{copy on write} is
414
required. You don't need to call it yourself.
415
*/
416
417
/*! \fn template <class T> T *QSharedDataPointer<T>::clone()
418
\since 4.5
419
420
Creates and returns a deep copy of the current data. This function
421
is called by detach() when the reference count is greater than 1 in
422
order to create the new copy. This function uses the \e {operator
423
new} and calls the copy constructor of the type T.
424
425
This function is provided so that you may support "virtual copy
426
constructors" for your own types. In order to so, you should declare
427
a template-specialization of this function for your own type, like
428
the example below:
429
430
\snippet code/src_corelib_tools_qshareddata.cpp 1
431
432
In the example above, the template specialization for the clone()
433
function calls the \e {EmployeeData::clone()} virtual function. A
434
class derived from EmployeeData could override that function and
435
return the proper polymorphic type.
436
*/
437
438
/*!
439
\class QExplicitlySharedDataPointer
440
\inmodule QtCore
441
\brief The QExplicitlySharedDataPointer class represents a pointer to an explicitly shared object.
442
\since 4.4
443
\reentrant
444
445
\compares strong
446
\compareswith strong T* std::nullptr_t
447
\endcompareswith
448
449
QExplicitlySharedDataPointer<T> makes writing your own explicitly
450
shared classes easy. QExplicitlySharedDataPointer implements
451
\l {thread-safe} reference counting, ensuring that adding
452
QExplicitlySharedDataPointers to your \l {reentrant} classes won't
453
make them non-reentrant.
454
455
Except for one big difference, QExplicitlySharedDataPointer is just
456
like QSharedDataPointer. The big difference is that member functions
457
of QExplicitlySharedDataPointer \e{do not} do the automatic
458
\e{copy on write} operation (detach()) that non-const members of
459
QSharedDataPointer do before allowing the shared data object to be
460
modified. There is a detach() function available, but if you really
461
want to detach(), you have to call it yourself. This means that
462
QExplicitlySharedDataPointers behave like regular C++ pointers,
463
except that by doing reference counting and not deleting the shared
464
data object until the reference count is 0, they avoid the dangling
465
pointer problem.
466
467
It is instructive to compare QExplicitlySharedDataPointer with
468
QSharedDataPointer by way of an example. Consider the \l {Employee
469
example} in QSharedDataPointer, modified to use explicit sharing as
470
explained in the discussion \l {Implicit vs Explicit Sharing}.
471
472
Note that if you use this class but find you are calling detach() a
473
lot, you probably should be using QSharedDataPointer instead.
474
475
In the member function documentation, \e{d pointer} always refers
476
to the internal pointer to the shared data object.
477
478
\sa QSharedData, QSharedDataPointer
479
*/
480
481
/*! \fn template <class T> T& QExplicitlySharedDataPointer<T>::operator*() const
482
Provides access to the shared data object's members.
483
*/
484
485
/*! \fn template <class T> T* QExplicitlySharedDataPointer<T>::operator->()
486
Provides access to the shared data object's members.
487
*/
488
489
/*! \fn template <class T> const T* QExplicitlySharedDataPointer<T>::operator->() const
490
Provides const access to the shared data object's members.
491
*/
492
493
/*! \fn template <class T> T* QExplicitlySharedDataPointer<T>::data() const
494
Returns a pointer to the shared data object.
495
*/
496
497
/*! \fn template <class T> T* QExplicitlySharedDataPointer<T>::get() const
498
\since 6.0
499
500
Same as data(). This function is provided for STL compatibility.
501
*/
502
503
/*! \fn template <class T> const T* QExplicitlySharedDataPointer<T>::constData() const
504
Returns a const pointer to the shared data object.
505
506
\sa data()
507
*/
508
509
/*! \fn template <class T> void QExplicitlySharedDataPointer<T>::swap(QExplicitlySharedDataPointer &other)
510
\memberswap{explicitly-shared data pointer}
511
*/
512
513
/*! \fn template <class T> bool QExplicitlySharedDataPointer<T>::operator==(const QExplicitlySharedDataPointer<T>& lhs, const QExplicitlySharedDataPointer<T>& rhs)
514
Returns \c true if \a lhs and \a rhs have the same \e{d pointer}.
515
*/
516
517
/*!
518
\fn template <class T> QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer<T>::operator=(QExplicitlySharedDataPointer<T> &&other)
519
520
Move-assigns \a other to this QExplicitlySharedDataPointer instance.
521
522
\since 5.2
523
*/
524
525
/*! \fn template <class T> bool QExplicitlySharedDataPointer<T>::operator==(const T* const &lhs, const QExplicitlySharedDataPointer<T>& rhs)
526
Returns \c true if the \e{d pointer} of \a rhs is \a lhs.
527
*/
528
529
/*! \fn template <class T> bool QExplicitlySharedDataPointer<T>::operator!=(const QExplicitlySharedDataPointer<T>& lhs, const QExplicitlySharedDataPointer<T>& rhs)
530
Returns \c true if \a lhs and \a rhs do \e not have the same
531
\e{d pointer}.
532
*/
533
534
/*! \fn template <class T> bool QExplicitlySharedDataPointer<T>::operator!=(const T* const &lhs, const QExplicitlySharedDataPointer<T>& rhs)
535
Returns \c true if the \e{d pointer} of \a rhs is \e not \a lhs.
536
*/
537
538
/*! \fn template <class T> QExplicitlySharedDataPointer<T>::QExplicitlySharedDataPointer()
539
Constructs a QExplicitlySharedDataPointer initialized with \nullptr
540
as \e{d pointer}.
541
*/
542
543
/*! \fn template <class T> QExplicitlySharedDataPointer<T>::~QExplicitlySharedDataPointer()
544
Decrements the reference count of the shared data object.
545
If the reference count becomes 0, the shared data object
546
is deleted. \e This is then destroyed.
547
*/
548
549
/*!
550
\fn template <class T> QExplicitlySharedDataPointer<T>::QExplicitlySharedDataPointer(QExplicitlySharedDataPointer &&o)
551
552
Move-constructs a QExplicitlySharedDataPointer instance, making it point at the same
553
object that \a o was pointing to.
554
555
\since 5.2
556
*/
557
558
/*! \fn template <class T> QExplicitlySharedDataPointer<T>::QExplicitlySharedDataPointer(T* data)
559
Constructs a QExplicitlySharedDataPointer with \e{d pointer}
560
set to \a data and increments \a{data}'s reference
561
count.
562
*/
563
564
/*! \fn template <class T> QExplicitlySharedDataPointer<T>::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T>& o)
565
This standard copy constructor sets the \e {d pointer} of \e this to
566
the \e {d pointer} in \a o and increments the reference count of
567
the shared data object.
568
*/
569
570
/*! \fn template <class T> template <class X> QExplicitlySharedDataPointer<T>::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X>& o)
571
This copy constructor is different in that it allows \a o to be
572
a different type of explicitly shared data pointer but one that has
573
a compatible shared data object.
574
575
By default, the \e{d pointer} of \a o (of type \c{X *}) gets
576
implicitly converted to the type \c{T *}; the result of this
577
conversion is set as the \e{d pointer} of \e{this}, and the
578
reference count of the shared data object is incremented.
579
*/
580
581
/*! \fn template <class T> QExplicitlySharedDataPointer<T>& QExplicitlySharedDataPointer<T>::operator=(const QExplicitlySharedDataPointer<T>& o)
582
Sets the \e{d pointer} of \e this to the \e{d pointer} of
583
\a o and increments the reference count of the shared
584
data object. The reference count of the old shared data
585
object of \e this is decremented. If the reference count
586
of the old shared data object becomes 0, the old shared
587
data object is deleted.
588
*/
589
590
/*! \fn template <class T> QExplicitlySharedDataPointer& QExplicitlySharedDataPointer<T>::operator=(T* o)
591
Sets the \e{d pointer} of \e this to \a o and
592
increments \a{o}'s reference count. The reference
593
count of the old shared data object of \e this is decremented.
594
If the reference count of the old shared data object becomes
595
0, the old shared data object is deleted.
596
*/
597
598
/*! \fn template <class T> void QExplicitlySharedDataPointer<T>::reset(T *ptr = nullptr)
599
\since 6.0
600
601
Sets the \e{d pointer} of \e this to \a ptr and increments \a{ptr}'s reference
602
count if \a ptr is not \nullptr.
603
The reference count of the old shared data object is decremented,
604
and the object deleted if the reference count reaches 0.
605
*/
606
607
/*! \fn template <class T> T *QExplicitlySharedDataPointer<T>::take()
608
\since 5.12
609
610
Returns a pointer to the shared object, and resets \e this to be \nullptr.
611
(That is, this function sets the \e{d pointer} of \e this to \nullptr.)
612
613
\note The reference count of the returned object will \b{not} be
614
decremented. This function can be used together with the
615
constructor that takes a QAdoptSharedDataTag tag object to transfer
616
the shared data object without intervening atomic operations.
617
*/
618
619
/*! \fn template <class T> QExplicitlySharedDataPointer<T>::operator bool () const
620
Returns \c true if the \e{d pointer} of \e this is \e not null.
621
*/
622
623
/*! \fn template <class T> bool QExplicitlySharedDataPointer<T>::operator!() const
624
Returns \c true if the \e{d pointer} of \e this is \nullptr.
625
*/
626
627
/*! \fn template <class T> void QExplicitlySharedDataPointer<T>::detach()
628
If the shared data object's reference count is greater than 1, this
629
function creates a deep copy of the shared data object and sets the
630
\e{d pointer} of \e this to the copy.
631
632
Because QExplicitlySharedDataPointer does not do the automatic
633
\e{copy on write} operations that members of QSharedDataPointer do,
634
detach() is \e not called automatically anywhere in the member
635
functions of this class. If you find that you are calling detach()
636
everywhere in your code, consider using QSharedDataPointer instead.
637
*/
638
639
/*! \fn template <class T> T *QExplicitlySharedDataPointer<T>::clone()
640
\since 4.5
641
642
Creates and returns a deep copy of the current data. This function
643
is called by detach() when the reference count is greater than 1 in
644
order to create the new copy. This function uses the \e {operator
645
new} and calls the copy constructor of the type T.
646
647
See QSharedDataPointer<T>::clone() for an explanation of how to use it.
648
*/
649
650
/*!
651
\typedef QExplicitlySharedDataPointer::Type
652
653
This is the type of the shared data object. The \e{d pointer}
654
points to an object of this type.
655
*/
656
657
/*! \typedef QExplicitlySharedDataPointer::pointer
658
\internal
659
*/
660
661
QT_END_NAMESPACE
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qstandardpaths_haiku.cpp:21
qtbase
src
corelib
tools
qshareddata.cpp
Generated on Sun Mar 9 2025 00:40:46 for Qt by
1.13.2