44 #ifndef QSHAREDPOINTER_H
45 #error Do not include qsharedpointer_impl.h directly
58 #pragma qt_sync_stop_processing
77 # define QSHAREDPOINTER_VERIFY_AUTO_CAST(T, X) qt_noop()
81 # define QSHAREDPOINTER_VERIFY_AUTO_CAST(T, X) \
82 qt_sharedpointer_cast_check<T>(static_cast<X *>(0))
91 template <
class X,
class T>
93 template <
class X,
class T>
95 template <
class X,
class T>
99 template <
class X,
class T>
113 template <
class T,
typename Klass,
typename RetVal>
115 { (t->*memberDeleter)(); }
116 template <
class T,
typename Deleter>
133 #ifndef Q_CC_NOKIAX86
134 typedef T *
Basic:: *RestrictedBool;
148 #ifndef Q_CC_NOKIAX86
167 #if defined(Q_NO_TEMPLATE_FRIENDS)
170 template <
class X>
friend class QT_PREPEND_NAMESPACE(QWeakPointer);
198 virtual inline bool destroy() {
return false; }
200 #ifndef QT_NO_QOBJECT
202 Q_CORE_EXPORT
void setQObjectShared(
const QObject *,
bool enable);
219 inline bool destroy() { destroyer(
this);
return true; }
220 inline void operator delete(
void *ptr) { ::operator
delete(ptr); }
221 inline void operator delete(
void *,
void *) { }
228 template <
class T,
typename Deleter>
248 Self *realself =
static_cast<Self *
>(
self);
252 realself->
extra.~CustomDeleter();
260 static inline Self *
create(T *ptr, Deleter userDeleter)
262 # ifdef QT_SHAREDPOINTER_TRACK_POINTERS
263 DestroyerFn destroy = &safetyCheckDeleter;
265 DestroyerFn destroy = &deleter;
267 Self *d =
static_cast<Self *
>(::operator
new(
sizeof(Self)));
271 new (d) BaseClass(destroy);
305 # ifdef QT_SHAREDPOINTER_TRACK_POINTERS
306 DestroyerFn destroy = &safetyCheckDeleter;
308 DestroyerFn destroy = &deleter;
315 new (d) Parent(destroy);
330 class ExternalRefCount:
public Basic<T>
336 { deref(d, this->
value); }
350 #ifdef QT_SHAREDPOINTER_TRACK_POINTERS
357 internalFinishConstruction(ptr);
361 template <
typename Deleter>
368 internalFinishConstruction(ptr);
381 #ifdef QT_SHAREDPOINTER_TRACK_POINTERS
384 if (ptr) d->setQObjectShared(ptr,
true);
392 template <
typename Deleter>
407 T *actual = other.value;
421 #if defined(Q_NO_TEMPLATE_FRIENDS)
425 template <
class X>
friend class QT_PREPEND_NAMESPACE(QWeakPointer);
428 inline void ref()
const { d->weakref.ref(); d->strongref.ref(); }
451 if (!d || d->strongref == 0)
476 template <
typename Deleter>
483 BaseClass::internalCopy(other);
486 #ifdef Q_COMPILER_RVALUE_REFS
502 BaseClass::internalCopy(other);
508 { this->d = 0; *
this = other; }
512 { BaseClass::internalSet(other.d, other.value);
return *
this; }
520 return qSharedPointerCast<X, T>(*this);
526 return qSharedPointerDynamicCast<X, T>(*this);
532 return qSharedPointerConstCast<X, T>(*this);
535 #ifndef QT_NO_QOBJECT
539 return qSharedPointerObjectCast<X, T>(*this);
557 new (result.
data()) T();
566 #ifndef Q_CC_NOKIAX86
580 inline bool isNull()
const {
return d == 0 || d->strongref == 0 ||
value == 0; }
581 #ifndef Q_CC_NOKIAX86
582 inline operator RestrictedBool()
const {
return isNull() ? 0 : &QWeakPointer::value; }
584 inline operator bool()
const {
return isNull() ? 0 : &QWeakPointer::value; }
587 inline T *
data()
const {
return d == 0 || d->strongref == 0 ? 0 :
value; }
592 #ifndef QT_NO_QOBJECT
603 {
if (d) d->weakref.ref(); }
606 internalSet(o.d, o.value);
611 {
if (d) d->weakref.ref();}
614 internalSet(o.
d, o.
value);
633 {
return d == o.d &&
value ==
static_cast<const T *
>(o.value); }
637 {
return !(*
this == o); }
647 internalSet(o.
d, o.
data());
657 {
return !(*
this == o); }
663 #if defined(QWEAKPOINTER_ENABLE_ARROW)
669 #if defined(Q_NO_TEMPLATE_FRIENDS)
693 template <
class T,
class X>
698 template <
class T,
class X>
704 template <
class T,
class X>
707 return ptr1.
data() == ptr2;
709 template <
class T,
class X>
712 return ptr1 == ptr2.
data();
714 template <
class T,
class X>
717 return !(ptr1 == ptr2);
719 template <
class T,
class X>
722 return !(ptr2 == ptr1);
725 template <
class T,
class X>
730 template <
class T,
class X>
739 template <
class T,
class X>
744 template <
class T,
class X>
747 return ptr1.
data() - ptr2;
749 template <
class T,
class X>
752 return ptr1 - ptr2.
data();
758 template <
class T,
class X>
761 return ptr1.
data() < ptr2.data();
763 template <
class T,
class X>
764 Q_INLINE_TEMPLATE
bool operator<(const QSharedPointer<T> &ptr1, X *ptr2)
766 return ptr1.data() < ptr2;
768 template <
class T,
class X>
769 Q_INLINE_TEMPLATE
bool operator<(T *ptr1, const QSharedPointer<X> &ptr2)
771 return ptr1 < ptr2.data();
777 template <
class T>
inline uint
qHash(
const T *key);
809 template <
class X,
class T>
819 template <
class X,
class T>
822 register X *ptr =
static_cast<X *
>(src.
data());
825 template <
class X,
class T>
828 return qSharedPointerCast<X, T>(src.
toStrongRef());
831 template <
class X,
class T>
834 register X *ptr =
dynamic_cast<X *
>(src.
data());
839 template <
class X,
class T>
842 return qSharedPointerDynamicCast<X, T>(src.
toStrongRef());
845 template <
class X,
class T>
848 register X *ptr =
const_cast<X *
>(src.
data());
851 template <
class X,
class T>
854 return qSharedPointerConstCast<X, T>(src.
toStrongRef());
857 template <
class X,
class T>
861 return qSharedPointerCast<X, T>(
src).toWeakRef();
864 #ifndef QT_NO_QOBJECT
865 template <
class X,
class T>
871 template <
class X,
class T>
874 return qSharedPointerObjectCast<X>(src.
toStrongRef());
877 template <
class X,
class T>
881 return qSharedPointerObjectCast<typename QtSharedPointer::RemovePointer<X>::Type, T>(
src);
883 template <
class X,
class T>
887 return qSharedPointerObjectCast<typename QtSharedPointer::RemovePointer<X>::Type, T>(
src);
QSharedPointer(Qt::Initialization i)
QBasicAtomicInt strongref
Basic(Qt::Initialization)
QSharedPointer< T > & operator=(const QWeakPointer< X > &other)
QSharedPointer< typename QtSharedPointer::RemovePointer< X >::Type > qobject_cast(const QSharedPointer< T > &src)
QSharedPointer(const QSharedPointer< T > &other)
friend class QT_PREPEND_NAMESPACE(QWeakPointer)
QWeakPointer(const QWeakPointer< X > &o)
const value_type & const_reference
static void deref(Data *d, T *value)
void internalSet(Data *o, T *actual)
void internalFinishConstruction(T *ptr)
ExternalRefCount(T *ptr, Deleter deleter)
typedef void(APIENTRYP PFNGLBLENDCOLORPROC)(GLclampf red
bool operator!=(const QSharedPointer< X > &o) const
QSharedPointer< T > & operator=(const QSharedPointer< X > &other)
void internalSwap(ExternalRefCount &other)
Q_CORE_EXPORT void internalSafetyCheckRemove2(const void *)
void swap(QSharedPointer &other)
ExternalRefCount(Qt::Initialization i)
static void deleter(ExternalRefCountData *self)
void setQObjectShared(...)
const value_type * const_pointer
ExternalRefCountWithDestroyFn Parent
bool operator!=(const QWeakPointer< X > &o) const
QSharedPointer< T > toStrongRef() const
QSharedPointer< T > & operator=(const QSharedPointer< T > &other)
QSharedPointer< X > constCast() const
static Self * create(T *ptr, Deleter userDeleter)
#define QT_BEGIN_NAMESPACE
GLsizei GLsizei GLenum GLenum const GLvoid * data
QWeakPointer(const QSharedPointer< T > &o)
QSharedPointer< X > dynamicCast() const
QSharedPointer< X > staticCast() const
void internalConstruct(T *ptr, Deleter deleter)
QSharedPointer(T *ptr, Deleter d)
QWeakPointer(const QSharedPointer< X > &o)
QWeakPointer< T > & operator=(const QSharedPointer< X > &o)
bool testAndSetRelaxed(int expectedValue, int newValue)
QSharedPointer< X > copyAndSetPointer(X *ptr, const QSharedPointer< Y > &src)
ExternalRefCount(const ExternalRefCount< X > &other)
CustomDeleter(T *p, Deleter d)
#define QSHAREDPOINTER_VERIFY_AUTO_CAST(T, X)
Q_CORE_EXPORT void internalSafetyCheckAdd2(const void *, const volatile void *)
ExternalRefCountWithDestroyFn BaseClass
static void safetyCheckDeleter(ExternalRefCountData *self)
Q_INLINE_TEMPLATE QWeakPointer< X > qWeakPointerCast(const QSharedPointer< T > &src)
QSharedPointer< X > qSharedPointerObjectCast(const QSharedPointer< T > &ptr)
QSharedPointer< X > qSharedPointerDynamicCast(const QSharedPointer< T > &ptr)
void swap(QT_PREPEND_NAMESPACE(QSharedPointer)< T > &p1, QT_PREPEND_NAMESPACE(QSharedPointer)< T > &p2)
GLsizei const GLfloat * value
void executeDeleter(T *t, RetVal(Klass::*memberDeleter)())
QSharedPointer(const QSharedPointer< X > &other)
static QSharedPointer< T > create()
bool operator==(const QWeakPointer< X > &o) const
static void deleter(ExternalRefCountData *self)
QSharedPointer< X > objectCast() const
ExternalRefCountData Data
Q_INLINE_TEMPLATE QSharedPointer< T >::difference_type operator-(const QSharedPointer< T > &ptr1, const QSharedPointer< X > &ptr2)
void internalConstruct(T *ptr)
QWeakPointer(const QWeakPointer< T > &o)
void internalConstruct(T *ptr)
ExternalRefCountData(Qt::Initialization)
const value_type & const_reference
QWeakPointer< T > toWeakRef() const
QSharedPointer< X > qSharedPointerCast(const QSharedPointer< T > &ptr)
bool operator==(const QSharedPointer< T > &ptr1, const QSharedPointer< X > &ptr2)
QWeakPointer< T > & operator=(const QWeakPointer< X > &o)
QWeakPointer & operator=(X *ptr)
static ExternalRefCountData * create(T **ptr)
QT_BEGIN_HEADER QT_BEGIN_NAMESPACE void qt_sharedpointer_cast_check(T *)
ExternalRefCountWithCustomDeleter Self
ExternalRefCount(const ExternalRefCount< T > &other)
Q_DECLARE_TYPEINFO_BODY(QWeakPointer< T >, Q_MOVABLE_TYPE)
virtual ~ExternalRefCountData()
QWeakPointer< T > & operator=(const QWeakPointer< T > &o)
QSharedPointer< X > qSharedPointerConstCast(const QSharedPointer< T > &ptr)
ExternalRefCountWithDestroyFn(DestroyerFn d)
bool operator!=(const QSharedPointer< T > &ptr1, const QSharedPointer< X > &ptr2)
QSharedPointer(const QWeakPointer< X > &other)
const value_type * const_pointer
QWeakPointer< T > & operator=(const QSharedPointer< T > &o)
bool operator==(const QSharedPointer< X > &o) const
static void safetyCheckDeleter(ExternalRefCountData *self)
void internalCopy(const ExternalRefCount< X > &other)
void qSwap(QSharedPointer< T > &p1, QSharedPointer< T > &p2)