Commit b1089787 authored by Marc Mutz's avatar Marc Mutz
Browse files

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: default avatarDavid Faure <david.faure@kdab.com>
Showing with 28 additions and 25 deletions
......@@ -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;
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment