diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2023-01-13 19:41:44 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-01-19 16:45:22 +0000 |
commit | 0fbef8c9c81ab21e8e399c3815e3c51bcf4e9527 (patch) | |
tree | 8e33886b35a438a802769bb6cd1e67b8662dbf3a | |
parent | 98a263fb10d679bfa1d5baa4dc91383ccbd3f3a4 (diff) |
Introduce struct QCanSignalDescription::MultiplexValueRange
... and use it instead of QPair<QVarian, QVariant> to define a range of
values for a multiplexor signal.
Change-Id: Ibc04d9618ec46fa0af2f94d9808a82af35fb7dd7
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
(cherry picked from commit 53631e08169f285e81cc6c991d05cc511a7d9ed1)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/serialbus/qcandbcfileparser.cpp | 4 | ||||
-rw-r--r-- | src/serialbus/qcansignaldescription.cpp | 40 | ||||
-rw-r--r-- | src/serialbus/qcansignaldescription.h | 26 | ||||
-rw-r--r-- | tests/auto/qcandbcfileparser/tst_qcandbcfileparser.cpp | 16 | ||||
-rw-r--r-- | tests/auto/qcanframeprocessor/tst_qcanframeprocessor.cpp | 12 | ||||
-rw-r--r-- | tests/auto/qcansignaldescription/tst_qcansignaldescription.cpp | 2 |
6 files changed, 77 insertions, 23 deletions
diff --git a/src/serialbus/qcandbcfileparser.cpp b/src/serialbus/qcandbcfileparser.cpp index e327d7f..422efb0 100644 --- a/src/serialbus/qcandbcfileparser.cpp +++ b/src/serialbus/qcandbcfileparser.cpp @@ -843,7 +843,7 @@ void QCanDbcFileParserPrivate::parseExtendedMux(const QStringView data) if (sepIdx != -1) { const auto min = rangeView.first(sepIdx).trimmed().toUInt(); const auto max = rangeView.sliced(sepIdx + 1).trimmed().toUInt(); - rangeValues.emplaceBack(qMakePair(min, max)); + rangeValues.push_back({min, max}); } // We can have an arbitrary amount of ranges, so we can't use capture groups @@ -861,7 +861,7 @@ void QCanDbcFileParserPrivate::parseExtendedMux(const QStringView data) if (sepIdx != -1) { const auto min = range.first(sepIdx).trimmed().toUInt(); const auto max = range.sliced(sepIdx + 1).trimmed().toUInt(); - rangeValues.emplaceBack(qMakePair(min, max)); + rangeValues.push_back({min, max}); } } } diff --git a/src/serialbus/qcansignaldescription.cpp b/src/serialbus/qcansignaldescription.cpp index 7a016ad..113e736 100644 --- a/src/serialbus/qcansignaldescription.cpp +++ b/src/serialbus/qcansignaldescription.cpp @@ -162,6 +162,32 @@ QT_BEGIN_NAMESPACE */ /*! + \struct QCanSignalDescription::MultiplexValueRange + \inmodule QtSerialBus + \since 6.5 + + \brief Defines a range of values for a multiplexor signal. + + Each multiplexor signal can have several ranges of values assigned to it. + This type represents one range. Both minimum and maximum values are + included in the range. Minimum and maximum values can be equal, so a + MultiplexValueRange is never empty. If maximum is less than minimum, the + values will be swapped while doing the range check. + + \sa {Multiplexed Signals Explained} +*/ + +/*! + \variable QCanSignalDescription::MultiplexValueRange::minimum + \brief the minimum value of the range. +*/ + +/*! + \variable QCanSignalDescription::MultiplexValueRange::maximum + \brief the maximum value of the range. +*/ + +/*! \typealias QCanSignalDescription::MultiplexValues */ @@ -747,7 +773,7 @@ void QCanSignalDescription::addMultiplexSignal(const QString &name, const Multip void QCanSignalDescription::addMultiplexSignal(const QString &name, const QVariant &value) { d.detach(); - d->muxSignals.insert(name, { qMakePair(value, value) }); + d->muxSignals.insert(name, { {value, value} }); } // copied from qtbase/src/testlib/qtestcase.cpp @@ -820,6 +846,14 @@ QDebug QCanSignalDescription::debugStreaming(QDebug dbg, const QCanSignalDescrip dbg << ")"; return dbg; } + +QDebug QCanSignalDescription::MultiplexValueRange::debugStreaming(QDebug dbg, + const MultiplexValueRange &range) +{ + QDebugStateSaver saver(dbg); + dbg.nospace() << "MultiplexValueRange(" << range.minimum << ", " << range.maximum << ")"; + return dbg; +} #endif // QT_NO_DEBUG_STREAM template <typename T> @@ -828,8 +862,8 @@ static bool checkValue(const QVariant &valueVar, { const T val = valueVar.value<T>(); for (const auto &pair : ranges) { - T min = pair.first.value<T>(); - T max = pair.second.value<T>(); + T min = pair.minimum.value<T>(); + T max = pair.maximum.value<T>(); if (min > max) max = std::exchange(min, max); if (val >= min && val <= max) diff --git a/src/serialbus/qcansignaldescription.h b/src/serialbus/qcansignaldescription.h index aa54419..cbd2d9c 100644 --- a/src/serialbus/qcansignaldescription.h +++ b/src/serialbus/qcansignaldescription.h @@ -6,6 +6,7 @@ #include <QtCore/QDebug> #include <QtCore/QExplicitlySharedDataPointer> +#include <QtCore/QVariant> #include <QtSerialBus/qcancommondefinitions.h> #include <QtSerialBus/qtserialbusglobal.h> @@ -18,7 +19,30 @@ QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QCanSignalDescriptionPrivate, Q class Q_SERIALBUS_EXPORT QCanSignalDescription { public: - using MultiplexValues = QList<QPair<QVariant, QVariant>>; + struct MultiplexValueRange { + QVariant minimum; + QVariant maximum; + private: + friend bool operator==(const MultiplexValueRange &lhs, + const MultiplexValueRange &rhs) noexcept + { + return lhs.minimum == rhs.minimum && lhs.maximum == rhs.maximum; + } + friend bool operator!=(const MultiplexValueRange &lhs, + const MultiplexValueRange &rhs) noexcept + { + return !(lhs == rhs); + } + friend size_t qHash(const MultiplexValueRange &, size_t) noexcept = delete; +#ifndef QT_NO_DEBUG_STREAM + friend QDebug operator<<(QDebug dbg, const MultiplexValueRange &range) + { + return debugStreaming(dbg, range); + } + static QDebug debugStreaming(QDebug dbg, const MultiplexValueRange &range); +#endif // QT_NO_DEBUG_STREAM + }; + using MultiplexValues = QList<MultiplexValueRange>; using MultiplexSignalValues = QHash<QString, MultiplexValues>; diff --git a/tests/auto/qcandbcfileparser/tst_qcandbcfileparser.cpp b/tests/auto/qcandbcfileparser/tst_qcandbcfileparser.cpp index f6f5c4f..f7e0828 100644 --- a/tests/auto/qcandbcfileparser/tst_qcandbcfileparser.cpp +++ b/tests/auto/qcandbcfileparser/tst_qcandbcfileparser.cpp @@ -662,8 +662,7 @@ void tst_QCanDbcFileParser::parseFile_data() signalDesc.setMultiplexState(QtCanBus::MultiplexState::SwitchAndSignal); signalDesc.setStartBit(4); signalDesc.setBitLength(4); - signalDesc.addMultiplexSignal("s0", { qMakePair(1U, 1U), qMakePair(5U, 5U), - qMakePair(9U, 9U) }); + signalDesc.addMultiplexSignal("s0", { {1U, 1U}, {5U, 5U}, {9U, 9U} }); messageDesc.addSignalDescription(signalDesc); signalDesc.clearMultiplexSignals(); @@ -672,8 +671,7 @@ void tst_QCanDbcFileParser::parseFile_data() signalDesc.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal); signalDesc.setStartBit(4); signalDesc.setBitLength(12); - signalDesc.addMultiplexSignal("s0", { qMakePair(2U, 4U), qMakePair(6U, 8U), - qMakePair(10U, 10U) }); + signalDesc.addMultiplexSignal("s0", { {2U, 4U}, {6U, 8U}, {10U, 10U} }); messageDesc.addSignalDescription(signalDesc); signalDesc.clearMultiplexSignals(); @@ -687,7 +685,7 @@ void tst_QCanDbcFileParser::parseFile_data() signalDesc.setName("s4"); signalDesc.setStartBit(8); signalDesc.setBitLength(8); - signalDesc.addMultiplexSignal("s1", { qMakePair(2U, 3U), qMakePair(5U, 5U) }); + signalDesc.addMultiplexSignal("s1", { {2U, 3U}, {5U, 5U} }); messageDesc.addSignalDescription(signalDesc); signalDesc.clearMultiplexSignals(); @@ -829,8 +827,7 @@ void tst_QCanDbcFileParser::parseFile_data() signalDesc.setMultiplexState(QtCanBus::MultiplexState::SwitchAndSignal); signalDesc.setStartBit(4); signalDesc.setBitLength(4); - signalDesc.addMultiplexSignal("s0", { qMakePair(1U, 1U), qMakePair(5U, 5U), - qMakePair(9U, 9U) }); + signalDesc.addMultiplexSignal("s0", { {1U, 1U}, {5U, 5U}, {9U, 9U} }); otherDesc.addSignalDescription(signalDesc); signalDesc.clearMultiplexSignals(); @@ -839,8 +836,7 @@ void tst_QCanDbcFileParser::parseFile_data() signalDesc.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal); signalDesc.setStartBit(4); signalDesc.setBitLength(12); - signalDesc.addMultiplexSignal("s0", { qMakePair(2U, 4U), qMakePair(6U, 8U), - qMakePair(10U, 10U) }); + signalDesc.addMultiplexSignal("s0", { {2U, 4U}, {6U, 8U}, {10U, 10U} }); otherDesc.addSignalDescription(signalDesc); signalDesc.clearMultiplexSignals(); @@ -854,7 +850,7 @@ void tst_QCanDbcFileParser::parseFile_data() signalDesc.setName("s4"); signalDesc.setStartBit(8); signalDesc.setBitLength(8); - signalDesc.addMultiplexSignal("s1", { qMakePair(2U, 3U), qMakePair(5U, 5U) }); + signalDesc.addMultiplexSignal("s1", { {2U, 3U}, {5U, 5U} }); otherDesc.addSignalDescription(signalDesc); signalDesc.clearMultiplexSignals(); diff --git a/tests/auto/qcanframeprocessor/tst_qcanframeprocessor.cpp b/tests/auto/qcanframeprocessor/tst_qcanframeprocessor.cpp index 2dbc826..28bd204 100644 --- a/tests/auto/qcanframeprocessor/tst_qcanframeprocessor.cpp +++ b/tests/auto/qcanframeprocessor/tst_qcanframeprocessor.cpp @@ -684,7 +684,7 @@ void tst_QCanFrameProcessor::parseExtendedMultiplexedSignals() s2.setStartBit(4); s2.setBitLength(12); s2.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal); - const QCanSignalDescription::MultiplexValues muxValuesS0 { qMakePair(2, 4) }; + const QCanSignalDescription::MultiplexValues muxValuesS0 { {2, 4} }; s2.addMultiplexSignal(s0.name(), muxValuesS0); QCanSignalDescription s3; // depends on mux2 (so indirectly on mux1) @@ -701,7 +701,7 @@ void tst_QCanFrameProcessor::parseExtendedMultiplexedSignals() s4.setStartBit(8); s4.setBitLength(8); s4.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal); - const QCanSignalDescription::MultiplexValues muxValuesS1 { qMakePair(2, 3), qMakePair(5, 5) }; + const QCanSignalDescription::MultiplexValues muxValuesS1 { {2, 3}, {5, 5} }; s4.addMultiplexSignal(s1.name(), muxValuesS1); const QtCanBus::UniqueId uniqueId = 123; @@ -1529,7 +1529,7 @@ void tst_QCanFrameProcessor::prepareMultiplexedPayload() s2.setStartBit(4); s2.setBitLength(12); s2.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal); - const QCanSignalDescription::MultiplexValues muxValuesS0 { qMakePair(2, 4) }; + const QCanSignalDescription::MultiplexValues muxValuesS0 { {2, 4} }; s2.addMultiplexSignal(s0.name(), muxValuesS0); QCanSignalDescription s3; // depends on mux2 (so indirectly on mux1) @@ -1546,7 +1546,7 @@ void tst_QCanFrameProcessor::prepareMultiplexedPayload() s4.setStartBit(8); s4.setBitLength(8); s4.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal); - const QCanSignalDescription::MultiplexValues muxValuesS1 { qMakePair(2, 3), qMakePair(5, 5) }; + const QCanSignalDescription::MultiplexValues muxValuesS1 { {2, 3}, {5, 5} }; s4.addMultiplexSignal(s1.name(), muxValuesS1); const QtCanBus::UniqueId uniqueId = 123; @@ -1683,7 +1683,7 @@ void tst_QCanFrameProcessor::prepareWithErrorsAndWarnings_data() signalDesc.setStartBit(3); signalDesc.setBitLength(12); signalDesc.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal); - const QCanSignalDescription::MultiplexValues muxValuesS0 { qMakePair(2, 4), qMakePair(6, 6) }; + const QCanSignalDescription::MultiplexValues muxValuesS0 { {2, 4}, {6, 6} }; signalDesc.addMultiplexSignal("s0", muxValuesS0); messageDesc.addSignalDescription(signalDesc); @@ -1701,7 +1701,7 @@ void tst_QCanFrameProcessor::prepareWithErrorsAndWarnings_data() signalDesc.setBitLength(8); signalDesc.setMultiplexState(QtCanBus::MultiplexState::MultiplexedSignal); signalDesc.addMultiplexSignal("s0", 1); - const QCanSignalDescription::MultiplexValues muxValuesS2 { qMakePair(1, 3), qMakePair(5, 6) }; + const QCanSignalDescription::MultiplexValues muxValuesS2 { {1, 3}, {5, 6} }; signalDesc.addMultiplexSignal("s2", muxValuesS2); messageDesc.addSignalDescription(signalDesc); diff --git a/tests/auto/qcansignaldescription/tst_qcansignaldescription.cpp b/tests/auto/qcansignaldescription/tst_qcansignaldescription.cpp index 81e3f4a..2a4ef79 100644 --- a/tests/auto/qcansignaldescription/tst_qcansignaldescription.cpp +++ b/tests/auto/qcansignaldescription/tst_qcansignaldescription.cpp @@ -208,7 +208,7 @@ void tst_QCanSignalDescription::comparison() { QCanSignalDescription d1 = d; QCanSignalDescription::MultiplexSignalValues muxValues; - muxValues.insert("s0", QCanSignalDescription::MultiplexValues{ qMakePair(1, 1) }); + muxValues.insert("s0", QCanSignalDescription::MultiplexValues{ {1, 1} }); d1.setMultiplexSignals(muxValues); QCOMPARE_NE(d1, d); QVERIFY(!QCanSignalDescriptionPrivate::get(d1)->isShared()); |