From 6d9f9a286dba1feb5529ef023d722c69633602b0 Mon Sep 17 00:00:00 2001 From: Mat Sutcliffe Date: Wed, 27 Feb 2019 22:34:02 +0000 Subject: [PATCH] Ref T552 Using QDataStream marshalling mixins in value classes. --- src/blackmisc/aviation/altitude.h | 3 + src/blackmisc/aviation/heading.h | 2 + src/blackmisc/aviation/track.h | 2 + src/blackmisc/collection.h | 8 +++ src/blackmisc/dictionary.h | 8 +++ src/blackmisc/geo/latitude.h | 1 + src/blackmisc/geo/longitude.h | 1 + src/blackmisc/icon.h | 2 + src/blackmisc/logpattern.cpp | 22 ++++++ src/blackmisc/logpattern.h | 8 +++ src/blackmisc/pq/measurementunit.h | 14 ++++ src/blackmisc/pq/physicalquantity.cpp | 18 +++++ src/blackmisc/pq/physicalquantity.h | 8 +++ src/blackmisc/pq/units.h | 81 +++++++++++++++++++++++ src/blackmisc/propertyindex.h | 2 + src/blackmisc/propertyindexvariantmap.cpp | 22 ++++++ src/blackmisc/propertyindexvariantmap.h | 7 ++ src/blackmisc/sequence.h | 7 ++ src/blackmisc/statusmessage.h | 7 ++ src/blackmisc/valuecache.h | 3 + src/blackmisc/valueobject.h | 8 +++ src/blackmisc/variant.cpp | 10 +++ src/blackmisc/variant.h | 8 +++ 23 files changed, 252 insertions(+) diff --git a/src/blackmisc/aviation/altitude.h b/src/blackmisc/aviation/altitude.h index 49cce5719..91354d978 100644 --- a/src/blackmisc/aviation/altitude.h +++ b/src/blackmisc/aviation/altitude.h @@ -17,6 +17,7 @@ #include "blackmisc/statusmessagelist.h" #include "blackmisc/compare.h" #include "blackmisc/dbus.h" +#include "blackmisc/datastream.h" #include "blackmisc/dictionary.h" #include "blackmisc/icon.h" #include "blackmisc/metaclass.h" @@ -46,6 +47,7 @@ namespace BlackMisc public Mixin::HashByMetaClass, public Mixin::DBusByMetaClass, public Mixin::DBusByMetaClass, + public Mixin::DataStreamByMetaClass, public Mixin::JsonByMetaClass, public Mixin::String, public Mixin::Icon, @@ -59,6 +61,7 @@ namespace BlackMisc BLACKMISC_DECLARE_USING_MIXIN_STRING(CAltitude) BLACKMISC_DECLARE_USING_MIXIN_DBUS(CAltitude) BLACKMISC_DECLARE_USING_MIXIN_DBUS(CAltitude, LosslessTag) + BLACKMISC_DECLARE_USING_MIXIN_DATASTREAM(CAltitude) BLACKMISC_DECLARE_USING_MIXIN_JSON(CAltitude) BLACKMISC_DECLARE_USING_MIXIN_ICON(CAltitude) BLACKMISC_DECLARE_USING_MIXIN_INDEX(CAltitude) diff --git a/src/blackmisc/aviation/heading.h b/src/blackmisc/aviation/heading.h index 4bf56e6fd..b7c68ce3f 100644 --- a/src/blackmisc/aviation/heading.h +++ b/src/blackmisc/aviation/heading.h @@ -41,6 +41,7 @@ namespace BlackMisc public Mixin::CompareByMetaClass, public Mixin::HashByMetaClass, public Mixin::DBusByMetaClass, + public Mixin::DataStreamByMetaClass, public Mixin::JsonByMetaClass, public Mixin::String, public Mixin::Index @@ -52,6 +53,7 @@ namespace BlackMisc BLACKMISC_DECLARE_USING_MIXIN_METATYPE(CHeading) BLACKMISC_DECLARE_USING_MIXIN_STRING(CHeading) BLACKMISC_DECLARE_USING_MIXIN_DBUS(CHeading) + BLACKMISC_DECLARE_USING_MIXIN_DATASTREAM(CHeading) BLACKMISC_DECLARE_USING_MIXIN_JSON(CHeading) BLACKMISC_DECLARE_USING_MIXIN_INDEX(CHeading) diff --git a/src/blackmisc/aviation/track.h b/src/blackmisc/aviation/track.h index 10db292f7..aaca7f388 100644 --- a/src/blackmisc/aviation/track.h +++ b/src/blackmisc/aviation/track.h @@ -44,6 +44,7 @@ namespace BlackMisc public Mixin::CompareByMetaClass, public Mixin::HashByMetaClass, public Mixin::DBusByMetaClass, + public Mixin::DataStreamByMetaClass, public Mixin::JsonByMetaClass, public Mixin::String, public Mixin::Index @@ -55,6 +56,7 @@ namespace BlackMisc BLACKMISC_DECLARE_USING_MIXIN_METATYPE(CTrack) BLACKMISC_DECLARE_USING_MIXIN_STRING(CTrack) BLACKMISC_DECLARE_USING_MIXIN_DBUS(CTrack) + BLACKMISC_DECLARE_USING_MIXIN_DATASTREAM(CTrack) BLACKMISC_DECLARE_USING_MIXIN_JSON(CTrack) BLACKMISC_DECLARE_USING_MIXIN_INDEX(CTrack) diff --git a/src/blackmisc/collection.h b/src/blackmisc/collection.h index 10d4949ab..6144ed051 100644 --- a/src/blackmisc/collection.h +++ b/src/blackmisc/collection.h @@ -12,6 +12,7 @@ #define BLACKMISC_COLLECTION_H #include "containerbase.h" +#include "datastream.h" #include "icon.h" #include #include @@ -54,6 +55,7 @@ namespace BlackMisc template class CCollection : public CContainerBase>, + public Mixin::DataStreamOperators>, public Mixin::Icon> { public: @@ -270,6 +272,12 @@ namespace BlackMisc //! Test for inequality. friend bool operator !=(const CCollection &a, const CCollection &b) { return a.m_impl != b.m_impl; } + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream + void marshalToDataStream(QDataStream &stream) const { stream << m_impl; } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) { stream >> m_impl; } + private: QOrderedSet m_impl; }; diff --git a/src/blackmisc/dictionary.h b/src/blackmisc/dictionary.h index d78be66f9..57c747469 100644 --- a/src/blackmisc/dictionary.h +++ b/src/blackmisc/dictionary.h @@ -14,6 +14,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/containerbase.h" #include "blackmisc/dbus.h" +#include "blackmisc/datastream.h" #include "blackmisc/inheritancetraits.h" #include "blackmisc/iterator.h" #include "blackmisc/json.h" @@ -96,6 +97,7 @@ namespace BlackMisc template class Impl = TDefaultAssociativeType> class CDictionary : public Mixin::DBusOperators>, + public Mixin::DataStreamOperators>, public Mixin::JsonOperators>, public Mixin::String> { @@ -460,6 +462,12 @@ namespace BlackMisc argument >> m_impl; } + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream + void marshalToDataStream(QDataStream &stream) const { stream << m_impl; } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) { stream >> m_impl; } + private: Impl m_impl; }; diff --git a/src/blackmisc/geo/latitude.h b/src/blackmisc/geo/latitude.h index ccd1298c3..396b2fa34 100644 --- a/src/blackmisc/geo/latitude.h +++ b/src/blackmisc/geo/latitude.h @@ -24,6 +24,7 @@ namespace BlackMisc public Mixin::MetaType, public Mixin::String, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { public: diff --git a/src/blackmisc/geo/longitude.h b/src/blackmisc/geo/longitude.h index 6686c5be7..f067b0be1 100644 --- a/src/blackmisc/geo/longitude.h +++ b/src/blackmisc/geo/longitude.h @@ -24,6 +24,7 @@ namespace BlackMisc public Mixin::MetaType, public Mixin::String, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { public: diff --git a/src/blackmisc/icon.h b/src/blackmisc/icon.h index d0ed30b41..2ae7ea03c 100644 --- a/src/blackmisc/icon.h +++ b/src/blackmisc/icon.h @@ -14,6 +14,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/compare.h" #include "blackmisc/dbus.h" +#include "blackmisc/datastream.h" #include "blackmisc/dictionary.h" #include "blackmisc/icons.h" #include "blackmisc/json.h" @@ -67,6 +68,7 @@ namespace BlackMisc public Mixin::MetaType, public Mixin::HashByMetaClass, public Mixin::DBusByMetaClass, + public Mixin::DataStreamByMetaClass, public Mixin::JsonByMetaClass, public Mixin::EqualsByMetaClass, public Mixin::LessThanByMetaClass, diff --git a/src/blackmisc/logpattern.cpp b/src/blackmisc/logpattern.cpp index 9f465f213..52925c918 100644 --- a/src/blackmisc/logpattern.cpp +++ b/src/blackmisc/logpattern.cpp @@ -359,4 +359,26 @@ namespace BlackMisc if (severities & (1 << s)) { m_severities.insert(static_cast(s)); } } } + + void CLogPattern::marshalToDataStream(QDataStream &stream) const + { + quint8 severities = 0; + for (auto s : m_severities) { severities |= (1 << static_cast(s)); } + + stream << severities << m_strategy << m_strings.toList(); + } + + void CLogPattern::unmarshalFromDataStream(QDataStream &stream) + { + quint8 severities; + QStringList strings; + stream >> severities >> m_strategy >> strings; + m_strings = strings.toSet(); + + m_severities.clear(); + for (int s : { 0, 1, 2, 3 }) + { + if (severities & (1 << s)) { m_severities.insert(static_cast(s)); } + } + } } diff --git a/src/blackmisc/logpattern.h b/src/blackmisc/logpattern.h index e22f74e7d..79aa79160 100644 --- a/src/blackmisc/logpattern.h +++ b/src/blackmisc/logpattern.h @@ -14,6 +14,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/compare.h" #include "blackmisc/dbus.h" +#include "blackmisc/datastream.h" #include "blackmisc/dictionary.h" #include "blackmisc/icon.h" #include "blackmisc/metaclass.h" @@ -44,6 +45,7 @@ namespace BlackMisc public Mixin::HashByMetaClass, public Mixin::EqualsByMetaClass, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index, public Mixin::String, public Mixin::Icon @@ -107,6 +109,12 @@ namespace BlackMisc //! \copydoc BlackMisc::Mixin::DBusByMetaClass::unmarshallFromDbus() void unmarshallFromDbus(const QDBusArgument &argument); + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream + void marshalToDataStream(QDataStream &stream) const; + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream); + private: bool checkInvariants() const; diff --git a/src/blackmisc/pq/measurementunit.h b/src/blackmisc/pq/measurementunit.h index a3a5869ae..1530654de 100644 --- a/src/blackmisc/pq/measurementunit.h +++ b/src/blackmisc/pq/measurementunit.h @@ -271,6 +271,20 @@ namespace BlackMisc (*this) = CMeasurementUnit::None(); } + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream + void marshalToDataStream(QDataStream &stream) const + { + stream << QString(m_data->m_symbol); + } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &) + { + // the concrete implementations will override this default + // this is required so that None can be marshalled + *this = CMeasurementUnit::None(); + } + //! Equal operator == friend bool operator == (const CMeasurementUnit &a, const CMeasurementUnit &b) { diff --git a/src/blackmisc/pq/physicalquantity.cpp b/src/blackmisc/pq/physicalquantity.cpp index 65009227a..35f39c025 100644 --- a/src/blackmisc/pq/physicalquantity.cpp +++ b/src/blackmisc/pq/physicalquantity.cpp @@ -188,6 +188,24 @@ namespace BlackMisc argument >> m_unit; } + template + void CPhysicalQuantity::marshalToDataStream(QDataStream &stream) const + { + constexpr double NaN = std::numeric_limits::quiet_NaN(); + stream << (this->isNull() ? NaN : this->value(UnitClass::defaultUnit())); + } + + template + void CPhysicalQuantity::unmarshalFromDataStream(QDataStream &stream) + { + stream >> m_value; + m_unit = UnitClass::defaultUnit(); + if (std::isnan(m_value)) + { + this->setNull(); + } + } + template CPhysicalQuantity &CPhysicalQuantity::operator *=(double factor) { diff --git a/src/blackmisc/pq/physicalquantity.h b/src/blackmisc/pq/physicalquantity.h index c3138cf06..8e017b47d 100644 --- a/src/blackmisc/pq/physicalquantity.h +++ b/src/blackmisc/pq/physicalquantity.h @@ -13,6 +13,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/dbus.h" +#include "blackmisc/datastream.h" #include "blackmisc/icon.h" #include "blackmisc/json.h" #include "blackmisc/pq/pqstring.h" @@ -46,6 +47,7 @@ namespace BlackMisc */ template class CPhysicalQuantity : public Mixin::DBusOperators>, + public Mixin::DataStreamOperators>, public Mixin::JsonOperators>, public Mixin::Index, public Mixin::MetaType, @@ -219,6 +221,12 @@ namespace BlackMisc //! Unmarshal from DBus, with preserved measurement unit void unmarshallFromDbus(const QDBusArgument &argument, LosslessTag); + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream + void marshalToDataStream(QDataStream &stream) const; + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream); + //! \copydoc BlackMisc::Mixin::HashByMetaClass::qHash uint getValueHash() const; diff --git a/src/blackmisc/pq/units.h b/src/blackmisc/pq/units.h index d522afccf..0f2a3e6e1 100644 --- a/src/blackmisc/pq/units.h +++ b/src/blackmisc/pq/units.h @@ -44,6 +44,7 @@ namespace BlackMisc public CMeasurementUnit, public Mixin::MetaType, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { private: @@ -152,6 +153,14 @@ namespace BlackMisc argument >> unitName; (*this) = CMeasurementUnit::unitFromSymbol(unitName); } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) + { + QString unitName; + stream >> unitName; + *this = CMeasurementUnit::unitFromSymbol(unitName); + } }; //! Specialized class for angles (degrees, radian). @@ -159,6 +168,7 @@ namespace BlackMisc public CMeasurementUnit, public Mixin::MetaType, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { private: @@ -245,6 +255,14 @@ namespace BlackMisc argument >> unitName; (*this) = CMeasurementUnit::unitFromSymbol(unitName); } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) + { + QString unitName; + stream >> unitName; + *this = CMeasurementUnit::unitFromSymbol(unitName); + } }; //! Specialized class for frequency (hertz, mega hertz, kilo hertz). @@ -252,6 +270,7 @@ namespace BlackMisc public CMeasurementUnit, public Mixin::MetaType, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { private: @@ -332,6 +351,14 @@ namespace BlackMisc argument >> unitName; (*this) = CMeasurementUnit::unitFromSymbol(unitName); } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) + { + QString unitName; + stream >> unitName; + *this = CMeasurementUnit::unitFromSymbol(unitName); + } }; //! Specialized class for mass units (kg, lbs). @@ -339,6 +366,7 @@ namespace BlackMisc public CMeasurementUnit, public Mixin::MetaType, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { private: @@ -428,6 +456,14 @@ namespace BlackMisc argument >> unitName; (*this) = CMeasurementUnit::unitFromSymbol(unitName); } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) + { + QString unitName; + stream >> unitName; + *this = CMeasurementUnit::unitFromSymbol(unitName); + } }; //! Specialized class for pressure (psi, hPa, bar). @@ -435,6 +471,7 @@ namespace BlackMisc public CMeasurementUnit, public Mixin::MetaType, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { private: @@ -541,6 +578,14 @@ namespace BlackMisc argument >> unitName; (*this) = CMeasurementUnit::unitFromSymbol(unitName); } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) + { + QString unitName; + stream >> unitName; + *this = CMeasurementUnit::unitFromSymbol(unitName); + } }; //! Specialized class for temperatur units (kelvin, centidegree). @@ -548,6 +593,7 @@ namespace BlackMisc public CMeasurementUnit, public Mixin::MetaType, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { private: @@ -629,6 +675,14 @@ namespace BlackMisc argument >> unitName; (*this) = CMeasurementUnit::unitFromSymbol(unitName); } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) + { + QString unitName; + stream >> unitName; + *this = CMeasurementUnit::unitFromSymbol(unitName); + } }; //! Specialized class for speed units (m/s, ft/s, NM/h). @@ -636,6 +690,7 @@ namespace BlackMisc public CMeasurementUnit, public Mixin::MetaType, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { private: @@ -735,6 +790,14 @@ namespace BlackMisc argument >> unitName; (*this) = CMeasurementUnit::unitFromSymbol(unitName); } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) + { + QString unitName; + stream >> unitName; + *this = CMeasurementUnit::unitFromSymbol(unitName); + } }; //! Specialized class for time units (ms, hour, min). @@ -742,6 +805,7 @@ namespace BlackMisc public CMeasurementUnit, public Mixin::MetaType, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { private: @@ -863,6 +927,14 @@ namespace BlackMisc argument >> unitName; (*this) = CMeasurementUnit::unitFromSymbol(unitName); } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) + { + QString unitName; + stream >> unitName; + *this = CMeasurementUnit::unitFromSymbol(unitName); + } }; //! Specialized class for acceleration units (m/s2, ft/s2). @@ -870,6 +942,7 @@ namespace BlackMisc public CMeasurementUnit, public Mixin::MetaType, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::Index { private: @@ -934,6 +1007,14 @@ namespace BlackMisc argument >> unitName; (*this) = CMeasurementUnit::unitFromSymbol(unitName); } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) + { + QString unitName; + stream >> unitName; + *this = CMeasurementUnit::unitFromSymbol(unitName); + } }; } // namespace diff --git a/src/blackmisc/propertyindex.h b/src/blackmisc/propertyindex.h index 7481d97f4..1d17623d2 100644 --- a/src/blackmisc/propertyindex.h +++ b/src/blackmisc/propertyindex.h @@ -14,6 +14,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/compare.h" #include "blackmisc/dbus.h" +#include "blackmisc/datastream.h" #include "blackmisc/dictionary.h" #include "blackmisc/json.h" #include "blackmisc/metaclass.h" @@ -62,6 +63,7 @@ namespace BlackMisc public Mixin::MetaType, public Mixin::HashByMetaClass, public Mixin::DBusByMetaClass, + public Mixin::DataStreamByMetaClass, public Mixin::JsonOperators, public Mixin::EqualsByMetaClass, public Mixin::LessThanByMetaClass, diff --git a/src/blackmisc/propertyindexvariantmap.cpp b/src/blackmisc/propertyindexvariantmap.cpp index 62eb3ca78..c417c4697 100644 --- a/src/blackmisc/propertyindexvariantmap.cpp +++ b/src/blackmisc/propertyindexvariantmap.cpp @@ -92,6 +92,28 @@ namespace BlackMisc m_values.swap(newMap); } + void CPropertyIndexVariantMap::marshalToDataStream(QDataStream &stream) const + { + stream << m_values.keys(); + stream << m_values.values(); + } + + void CPropertyIndexVariantMap::unmarshalFromDataStream(QDataStream &stream) + { + QList indexes; + QList values; + stream >> indexes; + stream >> values; + Q_ASSERT(indexes.size() == values.size()); + QMap newMap; + for (int i = 0; i < indexes.size(); i++) + { + newMap.insert(indexes[i], values[i]); + } + // replace values in one step + m_values.swap(newMap); + } + void CPropertyIndexVariantMap::addValue(const CPropertyIndex &index, const CVariant &value) { m_values.insert(index, value); diff --git a/src/blackmisc/propertyindexvariantmap.h b/src/blackmisc/propertyindexvariantmap.h index e8f90a9c6..f67024c2a 100644 --- a/src/blackmisc/propertyindexvariantmap.h +++ b/src/blackmisc/propertyindexvariantmap.h @@ -127,6 +127,7 @@ namespace BlackMisc class BLACKMISC_EXPORT CPropertyIndexVariantMap : public Mixin::MetaType, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::String { public: @@ -216,6 +217,12 @@ namespace BlackMisc //! \copydoc BlackMisc::Mixin::DBusByMetaClass::unmarshallFromDbus void unmarshallFromDbus(const QDBusArgument &argument); + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream + void marshalToDataStream(QDataStream &stream) const; + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream); }; namespace Mixin diff --git a/src/blackmisc/sequence.h b/src/blackmisc/sequence.h index 11ecdc8b7..35c47b94a 100644 --- a/src/blackmisc/sequence.h +++ b/src/blackmisc/sequence.h @@ -30,6 +30,7 @@ namespace BlackMisc template class CSequence : public CContainerBase>, + public Mixin::DataStreamOperators>, public Mixin::Icon> { public: @@ -560,6 +561,12 @@ namespace BlackMisc //! Greater or equal operator. friend bool operator >=(const CSequence &a, const CSequence &b) { return a.m_impl >= b.m_impl; } + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream + void marshalToDataStream(QDataStream &stream) const { stream << m_impl; } + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream) { stream >> m_impl; } + private: QVector m_impl; }; diff --git a/src/blackmisc/statusmessage.h b/src/blackmisc/statusmessage.h index 18d7b2860..0ff91a589 100644 --- a/src/blackmisc/statusmessage.h +++ b/src/blackmisc/statusmessage.h @@ -53,6 +53,7 @@ namespace BlackMisc public Mixin::EqualsByCompare, public Mixin::LessThanByCompare, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::JsonOperators, public Mixin::String { @@ -110,6 +111,12 @@ namespace BlackMisc void unmarshallFromDbus(const QDBusArgument &arg) { arg >> m_string; m_view = m_string; } //! @} + //! QDataStream marshalling. + //! @{ + void marshalToDataStream(QDataStream &stream) const { stream << toQString(); } + void unmarshalFromDataStream(QDataStream &stream) { stream >> m_string; m_view = m_string; } + //! @} + //! JSON conversion. //! @{ QJsonObject toJson() const { QJsonObject json; json.insert(QStringLiteral("value"), toQString()); return json; } diff --git a/src/blackmisc/valuecache.h b/src/blackmisc/valuecache.h index 78f7699f2..118bc5c6c 100644 --- a/src/blackmisc/valuecache.h +++ b/src/blackmisc/valuecache.h @@ -14,6 +14,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/compare.h" #include "blackmisc/dbus.h" +#include "blackmisc/datastream.h" #include "blackmisc/dictionary.h" #include "blackmisc/identifier.h" #include "blackmisc/metaclass.h" @@ -65,10 +66,12 @@ namespace BlackMisc public CDictionary, QMap>, public Mixin::MetaType, public Mixin::DBusByMetaClass, + public Mixin::DataStreamByMetaClass, public Mixin::EqualsByMetaClass { public: BLACKMISC_DECLARE_USING_MIXIN_DBUS(CValueCachePacket) + BLACKMISC_DECLARE_USING_MIXIN_DATASTREAM(CValueCachePacket) //! \copydoc BlackMisc::CValueObject::base_type using base_type = CDictionary; diff --git a/src/blackmisc/valueobject.h b/src/blackmisc/valueobject.h index 53a66bda9..594953610 100644 --- a/src/blackmisc/valueobject.h +++ b/src/blackmisc/valueobject.h @@ -13,6 +13,7 @@ #include "blackmiscexport.h" #include "dbus.h" +#include "datastream.h" #include "metaclass.h" #include "json.h" #include "compare.h" @@ -71,6 +72,7 @@ namespace BlackMisc public Mixin::MetaType, public Mixin::HashByMetaClass, public Mixin::DBusByMetaClass, + public Mixin::DataStreamByMetaClass, public Mixin::JsonByMetaClass, public Mixin::EqualsByMetaClass, public Mixin::LessThanByMetaClass, @@ -160,6 +162,12 @@ namespace BlackMisc //! \copydoc BlackMisc::Mixin::DBusByMetaClass::unmarshallFromDbus using Mixin::DBusByMetaClass::unmarshallFromDbus; + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream + using Mixin::DataStreamByMetaClass::marshalToDataStream; + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + using Mixin::DataStreamByMetaClass::unmarshalFromDataStream; }; } // namespace diff --git a/src/blackmisc/variant.cpp b/src/blackmisc/variant.cpp index 1a94878c2..0d0686d74 100644 --- a/src/blackmisc/variant.cpp +++ b/src/blackmisc/variant.cpp @@ -383,6 +383,16 @@ namespace BlackMisc } } + void CVariant::marshalToDataStream(QDataStream &stream) const + { + stream << m_v; + } + + void CVariant::unmarshalFromDataStream(QDataStream &stream) + { + stream >> m_v; + } + void CVariant::setPropertyByIndex(const CPropertyIndex &index, const CVariant &variant) { auto *meta = getValueObjectMetaInfo(); diff --git a/src/blackmisc/variant.h b/src/blackmisc/variant.h index c22eb7670..d4b3e9a3e 100644 --- a/src/blackmisc/variant.h +++ b/src/blackmisc/variant.h @@ -15,6 +15,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/compare.h" #include "blackmisc/dbus.h" +#include "blackmisc/datastream.h" #include "blackmisc/inheritancetraits.h" #include "blackmisc/json.h" #include "blackmisc/stringutils.h" @@ -122,6 +123,7 @@ namespace BlackMisc public Mixin::EqualsByCompare, public Mixin::LessThanByCompare, public Mixin::DBusOperators, + public Mixin::DataStreamOperators, public Mixin::JsonOperators, public Mixin::String { @@ -310,6 +312,12 @@ namespace BlackMisc //! \copydoc BlackMisc::Mixin::DBusByMetaClass::unmarshallFromDbus void unmarshallFromDbus(const QDBusArgument &argument); + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream + void marshalToDataStream(QDataStream &stream) const; + + //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream + void unmarshalFromDataStream(QDataStream &stream); + //! \copydoc CValueObject::compare friend int compare(const CVariant &a, const CVariant &b) { return compareImpl(a, b); }