8#ifndef QSHAREDPOINTER_H
9#error Do not include qsharedpointer_impl.h directly
13#pragma qt_sync_skip_header_check
14#pragma qt_sync_stop_processing
24#pragma qt_sync_stop_processing
28#include <QtCore/qatomic.h>
29#include <QtCore/qhashfunctions.h>
30#include <QtCore/qmetatype.h>
31#include <QtCore/qxptype_traits.h>
50template <
class X,
class T>
52template <
class X,
class T>
54template <
class X,
class T>
58template <
class X,
class T>
63struct EnableInternalData;
75 template <
class T,
typename Klass,
typename RetVal>
77 {
if (
t) (
t->*memberDeleter)(); }
78 template <
class T,
typename Deleter>
124 inline void checkQObjectShared(...) { }
130 inline void *
operator new(std::size_t) =
delete;
132 inline void *
operator new(std::size_t,
void *
ptr)
noexcept {
return ptr; }
133 inline void operator delete(
void *
ptr) { ::operator
delete(
ptr); }
134 inline void operator delete(
void *,
void *) { }
138 template <
class T,
typename Deleter>
169 template <
class T,
typename Deleter>
178 Self *realself =
static_cast<Self *
>(self);
179 realself->
extra.execute();
182 realself->extra.~CustomDeleter<T, Deleter>();
195 new (&
d->extra) CustomDeleter<T, Deleter>(
ptr, userDeleter);
261 template <
typename X>
262 using IfCompatible =
typename std::enable_if<std::is_convertible<X*, T*>::value,
bool>
::type;
277 explicit operator bool() const noexcept {
return !
isNull(); }
289 template <
class X, IfCompatible<X> = true>
294 template <
class X,
typename Deleter, IfCompatible<X> = true>
297 { internalConstruct(
ptr, deleter); }
299 template <
typename Deleter>
302 { internalConstruct(
static_cast<T *
>(
nullptr), deleter); }
318 other.value =
nullptr;
320 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(
QSharedPointer)
322 template <
class X, IfCompatible<X> = true>
328 other.value =
nullptr;
331 template <
class X, IfCompatible<X> = true>
339 template <
class X, IfCompatible<X> = true>
344 template <
class X, IfCompatible<X> = true>
352 template <
class X, IfCompatible<X> = true>
357 template <
class X, IfCompatible<X> = true>
359 { internalSet(
other.d,
other.value);
return *
this; }
362 { this->internalSwap(
other); }
367 template <
typename Deleter>
374 return qSharedPointerCast<X, T>(*
this);
380 return qSharedPointerDynamicCast<X, T>(*
this);
386 return qSharedPointerConstCast<X, T>(*
this);
393 return qSharedPointerObjectCast<X, T>(*
this);
401 template <
typename... Args>
405# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
406 typename Private::DestroyerFn destroy = &Private::safetyCheckDeleter;
408 typename Private::DestroyerFn destroy = &Private::deleter;
410 typename Private::DestroyerFn noDestroy = &Private::noDeleter;
412 typename std::remove_cv<T>::type *
ptr;
413 result.d = Private::create(&
ptr, noDestroy);
418 result.d->destroyer = destroy;
420# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
427#define DECLARE_COMPARE_SET(T1, A1, T2, A2) \
428 friend bool operator==(T1, T2) noexcept \
429 { return A1 == A2; } \
430 friend bool operator!=(T1, T2) noexcept \
433#define DECLARE_TEMPLATE_COMPARE_SET(T1, A1, T2, A2) \
434 template <typename X> \
435 friend bool operator==(T1, T2) noexcept \
436 { return A1 == A2; } \
437 template <typename X> \
438 friend bool operator!=(T1, T2) noexcept \
446#undef DECLARE_TEMPLATE_COMPARE_SET
447#undef DECLARE_COMPARE_SET
449 template <
typename X>
451 {
return std::less<>()(d,
other.d); }
452 template <
typename X>
454 {
return std::less<>()(d,
other.d); }
456 template <
typename X>
458 {
return d ==
other.d; }
459 template <
typename X>
461 {
return d ==
other.d; }
464 {
return std::hash<Data *>()(d); }
470 void deref() noexcept
472 static void deref(Data *dd)
noexcept
475 if (!dd->strongref.deref()) {
478 if (!dd->weakref.deref())
483 inline void enableSharedFromThis(
const QEnableSharedFromThis<X> *
ptr)
485 ptr->initializeFromSharedPointer(
constCast<
typename std::remove_cv<T>::type>());
488 inline void enableSharedFromThis(...) {}
490 template <
typename X,
typename Deleter>
491 inline void internalConstruct(X *
ptr, Deleter deleter)
494# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
495 typename Private::DestroyerFn actualDeleter = &Private::safetyCheckDeleter;
497 typename Private::DestroyerFn actualDeleter = &Private::deleter;
499 d = Private::create(
ptr, deleter, actualDeleter);
501#ifdef QT_SHAREDPOINTER_TRACK_POINTERS
504 enableSharedFromThis(
ptr);
518 inline void internalSet(Data *
o, T *actual)
523 int tmp =
o->strongref.loadRelaxed();
526 if (
o->strongref.testAndSetRelaxed(tmp, tmp + 1))
528 tmp =
o->strongref.loadRelaxed();
540 this->
value =
nullptr;
554 template <
typename X>
555 using IfCompatible =
typename std::enable_if<std::is_convertible<X*, T*>::value,
bool>
::type;
557 template <
typename X>
558 using IfVirtualBase =
typename std::enable_if<qxp::is_virtual_base_of_v<T, X>,
bool>
::type;
560 template <
typename X>
561 using IfNotVirtualBase =
typename std::enable_if<!qxp::is_virtual_base_of_v<T, X>,
bool>
::type;
573 explicit operator bool() const noexcept {
return !
isNull(); }
588 other.value =
nullptr;
590 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(
QWeakPointer)
592 template <
class X, IfCompatible<X> = true, IfNotVirtualBase<X> = true>
595 : d(std::exchange(
other.d,
nullptr)),
600 template <
class X, IfCompatible<X> = true, IfVirtualBase<X> = true>
606 other.value =
nullptr;
609 template <
class X, IfCompatible<X> = true>
635 internalSet(
o.d,
o.value);
639 template <
class X, IfCompatible<X> = true>
644 template <
class X, IfCompatible<X> = true>
649 *
this =
o.toStrongRef();
653 template <
class X, IfCompatible<X> = true>
658 template <
class X, IfCompatible<X> = true>
661 internalSet(
o.d,
o.data());
667 [[nodiscard]] QSharedPointer<T>
toStrongRef()
const {
return QSharedPointer<T>(*
this); }
673 {
return d ==
o.d &&
value ==
static_cast<const T *
>(
o.value); }
677 {
return !(*
this ==
o); }
685 {
return !(*
this ==
o); }
687 template <
typename X>
690 template <
typename X>
695 {
return p.isNull(); }
697 {
return p.isNull(); }
699 {
return !
p.isNull(); }
701 {
return !
p.isNull(); }
703 template <
typename X>
705 {
return std::less<>()(d,
other.d); }
706 template <
typename X>
708 {
return std::less<>()(d,
other.d); }
710 template <
typename X>
712 {
return d ==
other.d; }
713 template <
typename X>
715 {
return d ==
other.d; }
718 {
return std::hash<Data *>()(d); }
728 {
return *
this = QWeakPointer<T>(
ptr,
true); }
731 template <
class X, IfCompatible<X> = true>
737 inline void internalSet(
Data *
o, T *actual)
742 if (
d && !
d->weakref.deref())
750 inline T *internalData() const noexcept
752 return d ==
nullptr ||
d->strongref.loadRelaxed() == 0 ?
nullptr :
value;
761 template <
typename T>
762 static T *
internalData(
const QWeakPointer<T> &
p)
noexcept {
return p.internalData(); }
779 inline QSharedPointer<T>
sharedFromThis() {
return QSharedPointer<T>(weakPointer); }
780 inline QSharedPointer<const T>
sharedFromThis()
const {
return QSharedPointer<const T>(weakPointer); }
785 inline void initializeFromSharedPointer(
const QSharedPointer<X> &
ptr)
const
790 mutable QWeakPointer<T> weakPointer;
796template <
class T,
class X>
799 return ptr1.data() - ptr2.data();
801template <
class T,
class X>
804 return ptr1.data() - ptr2;
806template <
class T,
class X>
809 return ptr1 - ptr2.data();
815template <
class T,
class X>
816Q_INLINE_TEMPLATE
bool operator<(
const QSharedPointer<T> &ptr1,
const QSharedPointer<X> &ptr2)
818 using CT =
typename std::common_type<T *, X *>::type;
819 return std::less<CT>()(ptr1.data(), ptr2.data());
821template <
class T,
class X>
822Q_INLINE_TEMPLATE
bool operator<(
const QSharedPointer<T> &ptr1, X *ptr2)
824 using CT =
typename std::common_type<T *, X *>::type;
825 return std::less<CT>()(ptr1.data(), ptr2);
827template <
class T,
class X>
828Q_INLINE_TEMPLATE
bool operator<(T *ptr1,
const QSharedPointer<X> &ptr2)
830 using CT =
typename std::common_type<T *, X *>::type;
831 return std::less<CT>()(ptr1, ptr2.data());
838Q_INLINE_TEMPLATE
size_t qHash(
const QSharedPointer<T> &
ptr,
size_t seed = 0)
847 return QWeakPointer<T>(*
this);
851inline void swap(QSharedPointer<T> &
p1, QSharedPointer<T> &
p2)
noexcept
855inline void swap(QWeakPointer<T> &
p1, QWeakPointer<T> &
p2)
noexcept
860 template <
class X,
class T>
870template <
class X,
class T>
873 X *
ptr =
static_cast<X *
>(
src.data());
876template <
class X,
class T>
879 return qSharedPointerCast<X, T>(
src.toStrongRef());
882template <
class X,
class T>
885 X *
ptr =
dynamic_cast<X *
>(
src.data());
887 return QSharedPointer<X>();
890template <
class X,
class T>
893 return qSharedPointerDynamicCast<X, T>(
src.toStrongRef());
896template <
class X,
class T>
899 X *
ptr =
const_cast<X *
>(
src.data());
902template <
class X,
class T>
905 return qSharedPointerConstCast<X, T>(
src.toStrongRef());
908template <
class X,
class T>
912 return qSharedPointerCast<X, T>(
src).toWeakRef();
916template <
class X,
class T>
919 X *
ptr = qobject_cast<X *>(
src.data());
922template <
class X,
class T>
925 return qSharedPointerObjectCast<X>(
src.toStrongRef());
928template <
class X,
class T>
929inline QSharedPointer<typename QtSharedPointer::RemovePointer<X>::Type>
932 return qSharedPointerObjectCast<typename QtSharedPointer::RemovePointer<X>::Type, T>(
src);
934template <
class X,
class T>
935inline QSharedPointer<typename QtSharedPointer::RemovePointer<X>::Type>
938 return qSharedPointerObjectCast<typename QtSharedPointer::RemovePointer<X>::Type, T>(
src);
944QWeakPointer<typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<T*>::Value, T>
::type>
950QSharedPointer<typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<T*>::Value, T>
::type>
958template <
typename X,
class T>
961 using element_type =
typename std::shared_ptr<X>::element_type;
962 return std::shared_ptr<X>(
src, qobject_cast<element_type *>(
src.get()));
965template <
typename X,
class T>
968 using element_type =
typename std::shared_ptr<X>::element_type;
969 auto castResult = qobject_cast<element_type *>(
src.get());
975 return std::shared_ptr<X>(std::exchange(
src,
nullptr), castResult);
977 return std::shared_ptr<X>();
980template <
typename X,
class T>
983 return qobject_pointer_cast<X>(
src);
986template <
typename X,
class T>
989 return qobject_pointer_cast<X>(std::move(
src));
void storeRelaxed(T newValue) noexcept
T loadRelaxed() const noexcept
QSharedPointer< T > sharedFromThis()
QEnableSharedFromThis(const QEnableSharedFromThis &)
QEnableSharedFromThis & operator=(const QEnableSharedFromThis &)
QEnableSharedFromThis()=default
QSharedPointer< const T > sharedFromThis() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
void swap(QPixmap &other) noexcept
Swaps pixmap other with this pixmap.
Q_NODISCARD_CTOR QSharedPointer(X *ptr)
Creates a QSharedPointer that points to ptr.
Q_NODISCARD_CTOR QSharedPointer(X *ptr, Deleter deleter)
Creates a QSharedPointer that points to ptr.
bool owner_equal(const QSharedPointer< X > &other) const noexcept
bool isNull() const noexcept
Returns true if this object refers to \nullptr.
Q_NODISCARD_CTOR QSharedPointer(const QSharedPointer &other) noexcept
Creates a QSharedPointer object that shares other's pointer.
QSharedPointer & operator=(QSharedPointer< X > &&other) noexcept
Move-assigns other to this QSharedPointer instance.
QSharedPointer< X > constCast() const
Performs a \tt const_cast from this pointer's type to \tt X and returns a QSharedPointer that shares ...
bool operator!() const noexcept
Returns true if this object refers to \nullptr.
friend class QSharedPointer
Creates a QSharedPointer that is null (the object is holding a reference to \nullptr).
QWeakPointer< T > toWeakRef() const
Returns a weak reference object that shares the pointer referenced by this object.
QSharedPointer< X > objectCast() const
DECLARE_TEMPLATE_COMPARE_SET(const QSharedPointer &p1, p1.data(), const QSharedPointer< X > &p2, p2.data()) template< typename X > bool owner_before(const QSharedPointer< X > &other) const noexcept
QSharedPointer< T > & operator=(const QWeakPointer< X > &other)
Q_NODISCARD_CTOR QSharedPointer(const QSharedPointer< X > &other) noexcept
T * data() const noexcept
Returns the value of the pointer referenced by this object.
void reset(T *t, Deleter deleter)
QSharedPointer< X > dynamicCast() const
Performs a dynamic cast from this pointer's type to \tt X and returns a QSharedPointer that shares th...
~QSharedPointer()
Destroys this QSharedPointer object.
Q_NODISCARD_CTOR QSharedPointer(QSharedPointer &&other) noexcept
Move-constructs a QSharedPointer instance, making it point at the same object that other was pointing...
const value_type & const_reference
size_t owner_hash() const noexcept
bool owner_before(const QWeakPointer< X > &other) const noexcept
Q_NODISCARD_CTOR QSharedPointer(std::nullptr_t, Deleter deleter)
Q_NODISCARD_CTOR QSharedPointer(const QWeakPointer< X > &other)
const value_type * const_pointer
Q_NODISCARD_CTOR constexpr QSharedPointer(std::nullptr_t) noexcept
static QSharedPointer create(Args &&...arguments)
This is an overloaded member function, provided for convenience. It differs from the above function o...
T & operator*() const
Provides access to the shared pointer's members.
QSharedPointer & operator=(const QSharedPointer &other) noexcept
Makes this object share other's pointer.
QSharedPointer< X > staticCast() const
Performs a static cast from this pointer's type to \tt X and returns a QSharedPointer that shares the...
bool owner_equal(const QWeakPointer< X > &other) const noexcept
T * operator->() const noexcept
Provides access to the shared pointer's members.
Q_NODISCARD_CTOR QSharedPointer(QSharedPointer< X > &&other) noexcept
Move-constructs a QSharedPointer instance, making it point at the same object that other was pointing...
void swap(QSharedPointer &other) noexcept
QSharedPointer & operator=(const QSharedPointer< X > &other)
void clear()
Clears this QSharedPointer object, dropping the reference that it may have had to the pointer.
Q_NODISCARD_CTOR constexpr QSharedPointer() noexcept
friend bool operator==(const QWeakPointer &p, std::nullptr_t)
size_t owner_hash() const noexcept
const value_type & const_reference
friend bool operator!=(const QWeakPointer &p, std::nullptr_t)
Q_NODISCARD_CTOR QWeakPointer(QWeakPointer &&other) noexcept
bool owner_before(const QSharedPointer< X > &other) const noexcept
Q_NODISCARD_CTOR QWeakPointer(const QWeakPointer &other) noexcept
Creates a QWeakPointer that holds a weak reference to the pointer referenced by other.
QWeakPointer & operator=(QWeakPointer< X > &&other) noexcept
friend bool operator==(const QSharedPointer< X > &p1, const QWeakPointer &p2) noexcept
QWeakPointer & operator=(const QSharedPointer< X > &o)
QWeakPointer & operator=(const QWeakPointer &other) noexcept
Makes this object share other's pointer.
friend bool operator==(std::nullptr_t, const QWeakPointer &p)
friend bool operator!=(const QSharedPointer< X > &p1, const QWeakPointer &p2) noexcept
bool operator==(const QSharedPointer< X > &o) const noexcept
bool owner_before(const QWeakPointer< X > &other) const noexcept
void clear()
Clears this QWeakPointer object, dropping the reference that it may have had to the pointer.
QSharedPointer< T > toStrongRef() const
Promotes this weak reference to a strong one and returns a QSharedPointer object holding that referen...
QWeakPointer & operator=(const QSharedPointer< T > &o)
Makes this object share other's pointer.
bool operator!() const noexcept
Returns true if this object refers to \nullptr.
bool operator==(const QWeakPointer< X > &o) const noexcept
bool owner_equal(const QWeakPointer< X > &other) const noexcept
Q_NODISCARD_CTOR constexpr QWeakPointer() noexcept
QWeakPointer & operator=(const QWeakPointer< X > &o)
QSharedPointer< T > lock() const
bool operator!=(const QWeakPointer< X > &o) const noexcept
const value_type * const_pointer
Q_NODISCARD_CTOR QWeakPointer(const QWeakPointer< X > &o)
bool isNull() const noexcept
Returns true if this object refers to \nullptr.
friend class QWeakPointer
Creates a QWeakPointer that points to nothing.
Q_NODISCARD_CTOR QWeakPointer(QWeakPointer< X > &&other) noexcept
~QWeakPointer()
Destroys this QWeakPointer object.
bool operator!=(const QSharedPointer< X > &o) const noexcept
friend bool operator!=(std::nullptr_t, const QWeakPointer &p)
bool owner_equal(const QSharedPointer< X > &other) const noexcept
Q_NODISCARD_CTOR QWeakPointer(const QSharedPointer< T > &o)
Creates a QWeakPointer that holds a weak reference to the pointer referenced by other.
Q_NODISCARD_CTOR QWeakPointer(const QSharedPointer< X > &o)
void swap(QWeakPointer &other) noexcept
QList< QVariant > arguments
Combined button and popup list for selecting options.
QSharedPointer< X > copyAndSetPointer(X *ptr, const QSharedPointer< Y > &src)
Q_CORE_EXPORT QWeakPointer< QObject > weakPointerFromVariant_internal(const QVariant &variant)
Q_CORE_EXPORT void internalSafetyCheckRemove(const void *)
void executeDeleter(T *t, RetVal(Klass::*memberDeleter)())
Q_CORE_EXPORT void internalSafetyCheckAdd(const void *, const volatile void *)
Q_CORE_EXPORT QSharedPointer< QObject > sharedPointerFromVariant_internal(const QVariant &variant)
constexpr Initialization Uninitialized
static jboolean copy(JNIEnv *, jobject)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static ControlElement< T > * ptr(QWidget *widget)
T qobject_cast(QObject *object)
\variable QObject::staticMetaObject
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
static Q_CONSTINIT QBasicAtomicInteger< unsigned > seed
QSharedPointer< X > qSharedPointerConstCast(const QSharedPointer< T > &ptr)
Q_INLINE_TEMPLATE QSharedPointer< T >::difference_type operator-(const QSharedPointer< T > &ptr1, const QSharedPointer< X > &ptr2)
QSharedPointer< X > qSharedPointerCast(const QSharedPointer< T > &ptr)
QWeakPointer< typename std::enable_if< QtPrivate::IsPointerToTypeDerivedFromQObject< T * >::Value, T >::type > qWeakPointerFromVariant(const QVariant &variant)
Q_INLINE_TEMPLATE size_t qHash(const QSharedPointer< T > &ptr, size_t seed=0)
#define DECLARE_TEMPLATE_COMPARE_SET(T1, A1, T2, A2)
QSharedPointer< X > qSharedPointerDynamicCast(const QSharedPointer< T > &ptr)
Q_INLINE_TEMPLATE bool operator<(const QSharedPointer< T > &ptr1, const QSharedPointer< X > &ptr2)
std::shared_ptr< X > qobject_pointer_cast(const std::shared_ptr< T > &src)
T qobject_cast(const QObject *object)
QSharedPointer< typename std::enable_if< QtPrivate::IsPointerToTypeDerivedFromQObject< T * >::Value, T >::type > qSharedPointerFromVariant(const QVariant &variant)
#define DECLARE_COMPARE_SET(T1, A1, T2, A2)
QSharedPointer< X > qSharedPointerObjectCast(const QSharedPointer< T > &ptr)
Q_INLINE_TEMPLATE QWeakPointer< X > qWeakPointerCast(const QSharedPointer< T > &src)
constexpr void qt_ptr_swap(T *&lhs, T *&rhs) noexcept
#define Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS)
static T * internalData(const QWeakPointer< T > &p) noexcept
CustomDeleter(T *p, NormalDeleter)
CustomDeleter(T *p, Deleter d)
QBasicAtomicInt strongref
void(* DestroyerFn)(ExternalRefCountData *)
ExternalRefCountData(Qt::Initialization)
ExternalRefCountData(DestroyerFn d)
QT6_ONLY(Q_CORE_EXPORT void setQObjectShared(const QObject *, bool enable);) inline void checkQObjectShared(...)
void setQObjectShared(...)
static Q_CORE_EXPORT ExternalRefCountData * getAndRef(const QObject *)
static void deleter(ExternalRefCountData *self)
static void noDeleter(ExternalRefCountData *)
ExternalRefCountData Parent
std::remove_cv< T >::type NoCVType
static ExternalRefCountData * create(NoCVType **ptr, DestroyerFn destroy)
static void safetyCheckDeleter(ExternalRefCountData *self)
static Self * create(T *ptr, Deleter userDeleter, DestroyerFn actualDeleter)
ExternalRefCountData BaseClass
CustomDeleter< T, Deleter > extra
static void safetyCheckDeleter(ExternalRefCountData *self)
static void deleter(ExternalRefCountData *self)
ExternalRefCountWithCustomDeleter Self