diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2020-05-05 21:43:42 +0200 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2020-05-06 11:27:48 +0200 |
commit | 8c889bf1104ed1dad95a01d2b1ae1e6950fe82ed (patch) | |
tree | 18701f51f519e39bcc3fe4d487854700af837883 | |
parent | 0de4f0dcc3cae4f535a5604933e7d44212a159d4 (diff) |
QModelIndex/QAIM: improve const correctness
QAIM::createIndex() takes a non-const void*. It's
typically called from inside QAIM::index(), which is a
const member function. If the data storage wrapped
by the model is const correct, it means that we have
to drop constness somewhere before calling createIndex().
To support this: change createIndex() to take a
const void * instead. This is painless.
Accessing the pointer is a bit more troubling, because
the accessor (QModelIndex::internalPointer()) returns
void *. (Effectively, now it does a const_cast...).
To avoid a massive source break, I've left it alone,
and instead added another function to retrieve a
const void *.
Read-only models can now be fully (deep) const correct.
[ChangeLog][QtCore][QAbstractItemModel] The
createIndex() function now takes a const void *, rather
than a void *.
[ChangeLog][QtCore][QModelIndex] Added the
constInternalPointer() function, to retrieve the
internal pointer as a pointer-to-const.
Change-Id: I108912b6814fcd5fe0c5cb7db6c721ba51e83de0
Reviewed-by: Samuel Gaist <samuel.gaist@idiap.ch>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r-- | src/corelib/itemmodels/qabstractitemmodel.cpp | 27 | ||||
-rw-r--r-- | src/corelib/itemmodels/qabstractitemmodel.h | 8 |
2 files changed, 31 insertions, 4 deletions
diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp index fac7058d29..49b5031559 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.cpp +++ b/src/corelib/itemmodels/qabstractitemmodel.cpp @@ -352,6 +352,22 @@ void *QPersistentModelIndex::internalPointer() const } /*! + \fn const void *QPersistentModelIndex::constInternalPointer() const + \since 6.0 + \internal + + Returns a \c{const void} \c{*} pointer used by the model to + associate the index with the internal data structure. +*/ + +const void *QPersistentModelIndex::constInternalPointer() const +{ + if (d) + return d->index.constInternalPointer(); + return nullptr; +} + +/*! \fn quintptr QPersistentModelIndex::internalId() const \internal @@ -1065,6 +1081,15 @@ void QAbstractItemModel::resetInternalData() */ /*! + \fn const void *QModelIndex::constInternalPointer() const + + Returns a \c{const void} \c{*} pointer used by the model to associate + the index with the internal data structure. + + \sa QAbstractItemModel::createIndex() +*/ + +/*! \fn quintptr QModelIndex::internalId() const Returns a \c{quintptr} used by the model to associate @@ -2589,7 +2614,7 @@ bool QAbstractItemModel::setHeaderData(int section, Qt::Orientation orientation, } /*! - \fn QModelIndex QAbstractItemModel::createIndex(int row, int column, void *ptr) const + \fn QModelIndex QAbstractItemModel::createIndex(int row, int column, const void *ptr) const Creates a model index for the given \a row and \a column with the internal pointer \a ptr. diff --git a/src/corelib/itemmodels/qabstractitemmodel.h b/src/corelib/itemmodels/qabstractitemmodel.h index 86ff361ccb..a23b5b8cfc 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.h +++ b/src/corelib/itemmodels/qabstractitemmodel.h @@ -63,6 +63,7 @@ public: Q_DECL_CONSTEXPR inline int column() const noexcept { return c; } Q_DECL_CONSTEXPR inline quintptr internalId() const noexcept { return i; } inline void *internalPointer() const noexcept { return reinterpret_cast<void*>(i); } + inline const void *constInternalPointer() const noexcept { return reinterpret_cast<const void *>(i); } inline QModelIndex parent() const; inline QModelIndex sibling(int row, int column) const; inline QModelIndex siblingAtColumn(int column) const; @@ -86,7 +87,7 @@ public: || (i == other.i && std::less<const QAbstractItemModel *>()(m, other.m)))))); } private: - inline QModelIndex(int arow, int acolumn, void *ptr, const QAbstractItemModel *amodel) noexcept + inline QModelIndex(int arow, int acolumn, const void *ptr, const QAbstractItemModel *amodel) noexcept : r(arow), c(acolumn), i(reinterpret_cast<quintptr>(ptr)), m(amodel) {} Q_DECL_CONSTEXPR inline QModelIndex(int arow, int acolumn, quintptr id, const QAbstractItemModel *amodel) noexcept : r(arow), c(acolumn), i(id), m(amodel) {} @@ -129,6 +130,7 @@ public: int row() const; int column() const; void *internalPointer() const; + const void *constInternalPointer() const; quintptr internalId() const; QModelIndex parent() const; QModelIndex sibling(int row, int column) const; @@ -307,7 +309,7 @@ protected Q_SLOTS: protected: QAbstractItemModel(QAbstractItemModelPrivate &dd, QObject *parent = nullptr); - inline QModelIndex createIndex(int row, int column, void *data = nullptr) const; + inline QModelIndex createIndex(int row, int column, const void *data = nullptr) const; inline QModelIndex createIndex(int row, int column, quintptr id) const; void encodeData(const QModelIndexList &indexes, QDataStream &stream) const; @@ -378,7 +380,7 @@ inline bool QAbstractItemModel::moveRow(const QModelIndex &sourceParent, int sou inline bool QAbstractItemModel::moveColumn(const QModelIndex &sourceParent, int sourceColumn, const QModelIndex &destinationParent, int destinationChild) { return moveColumns(sourceParent, sourceColumn, 1, destinationParent, destinationChild); } -inline QModelIndex QAbstractItemModel::createIndex(int arow, int acolumn, void *adata) const +inline QModelIndex QAbstractItemModel::createIndex(int arow, int acolumn, const void *adata) const { return QModelIndex(arow, acolumn, adata, this); } inline QModelIndex QAbstractItemModel::createIndex(int arow, int acolumn, quintptr aid) const { return QModelIndex(arow, acolumn, aid, this); } |