diff options
| author | Volker Hilsheimer <[email protected]> | 2025-12-05 09:35:07 +0100 |
|---|---|---|
| committer | Volker Hilsheimer <[email protected]> | 2025-12-10 15:10:14 +0100 |
| commit | 2898f6f7e4064fb48057cbe7f012e7da850ee3bc (patch) | |
| tree | f6e8fda0e2243eed548b0a9508c455f353435af7 /src | |
| parent | 5277a28fe7840fcb2b7ffd9991e8e96776c2a61b (diff) | |
QRMA: add move assignment operator to DataReference
Don't copy the new value into the QVariant if we can move it.
Also add move-construction and move-assignment SFM to the DataReference
type itself; they don't save us anything right now, but it clarifies the
semantics.
Amends e22cd01076e795ed853b0536605d3bb205587d78.
Pick-to: 6.11
Change-Id: I6cdba7a03f5e6e59bb9e2f5e44483fea7b1ed1cc
Reviewed-by: Artem Dyomin <[email protected]>
Diffstat (limited to 'src')
| -rw-r--r-- | src/corelib/itemmodels/qrangemodeladapter.h | 58 |
1 files changed, 40 insertions, 18 deletions
diff --git a/src/corelib/itemmodels/qrangemodeladapter.h b/src/corelib/itemmodels/qrangemodeladapter.h index bd3342e6185..bb57b816fe5 100644 --- a/src/corelib/itemmodels/qrangemodeladapter.h +++ b/src/corelib/itemmodels/qrangemodeladapter.h @@ -141,6 +141,7 @@ public: } DataReference(const DataReference &other) = default; + DataReference(DataReference &&other) = default; // reference (not std::reference_wrapper) semantics DataReference &operator=(const DataReference &other) @@ -149,29 +150,23 @@ public: return *this; } + DataReference &operator=(DataReference &&other) + { + *this = other.get(); + return *this; + } + ~DataReference() = default; DataReference &operator=(const value_type &value) { - constexpr Qt::ItemDataRole dataRole = Qt::RangeModelAdapterRole; + assign(value); + return *this; + } - if (m_index.isValid()) { - auto model = const_cast<QAbstractItemModel *>(m_index.model()); - [[maybe_unused]] bool couldWrite = false; - if constexpr (std::is_same_v<q20::remove_cvref_t<value_type>, QVariant>) - couldWrite = model->setData(m_index, value, dataRole); - else - couldWrite = model->setData(m_index, QVariant::fromValue(value), dataRole); -#ifndef QT_NO_DEBUG - if (!couldWrite) { - qWarning() << "Writing value of type" << QMetaType::fromType<value_type>().name() - << "to role" << dataRole << "at index" << m_index - << "of the model failed"; - } - } else { - qCritical("Data reference for invalid index, can't write to model"); -#endif - } + DataReference &operator=(value_type &&value) + { + assign(std::move(value)); return *this; } @@ -196,6 +191,33 @@ public: private: QModelIndex m_index; + template <typename Value> + void assign(Value &&value) + { + constexpr Qt::ItemDataRole dataRole = Qt::RangeModelAdapterRole; + + if (m_index.isValid()) { + auto model = const_cast<QAbstractItemModel *>(m_index.model()); + [[maybe_unused]] bool couldWrite = false; + if constexpr (std::is_same_v<q20::remove_cvref_t<Value>, QVariant>) { + couldWrite = model->setData(m_index, value, dataRole); + } else { + couldWrite = model->setData(m_index, + QVariant::fromValue(std::forward<Value>(value)), + dataRole); + } +#ifndef QT_NO_DEBUG + if (!couldWrite) { + qWarning() << "Writing value of type" + << QMetaType::fromType<q20::remove_cvref_t<Value>>().name() + << "to role" << dataRole << "at index" << m_index << "failed"; + } + } else { + qCritical("Data reference for invalid index, can't write to model"); +#endif + } + } + friend inline bool comparesEqual(const DataReference &lhs, const DataReference &rhs) { return lhs.m_index == rhs.m_index |
