qshareddata.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:7k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtCore module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QSHAREDDATA_H
  38. #define QSHAREDDATA_H
  39. #include <QtCore/qglobal.h>
  40. #include <QtCore/qatomic.h>
  41. QT_BEGIN_HEADER
  42. QT_BEGIN_NAMESPACE
  43. QT_MODULE(Core)
  44. template <class T> class QSharedDataPointer;
  45. class Q_CORE_EXPORT QSharedData
  46. {
  47. public:
  48.     mutable QAtomicInt ref;
  49.     inline QSharedData() : ref(0) { }
  50.     inline QSharedData(const QSharedData &) : ref(0) { }
  51. private:
  52.     // using the assignment operator would lead to corruption in the ref-counting
  53.     QSharedData &operator=(const QSharedData &);
  54. };
  55. template <class T> class QSharedDataPointer
  56. {
  57. public:
  58.     inline void detach() { if (d && d->ref != 1) detach_helper(); }
  59.     inline T &operator*() { detach(); return *d; }
  60.     inline const T &operator*() const { return *d; }
  61.     inline T *operator->() { detach(); return d; }
  62.     inline const T *operator->() const { return d; }
  63.     inline operator T *() { detach(); return d; }
  64.     inline operator const T *() const { return d; }
  65.     inline T *data() { detach(); return d; }
  66.     inline const T *data() const { return d; }
  67.     inline const T *constData() const { return d; }
  68.     inline bool operator==(const QSharedDataPointer<T> &other) const { return d == other.d; }
  69.     inline bool operator!=(const QSharedDataPointer<T> &other) const { return d != other.d; }
  70.     inline QSharedDataPointer() { d = 0; }
  71.     inline ~QSharedDataPointer() { if (d && !d->ref.deref()) delete d; }
  72.     explicit QSharedDataPointer(T *data);
  73.     inline QSharedDataPointer(const QSharedDataPointer<T> &o) : d(o.d) { if (d) d->ref.ref(); }
  74.     inline QSharedDataPointer<T> & operator=(const QSharedDataPointer<T> &o) {
  75.         if (o.d != d) {
  76.             if (o.d)
  77.                 o.d->ref.ref();
  78.             if (d && !d->ref.deref())
  79.                 delete d;
  80.             d = o.d;
  81.         }
  82.         return *this;
  83.     }
  84.     inline QSharedDataPointer &operator=(T *o) {
  85.         if (o != d) {
  86.             if (o)
  87.                 o->ref.ref();
  88.             if (d && !d->ref.deref())
  89.                 delete d;
  90.             d = o;
  91.         }
  92.         return *this;
  93.     }
  94.     inline bool operator!() const { return !d; }
  95. private:
  96.     void detach_helper();
  97.     T *d;
  98. };
  99. template <class T> class QExplicitlySharedDataPointer
  100. {
  101. public:
  102.     typedef T Type;
  103.     inline T &operator*() { return *d; }
  104.     inline const T &operator*() const { return *d; }
  105.     inline T *operator->() { return d; }
  106.     inline T *operator->() const { return d; }
  107.     inline T *data() const { return d; }
  108.     inline const T *constData() const { return d; }
  109.     inline void detach() { if (d && d->ref != 1) detach_helper(); }
  110.     inline void reset()
  111.     {
  112.         if(d && !d->ref.deref())
  113.             delete d;
  114.         d = 0;
  115.     }
  116.     inline operator bool () const { return d != 0; }
  117.     inline bool operator==(const QExplicitlySharedDataPointer<T> &other) const { return d == other.d; }
  118.     inline bool operator!=(const QExplicitlySharedDataPointer<T> &other) const { return d != other.d; }
  119.     inline bool operator==(const T *ptr) const { return d == ptr; }
  120.     inline bool operator!=(const T *ptr) const { return d != ptr; }
  121.     inline QExplicitlySharedDataPointer() { d = 0; }
  122.     inline ~QExplicitlySharedDataPointer() { if (d && !d->ref.deref()) delete d; }
  123.     explicit QExplicitlySharedDataPointer(T *data);
  124.     inline QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o) : d(o.d) { if (d) d->ref.ref(); }
  125. #ifndef QT_NO_MEMBER_TEMPLATES
  126.     template<class X>
  127.     inline QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o) : d(static_cast<T *>(o.data()))
  128.     {
  129.         if(d)
  130.             d->ref.ref();
  131.     }
  132. #endif
  133.     inline QExplicitlySharedDataPointer<T> & operator=(const QExplicitlySharedDataPointer<T> &o) {
  134.         if (o.d != d) {
  135.             if (o.d)
  136.                 o.d->ref.ref();
  137.             if (d && !d->ref.deref())
  138.                 delete d;
  139.             d = o.d;
  140.         }
  141.         return *this;
  142.     }
  143.     inline QExplicitlySharedDataPointer &operator=(T *o) {
  144.         if (o != d) {
  145.             if (o)
  146.                 o->ref.ref();
  147.             if (d && !d->ref.deref())
  148.                 delete d;
  149.             d = o;
  150.         }
  151.         return *this;
  152.     }
  153.     inline bool operator!() const { return !d; }
  154. private:
  155.     void detach_helper();
  156.     T *d;
  157. };
  158. template <class T>
  159. Q_INLINE_TEMPLATE QSharedDataPointer<T>::QSharedDataPointer(T *adata) : d(adata)
  160. { if (d) d->ref.ref(); }
  161. template <class T>
  162. Q_OUTOFLINE_TEMPLATE void QSharedDataPointer<T>::detach_helper()
  163. {
  164.     T *x = new T(*d);
  165.     x->ref.ref();
  166.     if (!d->ref.deref())
  167.         delete d;
  168.     d = x;
  169. }
  170. template <class T>
  171. Q_OUTOFLINE_TEMPLATE void QExplicitlySharedDataPointer<T>::detach_helper()
  172. {
  173.     T *x = new T(*d);
  174.     x->ref.ref();
  175.     if (!d->ref.deref())
  176.         delete d;
  177.     d = x;
  178. }
  179. template <class T>
  180. Q_INLINE_TEMPLATE QExplicitlySharedDataPointer<T>::QExplicitlySharedDataPointer(T *adata) : d(adata)
  181. { if (d) d->ref.ref(); }
  182. QT_END_NAMESPACE
  183. QT_END_HEADER
  184. #endif // QSHAREDDATA_H