diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2019-12-26 19:32:00 +0100 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2020-02-10 14:09:12 +0000 |
commit | b1089787d1dd9dd2b6b09a74923ea5f573d04bb2 (patch) | |
tree | f4cbe197b94a00ce325f1b054885678d238459aa /src | |
parent | 4777c6d76bbcee4a45d35e3f66ef099b162698f9 (diff) |
QMimeData: Extract Method QMimeDataPrivate::find()
Centralize the search for the QMimeDataStruct with a given format in
find() (overloaded on const and non-const, but implemented only once),
and use it in the three other functions that performed lookup before.
In setData(), optimize the case where data is overwritten.
Use a std::vector to not have to think about hidden detaches when
implementing the const find() in terms of the non-const one.
Change-Id: I874e5c6ef9c97d98b42f29faccbc3043e8c6a855
Reviewed-by: David Faure <david.faure@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/kernel/qmimedata.cpp | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/src/corelib/kernel/qmimedata.cpp b/src/corelib/kernel/qmimedata.cpp index fca258c9e3..c38dab3e3f 100644 --- a/src/corelib/kernel/qmimedata.cpp +++ b/src/corelib/kernel/qmimedata.cpp @@ -72,40 +72,44 @@ public: QVariant retrieveTypedData(const QString &format, QMetaType::Type type) const; - QVector<QMimeDataStruct> dataList; + std::vector<QMimeDataStruct>::iterator find(const QString &format) noexcept { + const auto formatEquals = [](const QString &format) { + return [&format](const QMimeDataStruct &s) { return s.format == format; }; + }; + return std::find_if(dataList.begin(), dataList.end(), formatEquals(format)); + } + + std::vector<QMimeDataStruct>::const_iterator find(const QString &format) const noexcept { + return const_cast<QMimeDataPrivate*>(this)->find(format); + } + + std::vector<QMimeDataStruct> dataList; }; void QMimeDataPrivate::removeData(const QString &format) { - for (int i=0; i<dataList.size(); i++) { - if (dataList.at(i).format == format) { - dataList.removeAt(i); - return; - } - } + const auto it = find(format); + if (it != dataList.end()) + dataList.erase(it); } void QMimeDataPrivate::setData(const QString &format, const QVariant &data) { - // remove it first if the format is already here. - removeData(format); - QMimeDataStruct mimeData; - mimeData.format = format; - mimeData.data = data; - dataList += mimeData; + const auto it = find(format); + if (it == dataList.end()) + dataList.push_back({format, data}); + else + it->data = data; } QVariant QMimeDataPrivate::getData(const QString &format) const { - QVariant data; - for (int i=0; i<dataList.size(); i++) { - if (dataList.at(i).format == format) { - data = dataList.at(i).data; - break; - } - } - return data; + const auto it = find(format); + if (it == dataList.cend()) + return {}; + else + return it->data; } QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QMetaType::Type type) const @@ -635,10 +639,9 @@ QStringList QMimeData::formats() const { Q_D(const QMimeData); QStringList list; - const int size = d->dataList.size(); - list.reserve(size); - for (int i = 0; i < size; ++i) - list += d->dataList.at(i).format; + list.reserve(static_cast<int>(d->dataList.size())); + for (auto &e : d->dataList) + list += e.format; return list; } |