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>
49template <
class X,
class T>
51template <
class X,
class T>
53template <
class X,
class T>
57template <
class X,
class T>
62struct EnableInternalData;
74 template <
class T,
typename Klass,
typename RetVal>
76 {
if (
t) (
t->*memberDeleter)(); }
77 template <
class T,
typename Deleter>
127 inline void *
operator new(std::size_t) =
delete;
129 inline void *
operator new(std::size_t,
void *
ptr)
noexcept {
return ptr; }
130 inline void operator delete(
void *
ptr) { ::operator
delete(
ptr); }
131 inline void operator delete(
void *,
void *) { }
135 template <
class T,
typename Deleter>
166 template <
class T,
typename Deleter>
175 Self *realself =
static_cast<Self *
>(self);
176 realself->
extra.execute();
179 realself->
extra.~CustomDeleter<T, Deleter>();
258 template <
typename X>
259 using IfCompatible =
typename std::enable_if<std::is_convertible<X*, T*>::value,
bool>
::type;
274 explicit operator bool() const noexcept {
return !
isNull(); }
286 template <
class X, IfCompatible<X> = true>
291 template <
class X,
typename Deleter, IfCompatible<X> = true>
296 template <
typename Deleter>
315 other.value =
nullptr;
317 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(
QSharedPointer)
319 template <
class X, IfCompatible<X> = true>
325 other.value =
nullptr;
328 template <
class X, IfCompatible<X> = true>
336 template <
class X, IfCompatible<X> = true>
341 template <
class X, IfCompatible<X> = true>
349 template <
class X, IfCompatible<X> = true>
354 template <
class X, IfCompatible<X> = true>
364 template <
typename Deleter>
371 return qSharedPointerCast<X, T>(*
this);
377 return qSharedPointerDynamicCast<X, T>(*
this);
383 return qSharedPointerConstCast<X, T>(*
this);
390 return qSharedPointerObjectCast<X, T>(*
this);
398 template <
typename... Args>
402# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
403 typename Private::DestroyerFn destroy = &Private::safetyCheckDeleter;
405 typename Private::DestroyerFn destroy = &Private::deleter;
407 typename Private::DestroyerFn noDestroy = &Private::noDeleter;
409 typename std::remove_cv<T>::type *
ptr;
410 result.d = Private::create(&
ptr, noDestroy);
415 result.d->destroyer = destroy;
417# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
424#define DECLARE_COMPARE_SET(T1, A1, T2, A2) \
425 friend bool operator==(T1, T2) noexcept \
426 { return A1 == A2; } \
427 friend bool operator!=(T1, T2) noexcept \
430#define DECLARE_TEMPLATE_COMPARE_SET(T1, A1, T2, A2) \
431 template <typename X> \
432 friend bool operator==(T1, T2) noexcept \
433 { return A1 == A2; } \
434 template <typename X> \
435 friend bool operator!=(T1, T2) noexcept \
443#undef DECLARE_TEMPLATE_COMPARE_SET
444#undef DECLARE_COMPARE_SET
455 if (!dd->strongref.deref()) {
458 if (!dd->weakref.deref())
465 ptr->initializeFromSharedPointer(
constCast<
typename std::remove_cv<T>::type>());
470 template <
typename X,
typename Deleter>
474# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
475 typename Private::DestroyerFn actualDeleter = &Private::safetyCheckDeleter;
477 typename Private::DestroyerFn actualDeleter = &Private::deleter;
479 d = Private::create(
ptr, deleter, actualDeleter);
481#ifdef QT_SHAREDPOINTER_TRACK_POINTERS
482 internalSafetyCheckAdd(
d,
ptr);
504 int tmp =
o->strongref.loadRelaxed();
507 if (
o->strongref.testAndSetRelaxed(tmp, tmp + 1))
509 tmp =
o->strongref.loadRelaxed();
515 o->checkQObjectShared(actual);
523 this->
value =
nullptr;
537 template <
typename X>
538 using IfCompatible =
typename std::enable_if<std::is_convertible<X*, T*>::value,
bool>
::type;
550 explicit operator bool() const noexcept {
return !
isNull(); }
565 other.value =
nullptr;
567 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(
QWeakPointer)
569 template <
class X, IfCompatible<X> = true>
575 other.value =
nullptr;
578 template <
class X, IfCompatible<X> = true>
604 internalSet(
o.d,
o.value);
608 template <
class X, IfCompatible<X> = true>
613 template <
class X, IfCompatible<X> = true>
618 *
this =
o.toStrongRef();
622 template <
class X, IfCompatible<X> = true>
627 template <
class X, IfCompatible<X> = true>
630 internalSet(
o.d,
o.data());
642 {
return d ==
o.d &&
value ==
static_cast<const T *
>(
o.value); }
646 {
return !(*
this ==
o); }
654 {
return !(*
this ==
o); }
656 template <
typename X>
659 template <
typename X>
664 {
return p.isNull(); }
666 {
return p.isNull(); }
668 {
return !
p.isNull(); }
670 {
return !
p.isNull(); }
683 template <
class X, IfCompatible<X> = true>
689 inline void internalSet(
Data *
o, T *actual)
694 if (
d && !
d->weakref.deref())
702 inline T *internalData() const noexcept
704 return d ==
nullptr ||
d->strongref.loadRelaxed() == 0 ?
nullptr :
value;
713 template <
typename T>
748template <
class T,
class X>
753template <
class T,
class X>
756 return ptr1.
data() - ptr2;
758template <
class T,
class X>
761 return ptr1 - ptr2.
data();
767template <
class T,
class X>
770 using CT =
typename std::common_type<T *, X *>::type;
771 return std::less<CT>()(ptr1.
data(), ptr2.
data());
773template <
class T,
class X>
776 using CT =
typename std::common_type<T *, X *>::type;
777 return std::less<CT>()(ptr1.
data(), ptr2);
779template <
class T,
class X>
782 using CT =
typename std::common_type<T *, X *>::type;
783 return std::less<CT>()(ptr1, ptr2.
data());
812 template <
class X,
class T>
822template <
class X,
class T>
825 X *
ptr =
static_cast<X *
>(
src.data());
828template <
class X,
class T>
831 return qSharedPointerCast<X, T>(
src.toStrongRef());
834template <
class X,
class T>
837 X *
ptr =
dynamic_cast<X *
>(
src.data());
842template <
class X,
class T>
845 return qSharedPointerDynamicCast<X, T>(
src.toStrongRef());
848template <
class X,
class T>
851 X *
ptr =
const_cast<X *
>(
src.data());
854template <
class X,
class T>
857 return qSharedPointerConstCast<X, T>(
src.toStrongRef());
860template <
class X,
class T>
864 return qSharedPointerCast<X, T>(
src).toWeakRef();
868template <
class X,
class T>
871 X *
ptr = qobject_cast<X *>(
src.data());
874template <
class X,
class T>
877 return qSharedPointerObjectCast<X>(
src.toStrongRef());
880template <
class X,
class T>
884 return qSharedPointerObjectCast<typename QtSharedPointer::RemovePointer<X>::Type, T>(
src);
886template <
class X,
class T>
890 return qSharedPointerObjectCast<typename QtSharedPointer::RemovePointer<X>::Type, T>(
src);
910template <
typename X,
class T>
913 using element_type =
typename std::shared_ptr<X>::element_type;
914 return std::shared_ptr<X>(
src, qobject_cast<element_type *>(
src.get()));
917template <
typename X,
class T>
920 using element_type =
typename std::shared_ptr<X>::element_type;
921 auto castResult = qobject_cast<element_type *>(
src.get());
927 return std::shared_ptr<X>(std::exchange(
src,
nullptr), castResult);
929 return std::shared_ptr<X>();
932template <
typename X,
class T>
935 return qobject_pointer_cast<X>(
src);
938template <
typename X,
class T>
941 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
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 isNull() const noexcept
Returns true if this object refers to \nullptr.
static void deref(Data *dd) noexcept
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 ...
DECLARE_TEMPLATE_COMPARE_SET(const QSharedPointer &p1, p1.data(), const QSharedPointer< X > &p2, p2.data()) private
bool operator!() const noexcept
Returns true if this object refers to \nullptr.
void enableSharedFromThis(const QEnableSharedFromThis< X > *ptr)
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
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)
void internalSet(Data *o, T *actual)
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...
void enableSharedFromThis(...)
const value_type & const_reference
Q_NODISCARD_CTOR QSharedPointer(std::nullptr_t, Deleter deleter)
Q_NODISCARD_CTOR QSharedPointer(const QWeakPointer< X > &other)
void internalConstruct(X *ptr, Deleter deleter)
const value_type * const_pointer
void internalSwap(QSharedPointer &other) noexcept
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...
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 ref() const noexcept
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)
const value_type & const_reference
friend bool operator!=(const QWeakPointer &p, std::nullptr_t)
Q_NODISCARD_CTOR QWeakPointer(QWeakPointer &&other) 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
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
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.
~QWeakPointer()
Destroys this QWeakPointer object.
bool operator!=(const QSharedPointer< X > &o) const noexcept
friend bool operator!=(std::nullptr_t, const QWeakPointer &p)
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(QWeakPointer< X > &&other) noexcept
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)
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)
Q_CORE_EXPORT void setQObjectShared(const QObject *, bool enable)
Q_CORE_EXPORT void checkQObjectShared(const QObject *)
void checkQObjectShared(...)
ExternalRefCountData(DestroyerFn d)
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