diff options
author | João Abecasis <joao.abecasis@nokia.com> | 2011-11-29 17:53:57 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-11 12:07:13 +0100 |
commit | 390eec325b25a142ce2204f1d1950621d4a519e3 (patch) | |
tree | 13d0a0f200fd19863b8746da1464442a04c4946b /src/corelib | |
parent | 0806bc2d1b518b53681b3d8023def95ba8122630 (diff) |
template<class T> struct QTypedArrayData
QTypedArrayData is a typed overlay for QArrayData, providing convenience
and type-safety. It adds no data members to QArrayData, thus avoiding
compiler-generated warnings for aliasing issues when casting back and
forth.
Change-Id: I969342a30989c4c14b3d03d0602e3d60a4cc0e9d
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/tools/qarraydata.h | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/corelib/tools/qarraydata.h b/src/corelib/tools/qarraydata.h index 684f00870d..1312feccdb 100644 --- a/src/corelib/tools/qarraydata.h +++ b/src/corelib/tools/qarraydata.h @@ -82,6 +82,48 @@ struct Q_CORE_EXPORT QArrayData static const QArrayData shared_empty; }; +template <class T> +struct QTypedArrayData + : QArrayData +{ + typedef T *iterator; + typedef const T *const_iterator; + + T *data() { return static_cast<T *>(QArrayData::data()); } + const T *data() const { return static_cast<const T *>(QArrayData::data()); } + + T *begin() { return data(); } + T *end() { return data() + size; } + const T *begin() const { return data(); } + const T *end() const { return data() + size; } + + class AlignmentDummy { QArrayData header; T data; }; + + static QTypedArrayData *allocate(size_t capacity, bool reserve = false) + Q_REQUIRED_RESULT + { + return static_cast<QTypedArrayData *>(QArrayData::allocate(sizeof(T), + Q_ALIGNOF(AlignmentDummy), capacity, reserve)); + } + + static void deallocate(QArrayData *data) + { + QArrayData::deallocate(data, sizeof(T), Q_ALIGNOF(AlignmentDummy)); + } + + static QTypedArrayData *sharedNull() + { + return static_cast<QTypedArrayData *>( + const_cast<QArrayData *>(&QArrayData::shared_null)); + } + + static QTypedArrayData *sharedEmpty() + { + return static_cast<QTypedArrayData *>( + const_cast<QArrayData *>(&QArrayData::shared_empty)); + } +}; + template <class T, size_t N> struct QStaticArrayData { |