From c86aa0043137e95d8fc5c1ab69b613b5a2cc8650 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sat, 2 May 2020 23:03:39 +0200 Subject: QItemSelectionModel: port a local QSet to QDuplicateTracker Apart from a more fitting, minimal, API, QDuplicateTracker also transparently uses C++17 pmr::monotonic_buffer_resource to avoid, or at least reduce, memory allocations. Change-Id: I5d7d32c52ad19d37c0e1191e822304349944d7e6 Reviewed-by: Lars Knoll --- src/corelib/itemmodels/qitemselectionmodel.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'src/corelib/itemmodels') diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp index 7327b5deee..418c425810 100644 --- a/src/corelib/itemmodels/qitemselectionmodel.cpp +++ b/src/corelib/itemmodels/qitemselectionmodel.cpp @@ -39,6 +39,7 @@ #include "qitemselectionmodel.h" #include +#include #include #include @@ -1738,6 +1739,8 @@ size_t qHash(const RowOrColumnDefinition &key, size_t seed = 0) noexcept return seed; } +QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(RowOrColumnDefinition) + /*! \since 4.2 Returns the indexes in the given \a column for the rows where all columns are selected. @@ -1749,16 +1752,14 @@ QModelIndexList QItemSelectionModel::selectedRows(int column) const { QModelIndexList indexes; - QSet rowsSeen; + QDuplicateTracker rowsSeen; const QItemSelection ranges = selection(); for (int i = 0; i < ranges.count(); ++i) { const QItemSelectionRange &range = ranges.at(i); QModelIndex parent = range.parent(); for (int row = range.top(); row <= range.bottom(); row++) { - RowOrColumnDefinition rowDef = {parent, row}; - if (!rowsSeen.contains(rowDef)) { - rowsSeen << rowDef; + if (!rowsSeen.hasSeen({parent, row})) { if (isRowSelected(row, parent)) { indexes.append(model()->index(row, column, parent)); } @@ -1780,16 +1781,14 @@ QModelIndexList QItemSelectionModel::selectedColumns(int row) const { QModelIndexList indexes; - QSet columnsSeen; + QDuplicateTracker columnsSeen; const QItemSelection ranges = selection(); for (int i = 0; i < ranges.count(); ++i) { const QItemSelectionRange &range = ranges.at(i); QModelIndex parent = range.parent(); for (int column = range.left(); column <= range.right(); column++) { - RowOrColumnDefinition columnDef = {parent, column}; - if (!columnsSeen.contains(columnDef)) { - columnsSeen << columnDef; + if (!columnsSeen.hasSeen({parent, column})) { if (isColumnSelected(column, parent)) { indexes.append(model()->index(row, column, parent)); } -- cgit v1.2.3