src/corelib/tools/qsharedpointer.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtCore module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qsharedpointer.h"
       
    43 
       
    44 // to be sure we aren't causing a namespace clash:
       
    45 #include "qshareddata.h"
       
    46 
       
    47 /*!
       
    48     \class QSharedPointer
       
    49     \brief The QSharedPointer class holds a strong reference to a shared pointer
       
    50     \since 4.5
       
    51 
       
    52     \reentrant
       
    53 
       
    54     The QSharedPointer is an automatic, shared pointer in C++. It
       
    55     behaves exactly like a normal pointer for normal purposes,
       
    56     including respect for constness.
       
    57 
       
    58     QSharedPointer will delete the pointer it is holding when it goes
       
    59     out of scope, provided no other QSharedPointer objects are
       
    60     referencing it.
       
    61 
       
    62     A QSharedPointer object can be created from a normal pointer,
       
    63     another QSharedPointer object or by promoting a
       
    64     QWeakPointer object to a strong reference.
       
    65 
       
    66     \section1 Thread-Safety
       
    67 
       
    68     QSharedPointer and QWeakPointer are thread-safe and operate
       
    69     atomically on the pointer value. Different threads can also access
       
    70     the same QSharedPointer or QWeakPointer object at the same time
       
    71     without need for locking mechanisms.
       
    72 
       
    73     It should be noted that, while the pointer value can be accessed
       
    74     in this manner, QSharedPointer and QWeakPointer provide no
       
    75     guarantee about the object being pointed to. Thread-safety and
       
    76     reentrancy rules for that object still apply.
       
    77 
       
    78     \section1 Other Pointer Classes
       
    79 
       
    80     Qt also provides two other pointer wrapper classes: QPointer and
       
    81     QSharedDataPointer. They are incompatible with one another, since
       
    82     each has its very different use case.
       
    83 
       
    84     QSharedPointer holds a shared pointer by means of an external
       
    85     reference count (i.e., a reference counter placed outside the
       
    86     object). Like its name indicates, the pointer value is shared
       
    87     among all instances of QSharedPointer and QWeakPointer. The
       
    88     contents of the object pointed to by the pointer should not
       
    89     considered shared, however: there is only one object. For that
       
    90     reason, QSharedPointer does not provide a way to detach or make
       
    91     copies of the pointed object.
       
    92 
       
    93     QSharedDataPointer, on the other hand, holds a pointer to shared
       
    94     data (i.e., a class derived from QSharedData). It does so by means
       
    95     of an internal reference count, placed in the QSharedData base
       
    96     class. This class can, therefore, detach based on the type of
       
    97     access made to the data being guarded: if it's a non-const access,
       
    98     it creates a copy atomically for the operation to complete.
       
    99 
       
   100     QExplicitlySharedDataPointer is a variant of QSharedDataPointer, except
       
   101     that it only detaches if QExplicitlySharedDataPointer::detach() is
       
   102     explicitly called (hence the name).
       
   103 
       
   104     QScopedPointer simply holds a pointer to a heap allocated object and
       
   105     deletes it in its destructor. This class is useful when an object needs to
       
   106     be heap allocated and deleted, but no more. QScopedPointer is lightweight,
       
   107     it makes no use of additional structure or reference counting.
       
   108 
       
   109     Finally, QPointer holds a pointer to a QObject-derived object, but it
       
   110     does so weakly. QPointer can be replaced by QWeakPointer in almost all
       
   111     cases, since they have the same functionality. See
       
   112     \l{QWeakPointer#tracking-qobject} for more information.
       
   113 
       
   114     \section1 Optional pointer tracking
       
   115 
       
   116     A feature of QSharedPointer that can be enabled at compile-time for
       
   117     debugging purposes is a pointer tracking mechanism. When enabled,
       
   118     QSharedPointer registers in a global set all the pointers that it tracks.
       
   119     This allows one to catch mistakes like assigning the same pointer to two
       
   120     QSharedPointer objects.
       
   121 
       
   122     This function is enabled by defining the \tt{QT_SHAREDPOINTER_TRACK_POINTERS}
       
   123     macro before including the QSharedPointer header.
       
   124 
       
   125     It is safe to use this feature even with code compiled without the
       
   126     feature. QSharedPointer will ensure that the pointer is removed from the
       
   127     tracker even from code compiled without pointer tracking.
       
   128 
       
   129     Note, however, that the pointer tracking feature has limitations on
       
   130     multiple- or virtual-inheritance (that is, in cases where two different
       
   131     pointer addresses can refer to the same object). In that case, if a
       
   132     pointer is cast to a different type and its value changes,
       
   133     QSharedPointer's pointer tracking mechanism mail fail to detect that the
       
   134     object being tracked is the same.
       
   135 
       
   136     \omit
       
   137     \secton1 QSharedPointer internals
       
   138 
       
   139     QSharedPointer is in reality implemented by two ancestor classes:
       
   140     QtSharedPointer::Basic and QtSharedPointer::ExternalRefCount. The reason
       
   141     for having that split is now mostly legacy: in the beginning,
       
   142     QSharedPointer was meant to support both internal reference counting and
       
   143     external reference counting.
       
   144 
       
   145     QtSharedPointer::Basic implements the basic functionality that is shared
       
   146     between internal- and external-reference counting. That is, it's mostly
       
   147     the accessor functions into QSharedPointer. Those are all inherited by
       
   148     QSharedPointer, which adds another level of shared functionality (the
       
   149     constructors and assignment operators). The Basic class has one member
       
   150     variable, which is the actual pointer being tracked.
       
   151 
       
   152     QtSharedPointer::ExternalRefCount implements the actual reference
       
   153     counting and introduces the d-pointer for QSharedPointer. That d-pointer
       
   154     itself is shared with with other QSharedPointer objects as well as
       
   155     QWeakPointer.
       
   156 
       
   157     The reason for keeping the pointer value itself outside the d-pointer is
       
   158     because of multiple inheritance needs. If you have two QSharedPointer
       
   159     objects of different pointer types, but pointing to the same object in
       
   160     memory, it could happen that the pointer values are different. The \tt
       
   161     differentPointers autotest exemplifies this problem. The same thing could
       
   162     happen in the case of virtual inheritance: a pointer of class matching
       
   163     the virtual base has different address compared to the pointer of the
       
   164     complete object. See the \tt virtualBaseDifferentPointers autotest for
       
   165     this problem.
       
   166 
       
   167     The d pointer is of type QtSharedPointer::ExternalRefCountData for simple
       
   168     QSharedPointer objects, but could be of a derived type in some cases. It
       
   169     is basically a reference-counted reference-counter.
       
   170 
       
   171     \section2 d-pointer
       
   172     \section3 QtSharedPointer::ExternalRefCountData
       
   173 
       
   174     This class is basically a reference-counted reference-counter. It has two
       
   175     members: \tt strongref and \tt weakref. The strong reference counter is
       
   176     controlling the lifetime of the object tracked by QSharedPointer. a
       
   177     positive value indicates that the object is alive. It's also the number
       
   178     of QSharedObject instances that are attached to this Data.
       
   179 
       
   180     When the strong reference count decreases to zero, the object is deleted
       
   181     (see below for information on custom deleters). The strong reference
       
   182     count can also exceptionally be -1, indicating that there are no
       
   183     QSharedPointers attached to an object, which is tracked too. The only
       
   184     case where this is possible is that of
       
   185     \l{QWeakPointer#tracking-qobject}{QWeakPointers tracking a QObject}.
       
   186 
       
   187     The weak reference count controls the lifetime of the d-pointer itself.
       
   188     It can be thought of as an internal/intrusive reference count for
       
   189     ExternalRefCountData itself. This count is equal to the number of
       
   190     QSharedPointers and QWeakPointers that are tracking this object. (In case
       
   191     the object tracked derives from QObject, this number is increased by 1,
       
   192     since QObjectPrivate tracks it too).
       
   193 
       
   194     ExternalRefCountData is a virtual class: it has a virtual destructor and
       
   195     a virtual destroy() function. The destroy() function is supposed to
       
   196     delete the object being tracked and return true if it does so. Otherwise,
       
   197     it returns false to indicate that the caller must simply call delete.
       
   198     This allows the normal use-case of QSharedPointer without custom deleters
       
   199     to use only one 12- or 16-byte (depending on whether it's a 32- or 64-bit
       
   200     architecture) external descriptor structure, without paying the price for
       
   201     the custom deleter that it isn't using.
       
   202 
       
   203     \section3 QtSharedPointer::ExternalRefCountDataWithDestroyFn
       
   204 
       
   205     This class is not used directly, per se. It only exists to enable the two
       
   206     classes that derive from it. It adds one member variable, which is a
       
   207     pointer to a function (which returns void and takes an
       
   208     ExternalRefCountData* as a parameter). It also overrides the destroy()
       
   209     function: it calls that function pointer with \tt this as parameter, and
       
   210     returns true.
       
   211 
       
   212     That means when ExternalRefCountDataWithDestroyFn is used, the \tt
       
   213     destroyer field must be set to a valid function that \b will delete the
       
   214     object tracked.
       
   215 
       
   216     This class also adds an operator delete function to ensure that simply
       
   217     calls the global operator delete. That should be the behaviour in all
       
   218     compilers already, but to be on the safe side, this class ensures that no
       
   219     funny business happens.
       
   220 
       
   221     On a 32-bit architecture, this class is 16 bytes in size, whereas it's 24
       
   222     bytes on 64-bit. (On Itanium where function pointers contain the global
       
   223     pointer, it can be 32 bytes).
       
   224 
       
   225     \section3 QtSharedPointer::ExternalRefCountWithCustomDeleter
       
   226 
       
   227     This class derives from ExternalRefCountDataWithDestroyFn and is a
       
   228     template class. As template parameters, it has the type of the pointer
       
   229     being tracked (\tt T) and a \tt Deleter, which is anything. It adds two
       
   230     fields to its parent class, matching those template parameters: a member
       
   231     of type \tt Deleter and a member of type \tt T*.
       
   232 
       
   233     The purpose of this class is to store the pointer to be deleted and the
       
   234     deleter code along with the d-pointer. This allows the last strong
       
   235     reference to call any arbitrary function that disposes of the object. For
       
   236     example, this allows calling QObject::deleteLater() on a given object.
       
   237     The pointer to the object is kept here to avoid the extra cost of keeping
       
   238     the deleter in the generic case.
       
   239 
       
   240     This class is never instantiated directly: the constructors and
       
   241     destructor are private. Only the create() function may be called to
       
   242     return an object of this type. See below for construction details.
       
   243 
       
   244     The size of this class depends on the size of \tt Deleter. If it's an
       
   245     empty functor (i.e., no members), ABIs generally assign it the size of 1.
       
   246     But given that it's followed by a pointer, up to 3 or 7 padding bytes may
       
   247     be inserted: in that case, the size of this class is 16+4+4 = 24 bytes on
       
   248     32-bit architectures, or 24+8+8 = 40 bytes on 64-bit architectures (48
       
   249     bytes on Itanium with global pointers stored). If \tt Deleter is a
       
   250     function pointer, the size should be the same as the empty structure
       
   251     case, except for Itanium where it may be 56 bytes due to another global
       
   252     pointer. If \tt Deleter is a pointer to a member function (PMF), the size
       
   253     will be even bigger and will depend on the ABI. For architectures using
       
   254     the Itanium C++ ABI, a PMF is twice the size of a normal pointer, or 24
       
   255     bytes on Itanium itself. In that case, the size of this structure will be
       
   256     16+8+4 = 28 bytes on 32-bit architectures, 24+16+8 = 48 bytes on 64-bit,
       
   257     and 32+24+8 = 64 bytes on Itanium.
       
   258 
       
   259     (Values for Itanium consider an LP64 architecture; for ILP32, pointers
       
   260     are 32-bit in length, function pointers are 64-bit and PMF are 96-bit, so
       
   261     the sizes are slightly less)
       
   262 
       
   263     \section3 QtSharedPointer::ExternalRefCountWithContiguousData
       
   264 
       
   265     This class also derives from ExternalRefCountDataWithDestroyFn and it is
       
   266     also a template class. The template parameter is the type \tt T of the
       
   267     class which QSharedPointer tracks. It adds only one member to its parent,
       
   268     which is of type \tt T (the actual type, not a pointer to it).
       
   269 
       
   270     The purpose of this class is to lay the \tt T object out next to the
       
   271     reference counts, saving one memory allocation per shared pointer. This
       
   272     is particularly interesting for small \tt T or for the cases when there
       
   273     are few if any QWeakPointer tracking the object. This class exists to
       
   274     implement the QSharedPointer::create() call.
       
   275 
       
   276     Like ExternalRefCountWithCustomDeleter, this class is never instantiated
       
   277     directly. This class also provides a create() member that returns the
       
   278     pointer, and hides its constructors and destructor. (With C++0x, we'd
       
   279     delete them).
       
   280 
       
   281     The size of this class depends on the size of \tt T.
       
   282 
       
   283     \section3 Instantiating ExternalRefCountWithCustomDeleter and ExternalRefCountWithContiguousData
       
   284 
       
   285     Like explained above, these classes have private constructors. Moreover,
       
   286     they are not defined anywhere, so trying to call \tt{new ClassType} would
       
   287     result in a compilation or linker error. Instead, these classes must be
       
   288     constructed via their create() methods.
       
   289 
       
   290     Instead of instantiating the class by the normal way, the create() method
       
   291     calls \tt{operator new} directly with the size of the class, then calls
       
   292     the parent class's constructor only (ExternalRefCountDataWithDestroyFn).
       
   293     This ensures that the inherited members are initialised properly, as well
       
   294     as the virtual table pointer, which must point to
       
   295     ExternalRefCountDataWithDestroyFn's virtual table. That way, we also
       
   296     ensure that the virtual destructor being called is
       
   297     ExternalRefCountDataWithDestroyFn's.
       
   298 
       
   299     After initialising the base class, the
       
   300     ExternalRefCountWithCustomDeleter::create() function initialises the new
       
   301     members directly, by using the placement \tt{operator new}. In the case
       
   302     of the ExternalRefCountWithContiguousData::create() function, the address
       
   303     to the still-uninitialised \tt T member is saved for the callee to use.
       
   304     The member is only initialised in QSharedPointer::create(), so that we
       
   305     avoid having many variants of the internal functions according to the
       
   306     arguments in use for calling the constructor.
       
   307 
       
   308     When initialising the parent class, the create() functions pass the
       
   309     address of the static deleter() member function. That is, when the
       
   310     virtual destroy() is called by QSharedPointer, the deleter() functions
       
   311     are called instead. These functiosn static_cast the ExternalRefCountData*
       
   312     parameter to their own type and execute their deletion: for the
       
   313     ExternalRefCountWithCustomDeleter::deleter() case, it runs the user's
       
   314     custom deleter, then destroys the deleter; for
       
   315     ExternalRefCountWithContiguousData::deleter, it simply calls the \tt T
       
   316     destructor directly.
       
   317 
       
   318     By not calling the constructor of the derived classes, we avoid
       
   319     instantiating their virtual tables. Since these classes are
       
   320     template-based, there would be one virtual table per \tt T and \tt
       
   321     Deleter type. (This is what Qt 4.5 did)
       
   322 
       
   323     Instead, only one non-inline function is required per template, which is
       
   324     the deleter() static member. All the other functions can be inlined.
       
   325     What's more, the address of deleter() is calculated only in code, which
       
   326     can be resolved at link-time if the linker can determine that the
       
   327     function lies in the current application or library module (since these
       
   328     classes are not exported, that is the case for Windows or for builds with
       
   329     \tt{-fvisibility=hidden}).
       
   330 
       
   331     In contrast, a virtual table would require at least 3 relocations to be
       
   332     resolved at module load-time, per module where these classes are used.
       
   333     (In the Itanium C++ ABI, there would be more relocations, due to the
       
   334     RTTI)
       
   335 
       
   336     \section3 Modifications due to pointer-tracking
       
   337 
       
   338     To ensure that pointers created with pointer-tracking enabled get
       
   339     un-tracked when destroyed, even if destroyed by code compiled without the
       
   340     feature, QSharedPointer modifies slightly the instructions of the
       
   341     previous sections.
       
   342 
       
   343     When ExternalRefCountWithCustomDeleter or
       
   344     ExternalRefCountWithContiguousData are used, their create() functions
       
   345     will set the ExternalRefCountDataWithDestroyFn::destroyer function
       
   346     pointer to safetyCheckDeleter() instead. These static member functions
       
   347     simply call internalSafetyCheckRemove2() before passing control to the
       
   348     normal deleter() function.
       
   349 
       
   350     If neither custom deleter nor QSharedPointer::create() are used, then
       
   351     QSharedPointer uses a custom deleter of its own: the normalDeleter()
       
   352     function, which simply calls \tt delete. By using a custom deleter, the
       
   353     safetyCheckDeleter() procedure described above kicks in.
       
   354 
       
   355     \endomit
       
   356 
       
   357     \sa QSharedDataPointer, QWeakPointer, QScopedPointer
       
   358 */
       
   359 
       
   360 /*!
       
   361     \class QWeakPointer
       
   362     \brief The QWeakPointer class holds a weak reference to a shared pointer
       
   363     \since 4.5
       
   364     \reentrant
       
   365 
       
   366     The QWeakPointer is an automatic weak reference to a
       
   367     pointer in C++. It cannot be used to dereference the pointer
       
   368     directly, but it can be used to verify if the pointer has been
       
   369     deleted or not in another context.
       
   370 
       
   371     QWeakPointer objects can only be created by assignment from a
       
   372     QSharedPointer. The exception is pointers derived from QObject: in that
       
   373     case, QWeakPointer serves as a replacement to QPointer.
       
   374 
       
   375     It's important to note that QWeakPointer provides no automatic casting
       
   376     operators to prevent mistakes from happening. Even though QWeakPointer
       
   377     tracks a pointer, it should not be considered a pointer itself, since it
       
   378     doesn't guarantee that the pointed object remains valid.
       
   379 
       
   380     Therefore, to access the pointer that QWeakPointer is tracking, you must
       
   381     first promote it to QSharedPointer and verify if the resulting object is
       
   382     null or not. QSharedPointer guarantees that the object isn't deleted, so
       
   383     if you obtain a non-null object, you may use the pointer. See
       
   384     QWeakPointer::toStrongRef() for more an example.
       
   385 
       
   386     QWeakPointer also provides the QWeakPointer::data() method that returns
       
   387     the tracked pointer without ensuring that it remains valid. This function
       
   388     is provided if you can guarantee by external means that the object will
       
   389     not get deleted (or if you only need the pointer value) and the cost of
       
   390     creating a QSharedPointer using toStrongRef() is too high.
       
   391 
       
   392     That function can also be used to obtain the tracked pointer for
       
   393     QWeakPointers that cannot be promoted to QSharedPointer, such as those
       
   394     created directly from a QObject pointer (not via QSharedPointer).
       
   395 
       
   396     \section1 Tracking QObject
       
   397 
       
   398     QWeakPointer can be used to track deletion classes derives from QObject,
       
   399     even if they are not managed by QSharedPointer. When used in that role,
       
   400     QWeakPointer replaces the older QPointer in all use-cases. QWeakPointer
       
   401     is also more efficient than QPointer, so it should be preferred in all
       
   402     new code.
       
   403 
       
   404     To do that, QWeakPointer provides a special constructor that is only
       
   405     available if the template parameter \tt T is either QObject or a class
       
   406     deriving from it. Trying to use that constructor if \tt T does not derive
       
   407     from QObject will result in compilation errors.
       
   408 
       
   409     To obtain the QObject being tracked by QWeakPointer, you must use the
       
   410     QWeakPointer::data() function, but only if you can guarantee that the
       
   411     object cannot get deleted by another context. It should be noted that
       
   412     QPointer had the same constraint, so use of QWeakPointer forces you to
       
   413     consider whether the pointer is still valid.
       
   414 
       
   415     QObject-derived classes can only be deleted in the thread they have
       
   416     affinity to (which is the thread they were created in or moved to, using
       
   417     QObject::moveToThread()). In special, QWidget-derived classes cannot be
       
   418     created in non-GUI threads nor moved there. Therefore, guaranteeing that
       
   419     the tracked QObject has affinity to the current thread is enough to also
       
   420     guarantee that it won't be deleted asynchronously.
       
   421 
       
   422     Note that QWeakPointer's size and data layout do not match QPointer, so
       
   423     it cannot replace that class in a binary-compatible manner.
       
   424 
       
   425     Care must also be taken with QWeakPointers created directly from QObject
       
   426     pointers when dealing with code that was compiled with Qt versions prior
       
   427     to 4.6. Those versions may not track the reference counters correctly, so
       
   428     QWeakPointers created from QObject should never be passed to code that
       
   429     hasn't been recompiled.
       
   430 
       
   431     \omit
       
   432     \secton1 QWeakPointer internals
       
   433 
       
   434     QWeakPointer shares most of its internal functionality with
       
   435     \l{QSharedPointer#qsharedpointer-internals}{QSharedPointer}, so see that
       
   436     class's internal documentation for more information.
       
   437 
       
   438     QWeakPointer requires an external reference counter in order to operate.
       
   439     Therefore, it is incompatible by design with \l QSharedData-derived
       
   440     classes.
       
   441 
       
   442     It has a special QObject constructor, which works by calling
       
   443     QtSharedPointer::ExternalRefCountData::getAndRef, which retrieves the
       
   444     d-pointer from QObjectPrivate. If one isn't set yet, that function
       
   445     creates the d-pointer and atomically sets it.
       
   446 
       
   447     If getAndRef needs to create a d-pointer, it sets the strongref to -1,
       
   448     indicating that the QObject is not shared: QWeakPointer is used only to
       
   449     determine whether the QObject has been deleted. In that case, it cannot
       
   450     be upgraded to QSharedPointer (see the previous section).
       
   451 
       
   452     \endomit
       
   453 
       
   454     \sa QSharedPointer, QScopedPointer
       
   455 */
       
   456 
       
   457 /*!
       
   458     \fn QSharedPointer::QSharedPointer()
       
   459 
       
   460     Creates a QSharedPointer that points to null (0).
       
   461 */
       
   462 
       
   463 /*!
       
   464     \fn QSharedPointer::~QSharedPointer()
       
   465 
       
   466     Destroys this QSharedPointer object. If it is the last reference to
       
   467     the pointer stored, this will delete the pointer as well.
       
   468 */
       
   469 
       
   470 /*!
       
   471     \fn QSharedPointer::QSharedPointer(T *ptr)
       
   472 
       
   473     Creates a QSharedPointer that points to \a ptr. The pointer \a ptr
       
   474     becomes managed by this QSharedPointer and must not be passed to
       
   475     another QSharedPointer object or deleted outside this object.
       
   476 */
       
   477 
       
   478 /*!
       
   479     \fn QSharedPointer::QSharedPointer(T *ptr, Deleter deleter)
       
   480 
       
   481     Creates a QSharedPointer that points to \a ptr. The pointer \a ptr
       
   482     becomes managed by this QSharedPointer and must not be passed to
       
   483     another QSharedPointer object or deleted outside this object.
       
   484 
       
   485     The \a deleter paramter specifies the custom deleter for this
       
   486     object. The custom deleter is called when the strong reference
       
   487     count drops to 0 instead of the operator delete(). This is useful,
       
   488     for instance, for calling deleteLater() in a QObject instead:
       
   489 
       
   490     \code
       
   491     static void doDeleteLater(MyObject *obj)
       
   492     {
       
   493         obj->deleteLater();
       
   494     }
       
   495 
       
   496     void otherFunction()
       
   497     {
       
   498         QSharedPointer<MyObject> obj =
       
   499             QSharedPointer<MyObject>(new MyObject, doDeleteLater);
       
   500 
       
   501         // continue using obj
       
   502         obj.clear();    // calls obj->deleteLater();
       
   503     }
       
   504     \endcode
       
   505 
       
   506     It is also possible to specify a member function directly, as in:
       
   507     \code
       
   508         QSharedPointer<MyObject> obj =
       
   509             QSharedPointer<MyObject>(new MyObject, &QObject::deleteLater);
       
   510     \endcode
       
   511 
       
   512     \sa clear()
       
   513 */
       
   514 
       
   515 /*!
       
   516     \fn QSharedPointer::QSharedPointer(const QSharedPointer<T> &other)
       
   517 
       
   518     Creates a QSharedPointer object that shares \a other's pointer.
       
   519 
       
   520     If \tt T is a derived type of the template parameter of this class,
       
   521     QSharedPointer will perform an automatic cast. Otherwise, you will
       
   522     get a compiler error.
       
   523 */
       
   524 
       
   525 /*!
       
   526     \fn QSharedPointer::QSharedPointer(const QWeakPointer<T> &other)
       
   527 
       
   528     Creates a QSharedPointer by promoting the weak reference \a other
       
   529     to strong reference and sharing its pointer.
       
   530 
       
   531     If \tt T is a derived type of the template parameter of this
       
   532     class, QSharedPointer will perform an automatic cast. Otherwise,
       
   533     you will get a compiler error.
       
   534 
       
   535     \sa QWeakPointer::toStrongRef()
       
   536 */
       
   537 
       
   538 /*!
       
   539     \fn QSharedPointer &QSharedPointer::operator=(const QSharedPointer<T> &other)
       
   540 
       
   541     Makes this object share \a other's pointer. The current pointer
       
   542     reference is discarded and, if it was the last, the pointer will
       
   543     be deleted.
       
   544 
       
   545     If \tt T is a derived type of the template parameter of this
       
   546     class, QSharedPointer will perform an automatic cast. Otherwise,
       
   547     you will get a compiler error.
       
   548 */
       
   549 
       
   550 /*!
       
   551     \fn QSharedPointer &QSharedPointer::operator=(const QWeakPointer<T> &other)
       
   552 
       
   553     Promotes \a other to a strong reference and makes this object
       
   554     share a reference to the pointer referenced by it. The current pointer
       
   555     reference is discarded and, if it was the last, the pointer will
       
   556     be deleted.
       
   557 
       
   558     If \tt T is a derived type of the template parameter of this
       
   559     class, QSharedPointer will perform an automatic cast. Otherwise,
       
   560     you will get a compiler error.
       
   561 */
       
   562 
       
   563 /*!
       
   564     \fn T *QSharedPointer::data() const
       
   565 
       
   566     Returns the value of the pointer referenced by this object.
       
   567 
       
   568     Note: do not delete the pointer returned by this function or pass
       
   569     it to another function that could delete it, including creating
       
   570     QSharedPointer or QWeakPointer objects.
       
   571 */
       
   572 
       
   573 /*!
       
   574     \fn T &QSharedPointer::operator *() const
       
   575 
       
   576     Provides access to the shared pointer's members.
       
   577 
       
   578     \sa isNull()
       
   579 */
       
   580 
       
   581 /*!
       
   582     \fn T *QSharedPointer::operator ->() const
       
   583 
       
   584     Provides access to the shared pointer's members.
       
   585 
       
   586     \sa isNull()
       
   587 */
       
   588 
       
   589 /*!
       
   590     \fn bool QSharedPointer::isNull() const
       
   591 
       
   592     Returns true if this object is holding a reference to a null
       
   593     pointer.
       
   594 */
       
   595 
       
   596 /*!
       
   597     \fn QSharedPointer::operator bool() const
       
   598 
       
   599     Returns true if this object is not null. This function is suitable
       
   600     for use in \tt if-constructs, like:
       
   601 
       
   602     \code
       
   603         if (sharedptr) { ... }
       
   604     \endcode
       
   605 
       
   606     \sa isNull()
       
   607 */
       
   608 
       
   609 /*!
       
   610     \fn bool QSharedPointer::operator !() const
       
   611 
       
   612     Returns true if this object is null. This function is suitable
       
   613     for use in \tt if-constructs, like:
       
   614 
       
   615     \code
       
   616         if (!sharedptr) { ... }
       
   617     \endcode
       
   618 
       
   619     \sa isNull()
       
   620 */
       
   621 
       
   622 /*!
       
   623     \fn QSharedPointer<X> QSharedPointer::staticCast() const
       
   624 
       
   625     Performs a static cast from this pointer's type to \tt X and returns
       
   626     a QSharedPointer that shares the reference. This function can be
       
   627     used for up- and for down-casting, but is more useful for
       
   628     up-casting.
       
   629 
       
   630     Note: the template type \c X must have the same const and volatile
       
   631     qualifiers as the template of this object, or the cast will
       
   632     fail. Use constCast() if you need to drop those qualifiers.
       
   633 
       
   634     \sa dynamicCast(), constCast(), qSharedPointerCast()
       
   635 */
       
   636 
       
   637 /*!
       
   638     \fn QSharedPointer<X> QSharedPointer::dynamicCast() const
       
   639 
       
   640     Performs a dynamic cast from this pointer's type to \tt X and
       
   641     returns a QSharedPointer that shares the reference. If this
       
   642     function is used to up-cast, then QSharedPointer will perform a \tt
       
   643     dynamic_cast, which means that if the object being pointed by this
       
   644     QSharedPointer is not of type \tt X, the returned object will be
       
   645     null.
       
   646 
       
   647     Note: the template type \c X must have the same const and volatile
       
   648     qualifiers as the template of this object, or the cast will
       
   649     fail. Use constCast() if you need to drop those qualifiers.
       
   650 
       
   651     \sa qSharedPointerDynamicCast()
       
   652 */
       
   653 
       
   654 /*!
       
   655     \fn QSharedPointer<X> QSharedPointer::constCast() const
       
   656 
       
   657     Performs a \tt const_cast from this pointer's type to \tt X and returns
       
   658     a QSharedPointer that shares the reference. This function can be
       
   659     used for up- and for down-casting, but is more useful for
       
   660     up-casting.
       
   661 
       
   662     \sa isNull(), qSharedPointerConstCast()
       
   663 */
       
   664 
       
   665 /*!
       
   666     \fn QSharedPointer<X> QSharedPointer::objectCast() const
       
   667     \since 4.6
       
   668 
       
   669     Performs a \l qobject_cast() from this pointer's type to \tt X and
       
   670     returns a QSharedPointer that shares the reference. If this
       
   671     function is used to up-cast, then QSharedPointer will perform a \tt
       
   672     qobject_cast, which means that if the object being pointed by this
       
   673     QSharedPointer is not of type \tt X, the returned object will be
       
   674     null.
       
   675 
       
   676     Note: the template type \c X must have the same const and volatile
       
   677     qualifiers as the template of this object, or the cast will
       
   678     fail. Use constCast() if you need to drop those qualifiers.
       
   679 
       
   680     \sa qSharedPointerObjectCast()
       
   681 */
       
   682 
       
   683 /*!
       
   684     \fn QWeakPointer<T> QSharedPointer::toWeakRef() const
       
   685 
       
   686     Returns a weak reference object that shares the pointer referenced
       
   687     by this object.
       
   688 
       
   689     \sa QWeakPointer::QWeakPointer()
       
   690 */
       
   691 
       
   692 /*!
       
   693     \fn void QSharedPointer::clear()
       
   694 
       
   695     Clears this QSharedPointer object, dropping the reference that it
       
   696     may have had to the pointer. If this was the last reference, then
       
   697     the pointer itself will be deleted.
       
   698 */
       
   699 
       
   700 /*!
       
   701     \fn QWeakPointer::QWeakPointer()
       
   702 
       
   703     Creates a QWeakPointer that points to nothing.
       
   704 */
       
   705 
       
   706 /*!
       
   707     \fn QWeakPointer::~QWeakPointer()
       
   708 
       
   709     Destroys this QWeakPointer object. The pointer referenced
       
   710     by this object will not be deleted.
       
   711 */
       
   712 
       
   713 /*!
       
   714     \fn QWeakPointer::QWeakPointer(const QWeakPointer<T> &other)
       
   715 
       
   716     Creates a QWeakPointer that holds a weak reference to the
       
   717     pointer referenced by \a other.
       
   718 
       
   719     If \tt T is a derived type of the template parameter of this
       
   720     class, QWeakPointer will perform an automatic cast. Otherwise,
       
   721     you will get a compiler error.
       
   722 */
       
   723 
       
   724 /*!
       
   725     \fn QWeakPointer::QWeakPointer(const QSharedPointer<T> &other)
       
   726 
       
   727     Creates a QWeakPointer that holds a weak reference to the
       
   728     pointer referenced by \a other.
       
   729 
       
   730     If \tt T is a derived type of the template parameter of this
       
   731     class, QWeakPointer will perform an automatic cast. Otherwise,
       
   732     you will get a compiler error.
       
   733 */
       
   734 
       
   735 /*!
       
   736     \fn QWeakPointer::QWeakPointer(const QObject *obj)
       
   737     \since 4.6
       
   738 
       
   739     Creates a QWeakPointer that holds a weak reference directly to the
       
   740     QObject \a obj. This constructor is only available if the template type
       
   741     \tt T is QObject or derives from it (otherwise a compilation error will
       
   742     result).
       
   743 
       
   744     You can use this constructor with any QObject, even if they were not
       
   745     created with \l QSharedPointer.
       
   746 
       
   747     Note that QWeakPointers created this way on arbitrary QObjects usually
       
   748     cannot be promoted to QSharedPointer.
       
   749 
       
   750     \sa QSharedPointer, QWeakPointer#tracking-qobject
       
   751 */
       
   752 
       
   753 /*!
       
   754     \fn QWeakPointer &QWeakPointer::operator=(const QObject *obj)
       
   755     \since 4.6
       
   756 
       
   757     Makes this QWeakPointer hold a weak reference to directly to the QObject
       
   758     \a obj. This function is only available if the template type \tt T is
       
   759     QObject or derives from it.
       
   760 
       
   761     \sa QWeakPointer#tracking-qobject
       
   762 */
       
   763 
       
   764 /*!
       
   765     \fn QWeakPointer &QWeakPointer::operator=(const QWeakPointer<T> &other)
       
   766 
       
   767     Makes this object share \a other's pointer. The current pointer
       
   768     reference is discarded but is not deleted.
       
   769 
       
   770     If \tt T is a derived type of the template parameter of this
       
   771     class, QWeakPointer will perform an automatic cast. Otherwise,
       
   772     you will get a compiler error.
       
   773 */
       
   774 
       
   775 /*!
       
   776     \fn QWeakPointer &QWeakPointer::operator=(const QSharedPointer<T> &other)
       
   777 
       
   778     Makes this object share \a other's pointer. The current pointer
       
   779     reference is discarded but is not deleted.
       
   780 
       
   781     If \tt T is a derived type of the template parameter of this
       
   782     class, QWeakPointer will perform an automatic cast. Otherwise,
       
   783     you will get a compiler error.
       
   784 */
       
   785 
       
   786 /*!
       
   787     \fn bool QWeakPointer::isNull() const
       
   788 
       
   789     Returns true if this object is holding a reference to a null
       
   790     pointer.
       
   791 
       
   792     Note that, due to the nature of weak references, the pointer that
       
   793     QWeakPointer references can become null at any moment, so
       
   794     the value returned from this function can change from false to
       
   795     true from one call to the next.
       
   796 */
       
   797 
       
   798 /*!
       
   799     \fn QWeakPointer::operator bool() const
       
   800 
       
   801     Returns true if this object is not null. This function is suitable
       
   802     for use in \tt if-constructs, like:
       
   803 
       
   804     \code
       
   805         if (weakref) { ... }
       
   806     \endcode
       
   807 
       
   808     Note that, due to the nature of weak references, the pointer that
       
   809     QWeakPointer references can become null at any moment, so
       
   810     the value returned from this function can change from true to
       
   811     false from one call to the next.
       
   812 
       
   813     \sa isNull()
       
   814 */
       
   815 
       
   816 /*!
       
   817     \fn bool QWeakPointer::operator !() const
       
   818 
       
   819     Returns true if this object is null. This function is suitable
       
   820     for use in \tt if-constructs, like:
       
   821 
       
   822     \code
       
   823         if (!weakref) { ... }
       
   824     \endcode
       
   825 
       
   826     Note that, due to the nature of weak references, the pointer that
       
   827     QWeakPointer references can become null at any moment, so
       
   828     the value returned from this function can change from false to
       
   829     true from one call to the next.
       
   830 
       
   831     \sa isNull()
       
   832 */
       
   833 
       
   834 /*!
       
   835     \fn T *QWeakPointer::data() const
       
   836     \since 4.6
       
   837 
       
   838     Returns the value of the pointer being tracked by this QWeakPointer,
       
   839     \b without ensuring that it cannot get deleted. To have that guarantee,
       
   840     use toStrongRef(), which returns a QSharedPointer object. If this
       
   841     function can determine that the pointer has already been deleted, it
       
   842     returns 0.
       
   843 
       
   844     It is ok to obtain the value of the pointer and using that value itself,
       
   845     like for example in debugging statements:
       
   846 
       
   847     \code
       
   848         qDebug("Tracking %p", weakref.data());
       
   849     \endcode
       
   850 
       
   851     However, dereferencing the pointer is only allowed if you can guarantee
       
   852     by external means that the pointer does not get deleted. For example,
       
   853     if you can be certain that no other thread can delete it, nor the
       
   854     functions that you may call.
       
   855 
       
   856     If that is the case, then the following code is valid:
       
   857 
       
   858     \code
       
   859         // this pointer cannot be used in another thread
       
   860         // so other threads cannot delete it
       
   861         QWeakPointer<int> weakref = obtainReference();
       
   862 
       
   863         Object *obj = weakref.data();
       
   864         if (obj) {
       
   865             // if the pointer wasn't deleted yet, we know it can't get
       
   866             // deleted by our own code here nor the functions we call
       
   867             otherFunction(obj);
       
   868         }
       
   869     \endcode
       
   870 
       
   871     Use this function with care.
       
   872 
       
   873     \sa isNull(), toStrongRef()
       
   874 */
       
   875 
       
   876 /*!
       
   877     \fn QSharedPointer<T> QWeakPointer::toStrongRef() const
       
   878 
       
   879     Promotes this weak reference to a strong one and returns a
       
   880     QSharedPointer object holding that reference. When promoting to
       
   881     QSharedPointer, this function verifies if the object has been deleted
       
   882     already or not. If it hasn't, this function increases the reference
       
   883     count to the shared object, thus ensuring that it will not get
       
   884     deleted.
       
   885 
       
   886     Since this function can fail to obtain a valid strong reference to the
       
   887     shared object, you should always verify if the conversion succeeded,
       
   888     by calling QSharedPointer::isNull() on the returned object.
       
   889 
       
   890     For example, the following code promotes a QWeakPointer that was held
       
   891     to a strong reference and, if it succeeded, it prints the value of the
       
   892     integer that was held:
       
   893 
       
   894     \code
       
   895         QWeakPointer<int> weakref;
       
   896 
       
   897         // ...
       
   898 
       
   899         QSharedPointer<int> strong = weakref.toStrongRef();
       
   900         if (strong)
       
   901             qDebug() << "The value is:" << *strong;
       
   902         else
       
   903             qDebug() << "The value has already been deleted";
       
   904     \endcode
       
   905 
       
   906     \sa QSharedPointer::QSharedPointer()
       
   907 */
       
   908 
       
   909 /*!
       
   910     \fn void QWeakPointer::clear()
       
   911 
       
   912     Clears this QWeakPointer object, dropping the reference that it
       
   913     may have had to the pointer.
       
   914 */
       
   915 
       
   916 /*!
       
   917     \fn bool operator==(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
       
   918     \relates QSharedPointer
       
   919 
       
   920     Returns true if the pointer referenced by \a ptr1 is the
       
   921     same pointer as that referenced by \a ptr2.
       
   922 
       
   923     If \a ptr2's template parameter is different from \a ptr1's,
       
   924     QSharedPointer will attempt to perform an automatic \tt static_cast
       
   925     to ensure that the pointers being compared are equal. If \a ptr2's
       
   926     template parameter is not a base or a derived type from
       
   927     \a ptr1's, you will get a compiler error.
       
   928 */
       
   929 
       
   930 /*!
       
   931     \fn bool operator!=(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
       
   932     \relates QSharedPointer
       
   933 
       
   934     Returns true if the pointer referenced by \a ptr1 is not the
       
   935     same pointer as that referenced by \a ptr2.
       
   936 
       
   937     If \a ptr2's template parameter is different from \a ptr1's,
       
   938     QSharedPointer will attempt to perform an automatic \tt static_cast
       
   939     to ensure that the pointers being compared are equal. If \a ptr2's
       
   940     template parameter is not a base or a derived type from
       
   941     \a ptr1's, you will get a compiler error.
       
   942 */
       
   943 
       
   944 /*!
       
   945     \fn bool operator==(const QSharedPointer<T> &ptr1, const X *ptr2)
       
   946     \relates QSharedPointer
       
   947 
       
   948     Returns true if the pointer referenced by \a ptr1 is the
       
   949     same pointer as \a ptr2.
       
   950 
       
   951     If \a ptr2's type is different from \a ptr1's,
       
   952     QSharedPointer will attempt to perform an automatic \tt static_cast
       
   953     to ensure that the pointers being compared are equal. If \a ptr2's
       
   954     type is not a base or a derived type from this
       
   955     \a ptr1's, you will get a compiler error.
       
   956 */
       
   957 
       
   958 /*!
       
   959     \fn bool operator!=(const QSharedPointer<T> &ptr1, const X *ptr2)
       
   960     \relates QSharedPointer
       
   961 
       
   962     Returns true if the pointer referenced by \a ptr1 is not the
       
   963     same pointer as \a ptr2.
       
   964 
       
   965     If \a ptr2's type is different from \a ptr1's,
       
   966     QSharedPointer will attempt to perform an automatic \tt static_cast
       
   967     to ensure that the pointers being compared are equal. If \a ptr2's
       
   968     type is not a base or a derived type from this
       
   969     \a ptr1's, you will get a compiler error.
       
   970 */
       
   971 
       
   972 /*!
       
   973     \fn bool operator==(const T *ptr1, const QSharedPointer<X> &ptr2)
       
   974     \relates QSharedPointer
       
   975 
       
   976     Returns true if the pointer \a ptr1 is the
       
   977     same pointer as that referenced by \a ptr2.
       
   978 
       
   979     If \a ptr2's template parameter is different from \a ptr1's type,
       
   980     QSharedPointer will attempt to perform an automatic \tt static_cast
       
   981     to ensure that the pointers being compared are equal. If \a ptr2's
       
   982     template parameter is not a base or a derived type from
       
   983     \a ptr1's type, you will get a compiler error.
       
   984 */
       
   985 
       
   986 /*!
       
   987     \fn bool operator!=(const T *ptr1, const QSharedPointer<X> &ptr2)
       
   988     \relates QSharedPointer
       
   989 
       
   990     Returns true if the pointer \a ptr1 is not the
       
   991     same pointer as that referenced by \a ptr2.
       
   992 
       
   993     If \a ptr2's template parameter is different from \a ptr1's type,
       
   994     QSharedPointer will attempt to perform an automatic \tt static_cast
       
   995     to ensure that the pointers being compared are equal. If \a ptr2's
       
   996     template parameter is not a base or a derived type from
       
   997     \a ptr1's type, you will get a compiler error.
       
   998 */
       
   999 
       
  1000 /*!
       
  1001     \fn bool operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
       
  1002     \relates QWeakPointer
       
  1003 
       
  1004     Returns true if the pointer referenced by \a ptr1 is the
       
  1005     same pointer as that referenced by \a ptr2.
       
  1006 
       
  1007     If \a ptr2's template parameter is different from \a ptr1's,
       
  1008     QSharedPointer will attempt to perform an automatic \tt static_cast
       
  1009     to ensure that the pointers being compared are equal. If \a ptr2's
       
  1010     template parameter is not a base or a derived type from
       
  1011     \a ptr1's, you will get a compiler error.
       
  1012 */
       
  1013 
       
  1014 /*!
       
  1015     \fn bool operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
       
  1016     \relates QWeakPointer
       
  1017 
       
  1018     Returns true if the pointer referenced by \a ptr1 is not the
       
  1019     same pointer as that referenced by \a ptr2.
       
  1020 
       
  1021     If \a ptr2's template parameter is different from \a ptr1's,
       
  1022     QSharedPointer will attempt to perform an automatic \tt static_cast
       
  1023     to ensure that the pointers being compared are equal. If \a ptr2's
       
  1024     template parameter is not a base or a derived type from
       
  1025     \a ptr1's, you will get a compiler error.
       
  1026 */
       
  1027 
       
  1028 /*!
       
  1029     \fn bool operator==(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
       
  1030     \relates QWeakPointer
       
  1031 
       
  1032     Returns true if the pointer referenced by \a ptr1 is the
       
  1033     same pointer as that referenced by \a ptr2.
       
  1034 
       
  1035     If \a ptr2's template parameter is different from \a ptr1's,
       
  1036     QSharedPointer will attempt to perform an automatic \tt static_cast
       
  1037     to ensure that the pointers being compared are equal. If \a ptr2's
       
  1038     template parameter is not a base or a derived type from
       
  1039     \a ptr1's, you will get a compiler error.
       
  1040 */
       
  1041 
       
  1042 /*!
       
  1043     \fn bool operator!=(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
       
  1044     \relates QWeakPointer
       
  1045 
       
  1046     Returns true if the pointer referenced by \a ptr1 is not the
       
  1047     same pointer as that referenced by \a ptr2.
       
  1048 
       
  1049     If \a ptr2's template parameter is different from \a ptr1's,
       
  1050     QSharedPointer will attempt to perform an automatic \tt static_cast
       
  1051     to ensure that the pointers being compared are equal. If \a ptr2's
       
  1052     template parameter is not a base or a derived type from
       
  1053     \a ptr1's, you will get a compiler error.
       
  1054 */
       
  1055 
       
  1056 /*!
       
  1057     \fn QSharedPointer<X> qSharedPointerCast(const QSharedPointer<T> &other)
       
  1058     \relates QSharedPointer
       
  1059 
       
  1060     Returns a shared pointer to the pointer held by \a other, cast to
       
  1061     type \tt X.  The types \tt T and \tt X must belong to one
       
  1062     hierarchy for the \tt static_cast to succeed.
       
  1063 
       
  1064     Note that \tt X must have the same cv-qualifiers (\tt const and
       
  1065     \tt volatile) that \tt T has, or the code will fail to
       
  1066     compile. Use qSharedPointerConstCast to cast away the constness.
       
  1067 
       
  1068     \sa QSharedPointer::staticCast(), qSharedPointerDynamicCast(), qSharedPointerConstCast()
       
  1069 */
       
  1070 
       
  1071 /*!
       
  1072     \fn QSharedPointer<X> qSharedPointerCast(const QWeakPointer<T> &other)
       
  1073     \relates QSharedPointer
       
  1074     \relates QWeakPointer
       
  1075 
       
  1076     Returns a shared pointer to the pointer held by \a other, cast to
       
  1077     type \tt X.  The types \tt T and \tt X must belong to one
       
  1078     hierarchy for the \tt static_cast to succeed.
       
  1079 
       
  1080     The \a other object is converted first to a strong reference. If
       
  1081     that conversion fails (because the object it's pointing to has
       
  1082     already been deleted), this function returns a null
       
  1083     QSharedPointer.
       
  1084 
       
  1085     Note that \tt X must have the same cv-qualifiers (\tt const and
       
  1086     \tt volatile) that \tt T has, or the code will fail to
       
  1087     compile. Use qSharedPointerConstCast to cast away the constness.
       
  1088 
       
  1089     \sa QWeakPointer::toStrongRef(), qSharedPointerDynamicCast(), qSharedPointerConstCast()
       
  1090 */
       
  1091 
       
  1092 /*!
       
  1093     \fn QSharedPointer<X> qSharedPointerDynamicCast(const QSharedPointer<T> &other)
       
  1094     \relates QSharedPointer
       
  1095 
       
  1096     Returns a shared pointer to the pointer held by \a other, using a
       
  1097     dynamic cast to type \tt X to obtain an internal pointer of the
       
  1098     appropriate type. If the \tt dynamic_cast fails, the object
       
  1099     returned will be null.
       
  1100 
       
  1101     Note that \tt X must have the same cv-qualifiers (\tt const and
       
  1102     \tt volatile) that \tt T has, or the code will fail to
       
  1103     compile. Use qSharedPointerConstCast to cast away the constness.
       
  1104 
       
  1105     \sa QSharedPointer::dynamicCast(), qSharedPointerCast(), qSharedPointerConstCast()
       
  1106 */
       
  1107 
       
  1108 /*!
       
  1109     \fn QSharedPointer<X> qSharedPointerDynamicCast(const QWeakPointer<T> &other)
       
  1110     \relates QSharedPointer
       
  1111     \relates QWeakPointer
       
  1112 
       
  1113     Returns a shared pointer to the pointer held by \a other, using a
       
  1114     dynamic cast to type \tt X to obtain an internal pointer of the
       
  1115     appropriate type. If the \tt dynamic_cast fails, the object
       
  1116     returned will be null.
       
  1117 
       
  1118     The \a other object is converted first to a strong reference. If
       
  1119     that conversion fails (because the object it's pointing to has
       
  1120     already been deleted), this function also returns a null
       
  1121     QSharedPointer.
       
  1122 
       
  1123     Note that \tt X must have the same cv-qualifiers (\tt const and
       
  1124     \tt volatile) that \tt T has, or the code will fail to
       
  1125     compile. Use qSharedPointerConstCast to cast away the constness.
       
  1126 
       
  1127     \sa QWeakPointer::toStrongRef(), qSharedPointerCast(), qSharedPointerConstCast()
       
  1128 */
       
  1129 
       
  1130 /*!
       
  1131     \fn QSharedPointer<X> qSharedPointerConstCast(const QSharedPointer<T> &other)
       
  1132     \relates QSharedPointer
       
  1133 
       
  1134     Returns a shared pointer to the pointer held by \a other, cast to
       
  1135     type \tt X.  The types \tt T and \tt X must belong to one
       
  1136     hierarchy for the \tt const_cast to succeed. The \tt const and \tt
       
  1137     volatile differences between \tt T and \tt X are ignored.
       
  1138 
       
  1139     \sa QSharedPointer::constCast(), qSharedPointerCast(), qSharedPointerDynamicCast()
       
  1140 */
       
  1141 
       
  1142 /*!
       
  1143     \fn QSharedPointer<X> qSharedPointerConstCast(const QWeakPointer<T> &other)
       
  1144     \relates QSharedPointer
       
  1145     \relates QWeakPointer
       
  1146 
       
  1147     Returns a shared pointer to the pointer held by \a other, cast to
       
  1148     type \tt X. The types \tt T and \tt X must belong to one
       
  1149     hierarchy for the \tt const_cast to succeed. The \tt const and
       
  1150     \tt volatile differences between \tt T and \tt X are ignored.
       
  1151 
       
  1152     The \a other object is converted first to a strong reference. If
       
  1153     that conversion fails (because the object it's pointing to has
       
  1154     already been deleted), this function returns a null
       
  1155     QSharedPointer.
       
  1156 
       
  1157     \sa QWeakPointer::toStrongRef(), qSharedPointerCast(), qSharedPointerDynamicCast()
       
  1158 */
       
  1159 
       
  1160 /*!
       
  1161     \fn QSharedPointer<X> qSharedPointerObjectCast(const QSharedPointer<T> &other)
       
  1162     \relates QSharedPointer
       
  1163     \since 4.6
       
  1164 
       
  1165     \brief The qSharedPointerObjectCast function is for casting a shared pointer.
       
  1166     
       
  1167     Returns a shared pointer to the pointer held by \a other, using a
       
  1168     \l qobject_cast() to type \tt X to obtain an internal pointer of the
       
  1169     appropriate type. If the \tt qobject_cast fails, the object
       
  1170     returned will be null.
       
  1171 
       
  1172     Note that \tt X must have the same cv-qualifiers (\tt const and
       
  1173     \tt volatile) that \tt T has, or the code will fail to
       
  1174     compile. Use qSharedPointerConstCast to cast away the constness.
       
  1175 
       
  1176     \sa QSharedPointer::objectCast(), qSharedPointerCast(), qSharedPointerConstCast()
       
  1177 */
       
  1178 
       
  1179 /*!
       
  1180     \fn QSharedPointer<X> qSharedPointerObjectCast(const QWeakPointer<T> &other)
       
  1181     \relates QSharedPointer
       
  1182     \relates QWeakPointer
       
  1183     \since 4.6
       
  1184 
       
  1185     \brief The qSharedPointerObjectCast function is for casting a shared pointer.
       
  1186 
       
  1187     Returns a shared pointer to the pointer held by \a other, using a
       
  1188     \l qobject_cast() to type \tt X to obtain an internal pointer of the
       
  1189     appropriate type. If the \tt qobject_cast fails, the object
       
  1190     returned will be null.
       
  1191 
       
  1192     The \a other object is converted first to a strong reference. If
       
  1193     that conversion fails (because the object it's pointing to has
       
  1194     already been deleted), this function also returns a null
       
  1195     QSharedPointer.
       
  1196 
       
  1197     Note that \tt X must have the same cv-qualifiers (\tt const and
       
  1198     \tt volatile) that \tt T has, or the code will fail to
       
  1199     compile. Use qSharedPointerConstCast to cast away the constness.
       
  1200 
       
  1201     \sa QWeakPointer::toStrongRef(), qSharedPointerCast(), qSharedPointerConstCast()
       
  1202 */
       
  1203 
       
  1204 
       
  1205 /*!
       
  1206     \fn QWeakPointer<X> qWeakPointerCast(const QWeakPointer<T> &other)
       
  1207     \relates QWeakPointer
       
  1208 
       
  1209     Returns a weak pointer to the pointer held by \a other, cast to
       
  1210     type \tt X. The types \tt T and \tt X must belong to one
       
  1211     hierarchy for the \tt static_cast to succeed.
       
  1212 
       
  1213     Note that \tt X must have the same cv-qualifiers (\tt const and
       
  1214     \tt volatile) that \tt T has, or the code will fail to
       
  1215     compile. Use qSharedPointerConstCast to cast away the constness.
       
  1216 */
       
  1217 
       
  1218 #include <qset.h>
       
  1219 #include <qmutex.h>
       
  1220 
       
  1221 #if !defined(QT_NO_QOBJECT)
       
  1222 #include "private/qobject_p.h"
       
  1223 
       
  1224 QT_BEGIN_NAMESPACE
       
  1225 
       
  1226 /*!
       
  1227     \internal
       
  1228     This function is called for a just-created QObject \a obj, to enable
       
  1229     the use of QSharedPointer and QWeakPointer.
       
  1230 
       
  1231     When QSharedPointer is active in a QObject, the object must not be deleted
       
  1232     directly: the lifetime is managed by the QSharedPointer object. In that case,
       
  1233     the deleteLater() and parent-child relationship in QObject only decrease
       
  1234     the strong reference count, instead of deleting the object.
       
  1235 */
       
  1236 void QtSharedPointer::ExternalRefCountData::setQObjectShared(const QObject *obj, bool)
       
  1237 {
       
  1238     Q_ASSERT(obj);
       
  1239     QObjectPrivate *d = QObjectPrivate::get(const_cast<QObject *>(obj));
       
  1240 
       
  1241     if (d->sharedRefcount)
       
  1242         qFatal("QSharedPointer: pointer %p already has reference counting", obj);
       
  1243     d->sharedRefcount = this;
       
  1244 
       
  1245     // QObject decreases the refcount too, so increase it up
       
  1246     weakref.ref();
       
  1247 }
       
  1248 
       
  1249 QtSharedPointer::ExternalRefCountData *QtSharedPointer::ExternalRefCountData::getAndRef(const QObject *obj)
       
  1250 {
       
  1251     Q_ASSERT(obj);
       
  1252     QObjectPrivate *d = QObjectPrivate::get(const_cast<QObject *>(obj));
       
  1253     Q_ASSERT_X(!d->wasDeleted, "QWeakPointer", "Detected QWeakPointer creation in a QObject being deleted");
       
  1254 
       
  1255     ExternalRefCountData *that = d->sharedRefcount;
       
  1256     if (that) {
       
  1257         that->weakref.ref();
       
  1258         return that;
       
  1259     }
       
  1260 
       
  1261     // we can create the refcount data because it doesn't exist
       
  1262     ExternalRefCountData *x = new ExternalRefCountData(Qt::Uninitialized);
       
  1263     x->strongref = -1;
       
  1264     x->weakref = 2;  // the QWeakPointer that called us plus the QObject itself
       
  1265     if (!d->sharedRefcount.testAndSetRelease(0, x)) {
       
  1266         delete x;
       
  1267         d->sharedRefcount->weakref.ref();
       
  1268     }
       
  1269     return d->sharedRefcount;
       
  1270 }
       
  1271 
       
  1272 QT_END_NAMESPACE
       
  1273 
       
  1274 #endif
       
  1275 
       
  1276 
       
  1277 
       
  1278 #if !defined(QT_NO_MEMBER_TEMPLATES)
       
  1279 
       
  1280 //#  define QT_SHARED_POINTER_BACKTRACE_SUPPORT
       
  1281 #  ifdef QT_SHARED_POINTER_BACKTRACE_SUPPORT
       
  1282 #    if defined(__GLIBC__) && (__GLIBC__ >= 2) && !defined(__UCLIBC__) && !defined(QT_LINUXBASE)
       
  1283 #      define BACKTRACE_SUPPORTED
       
  1284 #    elif defined(Q_OS_MACX)
       
  1285 #      define BACKTRACE_SUPPORTED
       
  1286 #    endif
       
  1287 #  endif
       
  1288 
       
  1289 #  if defined(BACKTRACE_SUPPORTED)
       
  1290 #    include <sys/types.h>
       
  1291 #    include <execinfo.h>
       
  1292 #    include <stdio.h>
       
  1293 #    include <unistd.h>
       
  1294 #    include <sys/wait.h>
       
  1295 
       
  1296 QT_BEGIN_NAMESPACE
       
  1297 
       
  1298 static inline QByteArray saveBacktrace() __attribute__((always_inline));
       
  1299 static inline QByteArray saveBacktrace()
       
  1300 {
       
  1301     static const int maxFrames = 32;
       
  1302 
       
  1303     QByteArray stacktrace;
       
  1304     stacktrace.resize(sizeof(void*) * maxFrames);
       
  1305     int stack_size = backtrace((void**)stacktrace.data(), maxFrames);
       
  1306     stacktrace.resize(sizeof(void*) * stack_size);
       
  1307 
       
  1308     return stacktrace;
       
  1309 }
       
  1310 
       
  1311 static void printBacktrace(QByteArray stacktrace)
       
  1312 {
       
  1313     void *const *stack = (void *const *)stacktrace.constData();
       
  1314     int stack_size = stacktrace.size() / sizeof(void*);
       
  1315     char **stack_symbols = backtrace_symbols(stack, stack_size);
       
  1316 
       
  1317     int filter[2];
       
  1318     pid_t child = -1;
       
  1319     if (pipe(filter) != -1)
       
  1320         child = fork();
       
  1321     if (child == 0) {
       
  1322         // child process
       
  1323         dup2(fileno(stderr), fileno(stdout));
       
  1324         dup2(filter[0], fileno(stdin));
       
  1325         close(filter[0]);
       
  1326         close(filter[1]);
       
  1327         execlp("c++filt", "c++filt", "-n", NULL);
       
  1328 
       
  1329         // execlp failed
       
  1330         execl("/bin/cat", "/bin/cat", NULL);
       
  1331         _exit(127);
       
  1332     }
       
  1333 
       
  1334     // parent process
       
  1335     close(filter[0]);
       
  1336     FILE *output;
       
  1337     if (child == -1) {
       
  1338         // failed forking
       
  1339         close(filter[1]);
       
  1340         output = stderr;
       
  1341     } else {
       
  1342         output = fdopen(filter[1], "w");
       
  1343     }
       
  1344 
       
  1345     fprintf(stderr, "Backtrace of the first creation (most recent frame first):\n");
       
  1346     for (int i = 0; i < stack_size; ++i) {
       
  1347         if (strlen(stack_symbols[i]))
       
  1348             fprintf(output, "#%-2d %s\n", i, stack_symbols[i]);
       
  1349         else
       
  1350             fprintf(output, "#%-2d %p\n", i, stack[i]);
       
  1351     }
       
  1352 
       
  1353     if (child != -1) {
       
  1354         fclose(output);
       
  1355         waitpid(child, 0, 0);
       
  1356     }
       
  1357 }
       
  1358 
       
  1359 QT_END_NAMESPACE
       
  1360 
       
  1361 #  endif  // BACKTRACE_SUPPORTED
       
  1362 
       
  1363 namespace {
       
  1364     QT_USE_NAMESPACE
       
  1365     struct Data {
       
  1366         const volatile void *pointer;
       
  1367 #  ifdef BACKTRACE_SUPPORTED
       
  1368         QByteArray backtrace;
       
  1369 #  endif
       
  1370     };
       
  1371 
       
  1372     class KnownPointers
       
  1373     {
       
  1374     public:
       
  1375         QMutex mutex;
       
  1376         QHash<const void *, Data> dPointers;
       
  1377         QHash<const volatile void *, const void *> dataPointers;
       
  1378     };
       
  1379 }
       
  1380 
       
  1381 Q_GLOBAL_STATIC(KnownPointers, knownPointers)
       
  1382 
       
  1383 QT_BEGIN_NAMESPACE
       
  1384 
       
  1385 namespace QtSharedPointer {
       
  1386     Q_CORE_EXPORT void internalSafetyCheckAdd(const volatile void *);
       
  1387     Q_CORE_EXPORT void internalSafetyCheckRemove(const volatile void *);
       
  1388     Q_AUTOTEST_EXPORT void internalSafetyCheckCleanCheck();
       
  1389 }
       
  1390 
       
  1391 /*!
       
  1392     \internal
       
  1393 */
       
  1394 void QtSharedPointer::internalSafetyCheckAdd(const volatile void *)
       
  1395 {
       
  1396     // Qt 4.5 compatibility
       
  1397     // this function is broken by design, so it was replaced with internalSafetyCheckAdd2
       
  1398     //
       
  1399     // it's broken because we tracked the pointers added and
       
  1400     // removed from QSharedPointer, converted to void*.
       
  1401     // That is, this is supposed to track the "top-of-object" pointer in
       
  1402     // case of multiple inheritance.
       
  1403     //
       
  1404     // However, it doesn't work well in some compilers:
       
  1405     // if you create an object with a class of type A and the last reference
       
  1406     // is dropped of type B, then the value passed to internalSafetyCheckRemove could
       
  1407     // be different than was added. That would leave dangling addresses.
       
  1408     //
       
  1409     // So instead, we track the pointer by the d-pointer instead.
       
  1410 }
       
  1411 
       
  1412 /*!
       
  1413     \internal
       
  1414 */
       
  1415 void QtSharedPointer::internalSafetyCheckRemove(const volatile void *)
       
  1416 {
       
  1417     // Qt 4.5 compatibility
       
  1418     // see comments above
       
  1419 }
       
  1420 
       
  1421 /*!
       
  1422     \internal
       
  1423 */
       
  1424 void QtSharedPointer::internalSafetyCheckAdd2(const void *d_ptr, const volatile void *ptr)
       
  1425 {
       
  1426     // see comments above for the rationale for this function
       
  1427     KnownPointers *const kp = knownPointers();
       
  1428     if (!kp)
       
  1429         return;                 // end-game: the application is being destroyed already
       
  1430 
       
  1431     QMutexLocker lock(&kp->mutex);
       
  1432     Q_ASSERT(!kp->dPointers.contains(d_ptr));
       
  1433 
       
  1434     //qDebug("Adding d=%p value=%p", d_ptr, ptr);
       
  1435     
       
  1436     const void *other_d_ptr = kp->dataPointers.value(ptr, 0);
       
  1437     if (other_d_ptr) {
       
  1438 #  ifdef BACKTRACE_SUPPORTED
       
  1439         printBacktrace(knownPointers()->dPointers.value(other_d_ptr).backtrace);
       
  1440 #  endif
       
  1441         qFatal("QSharedPointer: internal self-check failed: pointer %p was already tracked "
       
  1442                "by another QSharedPointer object %p", ptr, other_d_ptr);
       
  1443     }
       
  1444 
       
  1445     Data data;
       
  1446     data.pointer = ptr;
       
  1447 #  ifdef BACKTRACE_SUPPORTED
       
  1448     data.backtrace = saveBacktrace();
       
  1449 #  endif
       
  1450 
       
  1451     kp->dPointers.insert(d_ptr, data);
       
  1452     kp->dataPointers.insert(ptr, d_ptr);
       
  1453     Q_ASSERT(kp->dPointers.size() == kp->dataPointers.size());
       
  1454 }
       
  1455 
       
  1456 /*!
       
  1457     \internal
       
  1458 */
       
  1459 void QtSharedPointer::internalSafetyCheckRemove2(const void *d_ptr)
       
  1460 {
       
  1461     KnownPointers *const kp = knownPointers();
       
  1462     if (!kp)
       
  1463         return;                 // end-game: the application is being destroyed already
       
  1464 
       
  1465     QMutexLocker lock(&kp->mutex);
       
  1466 
       
  1467     QHash<const void *, Data>::iterator it = kp->dPointers.find(d_ptr);
       
  1468     if (it == kp->dPointers.end()) {
       
  1469         qFatal("QSharedPointer: internal self-check inconsistency: pointer %p was not tracked. "
       
  1470                "To use QT_SHAREDPOINTER_TRACK_POINTERS, you have to enable it throughout "
       
  1471                "in your code.", d_ptr);
       
  1472     }
       
  1473 
       
  1474     QHash<const volatile void *, const void *>::iterator it2 = kp->dataPointers.find(it->pointer);
       
  1475     Q_ASSERT(it2 != kp->dataPointers.end());
       
  1476 
       
  1477     //qDebug("Removing d=%p value=%p", d_ptr, it->pointer);
       
  1478 
       
  1479     // remove entries
       
  1480     kp->dataPointers.erase(it2);
       
  1481     kp->dPointers.erase(it);
       
  1482     Q_ASSERT(kp->dPointers.size() == kp->dataPointers.size());
       
  1483 }
       
  1484 
       
  1485 /*!
       
  1486     \internal
       
  1487     Called by the QSharedPointer autotest
       
  1488 */
       
  1489 void QtSharedPointer::internalSafetyCheckCleanCheck()
       
  1490 {
       
  1491 #  ifdef QT_BUILD_INTERNAL
       
  1492     KnownPointers *const kp = knownPointers();
       
  1493     Q_ASSERT_X(kp, "internalSafetyCheckSelfCheck()", "Called after global statics deletion!");
       
  1494 
       
  1495     if (kp->dPointers.size() != kp->dataPointers.size())
       
  1496         qFatal("Internal consistency error: the number of pointers is not equal!");
       
  1497 
       
  1498     if (!kp->dPointers.isEmpty())
       
  1499         qFatal("Pointer cleaning failed: %d entries remaining", kp->dPointers.size());
       
  1500 #  endif
       
  1501 }
       
  1502 
       
  1503 QT_END_NAMESPACE
       
  1504 
       
  1505 #endif