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>
This commit is contained in:
parent
4777c6d76b
commit
b1089787d1
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user