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

系统编程

开发平台:

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 QBITARRAY_H
  38. #define QBITARRAY_H
  39. #include <QtCore/qbytearray.h>
  40. QT_BEGIN_HEADER
  41. QT_BEGIN_NAMESPACE
  42. QT_MODULE(Core)
  43. class QBitRef;
  44. class Q_CORE_EXPORT QBitArray
  45. {
  46.     friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QBitArray &);
  47.     friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QBitArray &);
  48.     friend Q_CORE_EXPORT uint qHash(const QBitArray &key);
  49.     QByteArray d;
  50. public:
  51.     inline QBitArray() {}
  52.     explicit QBitArray(int size, bool val = false);
  53.     QBitArray(const QBitArray &other) : d(other.d) {}
  54.     inline QBitArray &operator=(const QBitArray &other) { d = other.d; return *this; }
  55.     inline int size() const { return (d.size() << 3) - *d.constData(); }
  56.     inline int count() const { return (d.size() << 3) - *d.constData(); }
  57.     int count(bool on) const;
  58.     // ### Qt 5: Store the number of set bits separately
  59.     inline bool isEmpty() const { return d.isEmpty(); }
  60.     inline bool isNull() const { return d.isNull(); }
  61.     void resize(int size);
  62.     inline void detach() { d.detach(); }
  63.     inline bool isDetached() const { return d.isDetached(); }
  64.     inline void clear() { d.clear(); }
  65.     bool testBit(int i) const;
  66.     void setBit(int i);
  67.     void setBit(int i, bool val);
  68.     void clearBit(int i);
  69.     bool toggleBit(int i);
  70.     bool at(int i) const;
  71.     QBitRef operator[](int i);
  72.     bool operator[](int i) const;
  73.     QBitRef operator[](uint i);
  74.     bool operator[](uint i) const;
  75.     QBitArray& operator&=(const QBitArray &);
  76.     QBitArray& operator|=(const QBitArray &);
  77.     QBitArray& operator^=(const QBitArray &);
  78.     QBitArray  operator~() const;
  79.     inline bool operator==(const QBitArray& a) const { return d == a.d; }
  80.     inline bool operator!=(const QBitArray& a) const { return d != a.d; }
  81.     inline bool fill(bool val, int size = -1);
  82.     void fill(bool val, int first, int last);
  83.     inline void truncate(int pos) { if (pos < size()) resize(pos); }
  84. public:
  85.     typedef QByteArray::DataPtr DataPtr;
  86.     inline DataPtr &data_ptr() { return d.data_ptr(); }
  87. };
  88. inline bool QBitArray::fill(bool aval, int asize)
  89. { *this = QBitArray((asize < 0 ? this->size() : asize), aval); return true; }
  90. Q_CORE_EXPORT QBitArray operator&(const QBitArray &, const QBitArray &);
  91. Q_CORE_EXPORT QBitArray operator|(const QBitArray &, const QBitArray &);
  92. Q_CORE_EXPORT QBitArray operator^(const QBitArray &, const QBitArray &);
  93. inline bool QBitArray::testBit(int i) const
  94. { Q_ASSERT(i >= 0 && i < size());
  95.  return (*(reinterpret_cast<const uchar*>(d.constData())+1+(i>>3)) & (1 << (i & 7))) != 0; }
  96. inline void QBitArray::setBit(int i)
  97. { Q_ASSERT(i >= 0 && i < size());
  98.  *(reinterpret_cast<uchar*>(d.data())+1+(i>>3)) |= (1 << (i & 7)); }
  99. inline void QBitArray::clearBit(int i)
  100. { Q_ASSERT(i >= 0 && i < size());
  101.  *(reinterpret_cast<uchar*>(d.data())+1+(i>>3)) &= ~(1 << (i & 7)); }
  102. inline void QBitArray::setBit(int i, bool val)
  103. { if (val) setBit(i); else clearBit(i); }
  104. inline bool QBitArray::toggleBit(int i)
  105. { Q_ASSERT(i >= 0 &&  i < size());
  106.  uchar b = 1<< (i&7); uchar* p = reinterpret_cast<uchar*>(d.data())+1+(i>>3);
  107.  uchar c = *p&b; *p^=b; return c!=0; }
  108. inline bool QBitArray::operator[](int i) const { return testBit(i); }
  109. inline bool QBitArray::operator[](uint i) const { return testBit(i); }
  110. inline bool QBitArray::at(int i) const { return testBit(i); }
  111. class Q_CORE_EXPORT QBitRef
  112. {
  113. private:
  114.     QBitArray& a;
  115.     int i;
  116.     inline QBitRef(QBitArray& array, int idx) : a(array), i(idx) {}
  117.     friend class QBitArray;
  118. public:
  119.     inline operator bool() const { return a.testBit(i); }
  120.     inline bool operator!() const { return !a.testBit(i); }
  121.     QBitRef& operator=(const QBitRef& val) { a.setBit(i, val); return *this; }
  122.     QBitRef& operator=(bool val) { a.setBit(i, val); return *this; }
  123. };
  124. inline QBitRef QBitArray::operator[](int i)
  125. { Q_ASSERT(i >= 0); return QBitRef(*this, i); }
  126. inline QBitRef QBitArray::operator[](uint i)
  127. { return QBitRef(*this, i); }
  128. #ifndef QT_NO_DATASTREAM
  129. Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QBitArray &);
  130. Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QBitArray &);
  131. #endif
  132. Q_DECLARE_TYPEINFO(QBitArray, Q_MOVABLE_TYPE);
  133. Q_DECLARE_SHARED(QBitArray)
  134. QT_END_NAMESPACE
  135. QT_END_HEADER
  136. #endif // QBITARRAY_H