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 <lars.knoll@qt.io>
This commit is contained in:
parent
f5a32861e3
commit
c86aa00431
@ -39,6 +39,7 @@
|
||||
|
||||
#include "qitemselectionmodel.h"
|
||||
#include <private/qitemselectionmodel_p.h>
|
||||
#include <private/qduplicatetracker_p.h>
|
||||
#include <qdebug.h>
|
||||
|
||||
#include <algorithm>
|
||||
@ -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<RowOrColumnDefinition> rowsSeen;
|
||||
QDuplicateTracker<RowOrColumnDefinition> 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<RowOrColumnDefinition> columnsSeen;
|
||||
QDuplicateTracker<RowOrColumnDefinition> 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));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user