Ref T552 Using QDataStream marshalling mixins in value classes.

This commit is contained in:
Mat Sutcliffe
2019-02-27 22:34:02 +00:00
parent fabf6e59ab
commit 6d9f9a286d
23 changed files with 252 additions and 0 deletions

View File

@@ -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)
{

View File

@@ -188,6 +188,24 @@ namespace BlackMisc
argument >> m_unit;
}
template <class MU, class PQ>
void CPhysicalQuantity<MU, PQ>::marshalToDataStream(QDataStream &stream) const
{
constexpr double NaN = std::numeric_limits<double>::quiet_NaN();
stream << (this->isNull() ? NaN : this->value(UnitClass::defaultUnit()));
}
template <class MU, class PQ>
void CPhysicalQuantity<MU, PQ>::unmarshalFromDataStream(QDataStream &stream)
{
stream >> m_value;
m_unit = UnitClass::defaultUnit();
if (std::isnan(m_value))
{
this->setNull();
}
}
template <class MU, class PQ>
CPhysicalQuantity<MU, PQ> &CPhysicalQuantity<MU, PQ>::operator *=(double factor)
{

View File

@@ -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 MU, class PQ> class CPhysicalQuantity :
public Mixin::DBusOperators<CPhysicalQuantity<MU, PQ>>,
public Mixin::DataStreamOperators<CPhysicalQuantity<MU, PQ>>,
public Mixin::JsonOperators<CPhysicalQuantity<MU, PQ>>,
public Mixin::Index<PQ>,
public Mixin::MetaType<PQ>,
@@ -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;

View File

@@ -44,6 +44,7 @@ namespace BlackMisc
public CMeasurementUnit,
public Mixin::MetaType<CLengthUnit>,
public Mixin::DBusOperators<CLengthUnit>,
public Mixin::DataStreamOperators<CLengthUnit>,
public Mixin::Index<CLengthUnit>
{
private:
@@ -152,6 +153,14 @@ namespace BlackMisc
argument >> unitName;
(*this) = CMeasurementUnit::unitFromSymbol<CLengthUnit>(unitName);
}
//! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream
void unmarshalFromDataStream(QDataStream &stream)
{
QString unitName;
stream >> unitName;
*this = CMeasurementUnit::unitFromSymbol<CLengthUnit>(unitName);
}
};
//! Specialized class for angles (degrees, radian).
@@ -159,6 +168,7 @@ namespace BlackMisc
public CMeasurementUnit,
public Mixin::MetaType<CAngleUnit>,
public Mixin::DBusOperators<CAngleUnit>,
public Mixin::DataStreamOperators<CAngleUnit>,
public Mixin::Index<CAngleUnit>
{
private:
@@ -245,6 +255,14 @@ namespace BlackMisc
argument >> unitName;
(*this) = CMeasurementUnit::unitFromSymbol<CAngleUnit>(unitName);
}
//! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream
void unmarshalFromDataStream(QDataStream &stream)
{
QString unitName;
stream >> unitName;
*this = CMeasurementUnit::unitFromSymbol<CAngleUnit>(unitName);
}
};
//! Specialized class for frequency (hertz, mega hertz, kilo hertz).
@@ -252,6 +270,7 @@ namespace BlackMisc
public CMeasurementUnit,
public Mixin::MetaType<CFrequencyUnit>,
public Mixin::DBusOperators<CFrequencyUnit>,
public Mixin::DataStreamOperators<CFrequencyUnit>,
public Mixin::Index<CFrequencyUnit>
{
private:
@@ -332,6 +351,14 @@ namespace BlackMisc
argument >> unitName;
(*this) = CMeasurementUnit::unitFromSymbol<CFrequencyUnit>(unitName);
}
//! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream
void unmarshalFromDataStream(QDataStream &stream)
{
QString unitName;
stream >> unitName;
*this = CMeasurementUnit::unitFromSymbol<CFrequencyUnit>(unitName);
}
};
//! Specialized class for mass units (kg, lbs).
@@ -339,6 +366,7 @@ namespace BlackMisc
public CMeasurementUnit,
public Mixin::MetaType<CMassUnit>,
public Mixin::DBusOperators<CMassUnit>,
public Mixin::DataStreamOperators<CMassUnit>,
public Mixin::Index<CMassUnit>
{
private:
@@ -428,6 +456,14 @@ namespace BlackMisc
argument >> unitName;
(*this) = CMeasurementUnit::unitFromSymbol<CMassUnit>(unitName);
}
//! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream
void unmarshalFromDataStream(QDataStream &stream)
{
QString unitName;
stream >> unitName;
*this = CMeasurementUnit::unitFromSymbol<CMassUnit>(unitName);
}
};
//! Specialized class for pressure (psi, hPa, bar).
@@ -435,6 +471,7 @@ namespace BlackMisc
public CMeasurementUnit,
public Mixin::MetaType<CPressureUnit>,
public Mixin::DBusOperators<CPressureUnit>,
public Mixin::DataStreamOperators<CPressureUnit>,
public Mixin::Index<CPressureUnit>
{
private:
@@ -541,6 +578,14 @@ namespace BlackMisc
argument >> unitName;
(*this) = CMeasurementUnit::unitFromSymbol<CPressureUnit>(unitName);
}
//! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream
void unmarshalFromDataStream(QDataStream &stream)
{
QString unitName;
stream >> unitName;
*this = CMeasurementUnit::unitFromSymbol<CPressureUnit>(unitName);
}
};
//! Specialized class for temperatur units (kelvin, centidegree).
@@ -548,6 +593,7 @@ namespace BlackMisc
public CMeasurementUnit,
public Mixin::MetaType<CTemperatureUnit>,
public Mixin::DBusOperators<CTemperatureUnit>,
public Mixin::DataStreamOperators<CTemperatureUnit>,
public Mixin::Index<CTemperatureUnit>
{
private:
@@ -629,6 +675,14 @@ namespace BlackMisc
argument >> unitName;
(*this) = CMeasurementUnit::unitFromSymbol<CTemperatureUnit>(unitName);
}
//! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream
void unmarshalFromDataStream(QDataStream &stream)
{
QString unitName;
stream >> unitName;
*this = CMeasurementUnit::unitFromSymbol<CTemperatureUnit>(unitName);
}
};
//! Specialized class for speed units (m/s, ft/s, NM/h).
@@ -636,6 +690,7 @@ namespace BlackMisc
public CMeasurementUnit,
public Mixin::MetaType<CSpeedUnit>,
public Mixin::DBusOperators<CSpeedUnit>,
public Mixin::DataStreamOperators<CSpeedUnit>,
public Mixin::Index<CSpeedUnit>
{
private:
@@ -735,6 +790,14 @@ namespace BlackMisc
argument >> unitName;
(*this) = CMeasurementUnit::unitFromSymbol<CSpeedUnit>(unitName);
}
//! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream
void unmarshalFromDataStream(QDataStream &stream)
{
QString unitName;
stream >> unitName;
*this = CMeasurementUnit::unitFromSymbol<CSpeedUnit>(unitName);
}
};
//! Specialized class for time units (ms, hour, min).
@@ -742,6 +805,7 @@ namespace BlackMisc
public CMeasurementUnit,
public Mixin::MetaType<CTimeUnit>,
public Mixin::DBusOperators<CTimeUnit>,
public Mixin::DataStreamOperators<CTimeUnit>,
public Mixin::Index<CTimeUnit>
{
private:
@@ -863,6 +927,14 @@ namespace BlackMisc
argument >> unitName;
(*this) = CMeasurementUnit::unitFromSymbol<CTimeUnit>(unitName);
}
//! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream
void unmarshalFromDataStream(QDataStream &stream)
{
QString unitName;
stream >> unitName;
*this = CMeasurementUnit::unitFromSymbol<CTimeUnit>(unitName);
}
};
//! Specialized class for acceleration units (m/s2, ft/s2).
@@ -870,6 +942,7 @@ namespace BlackMisc
public CMeasurementUnit,
public Mixin::MetaType<CAccelerationUnit>,
public Mixin::DBusOperators<CAccelerationUnit>,
public Mixin::DataStreamOperators<CAccelerationUnit>,
public Mixin::Index<CAccelerationUnit>
{
private:
@@ -934,6 +1007,14 @@ namespace BlackMisc
argument >> unitName;
(*this) = CMeasurementUnit::unitFromSymbol<CAccelerationUnit>(unitName);
}
//! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream
void unmarshalFromDataStream(QDataStream &stream)
{
QString unitName;
stream >> unitName;
*this = CMeasurementUnit::unitFromSymbol<CAccelerationUnit>(unitName);
}
};
} // namespace