mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-22 23:05:36 +08:00
refs #356 Minor refactoring to Compare policy, preparation for removing CValueObject.
This commit is contained in:
@@ -25,7 +25,7 @@ namespace BlackMisc
|
||||
using MetaType = Policy::MetaType::Default;
|
||||
using Equals = Policy::Equals::None;
|
||||
using LessThan = Policy::LessThan::None;
|
||||
using Compare = Policy::Compare::Own;
|
||||
using Compare = Policy::Compare::None;
|
||||
using Hash = Policy::Hash::Own;
|
||||
using DBus = Policy::DBus::Own;
|
||||
using Json = Policy::Json::Own;
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace BlackMisc
|
||||
template <> struct CValueObjectStdTuplePolicy<Aviation::CComSystem> : public CValueObjectStdTuplePolicy<>
|
||||
{
|
||||
using LessThan = Policy::LessThan::None;
|
||||
using Compare = Policy::Compare::Own;
|
||||
using Compare = Policy::Compare::None;
|
||||
using Hash = Policy::Hash::Own;
|
||||
using DBus = Policy::DBus::Own;
|
||||
using Json = Policy::Json::Own;
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace BlackMisc
|
||||
using MetaType = Policy::MetaType::Default;
|
||||
using Equals = Policy::Equals::None;
|
||||
using LessThan = Policy::LessThan::None;
|
||||
using Compare = Policy::Compare::Own;
|
||||
using Compare = Policy::Compare::None;
|
||||
using Hash = Policy::Hash::Own;
|
||||
using DBus = Policy::DBus::Own;
|
||||
using Json = Policy::Json::Own;
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace BlackMisc
|
||||
//! \private
|
||||
template <> struct CValueObjectStdTuplePolicy<Geo::CCoordinateEcef> : public CValueObjectStdTuplePolicy<>
|
||||
{
|
||||
using Compare = Policy::Compare::Own;
|
||||
using Compare = Policy::Compare::None;
|
||||
using Hash = Policy::Hash::Own;
|
||||
using DBus = Policy::DBus::Own;
|
||||
using Json = Policy::Json::Own;
|
||||
|
||||
@@ -142,16 +142,14 @@ namespace BlackMisc
|
||||
/*
|
||||
* Compare
|
||||
*/
|
||||
template <class ImplMatrix, int Rows, int Columns> int CMatrixBase<ImplMatrix, Rows, Columns>::compareImpl(const CValueObject &otherBase) const
|
||||
template <class ImplMatrix, int Rows, int Columns> int CMatrixBase<ImplMatrix, Rows, Columns>::compareImpl(const ImplMatrix &a, const ImplMatrix &b)
|
||||
{
|
||||
const auto &other = static_cast<const CMatrixBase &>(otherBase);
|
||||
|
||||
for (int r = 0; r < Rows; ++r)
|
||||
{
|
||||
for (int c = 0; c < Columns; ++c)
|
||||
{
|
||||
if (this->m_matrix(r, c) < other.m_matrix(r, c)) { return -1; }
|
||||
if (this->m_matrix(r, c) > other.m_matrix(r, c)) { return 1; }
|
||||
if (a.m_matrix(r, c) < b.m_matrix(r, c)) { return -1; }
|
||||
if (a.m_matrix(r, c) > b.m_matrix(r, c)) { return 1; }
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace BlackMisc
|
||||
{
|
||||
using Equals = Policy::Equals::None;
|
||||
using LessThan = Policy::LessThan::None;
|
||||
using Compare = Policy::Compare::Own;
|
||||
using Compare = Policy::Compare::None;
|
||||
using Hash = Policy::Hash::Own;
|
||||
using DBus = Policy::DBus::Own;
|
||||
using Json = Policy::Json::Own;
|
||||
@@ -36,6 +36,9 @@ namespace BlackMisc
|
||||
*/
|
||||
template<class ImplMatrix, int Rows, int Columns> class CMatrixBase : public CValueObjectStdTuple<CMatrixBase<ImplMatrix, Rows, Columns>>
|
||||
{
|
||||
//! \copydoc CValueObject::compare
|
||||
friend int compare(const ImplMatrix &a, const ImplMatrix &b) { return compareImpl(a, b); }
|
||||
|
||||
public:
|
||||
//! \brief Default constructor
|
||||
CMatrixBase() = default;
|
||||
@@ -214,9 +217,6 @@ namespace BlackMisc
|
||||
// no bug, Qt expects columns rows
|
||||
QGenericMatrix<Columns, Rows, double> m_matrix; //!< backing data
|
||||
|
||||
//! \copydoc CValueObject::compareImpl
|
||||
virtual int compareImpl(const CValueObject &other) const override;
|
||||
|
||||
//! \copydoc CValueObject::marshallToDbus
|
||||
virtual void marshallToDbus(QDBusArgument &argument) const override;
|
||||
|
||||
@@ -241,6 +241,9 @@ namespace BlackMisc
|
||||
|
||||
//! \brief Check range of row / column
|
||||
void checkRange(int row, int column) const;
|
||||
|
||||
//! Implementation of compare
|
||||
static int compareImpl(const ImplMatrix &, const ImplMatrix &);
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace BlackMisc
|
||||
//! \private
|
||||
template <> struct CValueObjectStdTuplePolicy<Math::CVector3D> : public CValueObjectStdTuplePolicy<>
|
||||
{
|
||||
using Compare = Policy::Compare::Own;
|
||||
using Compare = Policy::Compare::None;
|
||||
using Hash = Policy::Hash::Own;
|
||||
using DBus = Policy::DBus::Own;
|
||||
using Json = Policy::Json::Own;
|
||||
|
||||
@@ -350,15 +350,13 @@ namespace BlackMisc
|
||||
/*
|
||||
* Compare
|
||||
*/
|
||||
template <class MU, class PQ> int CPhysicalQuantity<MU, PQ>::compareImpl(const CValueObject &otherBase) const
|
||||
template <class MU, class PQ> int CPhysicalQuantity<MU, PQ>::compareImpl(const PQ &a, const PQ &b)
|
||||
{
|
||||
const auto &other = static_cast<const CPhysicalQuantity &>(otherBase);
|
||||
if (a.isNull() > b.isNull()) { return -1; }
|
||||
if (a.isNull() < b.isNull()) { return 1; }
|
||||
|
||||
if (this->isNull() > other.isNull()) { return -1; }
|
||||
if (this->isNull() < other.isNull()) { return 1; }
|
||||
|
||||
if (*this < other) { return -1; }
|
||||
else if (*this > other) { return 1; }
|
||||
if (a < b) { return -1; }
|
||||
else if (a > b) { return 1; }
|
||||
else { return 0; }
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace BlackMisc
|
||||
using MetaType = Policy::MetaType::DefaultAndQList;
|
||||
using Equals = Policy::Equals::None;
|
||||
using LessThan = Policy::LessThan::None;
|
||||
using Compare = Policy::Compare::Own;
|
||||
using Compare = Policy::Compare::None;
|
||||
using Hash = Policy::Hash::Own;
|
||||
using DBus = Policy::DBus::Own;
|
||||
using Json = Policy::Json::Own;
|
||||
@@ -47,6 +47,9 @@ namespace BlackMisc
|
||||
*/
|
||||
template <class MU, class PQ> class CPhysicalQuantity : public CValueObjectStdTuple<CPhysicalQuantity<MU, PQ>>
|
||||
{
|
||||
//! \copydoc CValueObject::compare
|
||||
friend int compare(const PQ &a, const PQ &b) { return compareImpl(a, b); }
|
||||
|
||||
public:
|
||||
//! Index
|
||||
enum ColumnIndex
|
||||
@@ -254,9 +257,6 @@ namespace BlackMisc
|
||||
//! \copydoc CValueObject::convertToQString
|
||||
virtual QString convertToQString(bool i18n = false) const override;
|
||||
|
||||
//! \copydoc CValueObject::compareImpl
|
||||
virtual int compareImpl(const CValueObject &other) const override;
|
||||
|
||||
private:
|
||||
double m_value; //!< numeric part
|
||||
MU m_unit; //!< unit part
|
||||
@@ -264,6 +264,9 @@ namespace BlackMisc
|
||||
//! Which subclass of CMeasurementUnit is used?
|
||||
typedef MU UnitClass;
|
||||
|
||||
//! Implementation of compare
|
||||
static int compareImpl(const PQ &, const PQ &);
|
||||
|
||||
//! Easy access to derived class (CRTP template parameter)
|
||||
PQ const *derived() const { return static_cast<PQ const *>(this); }
|
||||
|
||||
|
||||
@@ -197,7 +197,7 @@ namespace BlackMisc
|
||||
{
|
||||
//! Policy implementation of CValueObject::compareImpl
|
||||
template <class T, class...>
|
||||
static bool compareImpl(const T &, const T &) { qFatal("Not implemented"); return 0; }
|
||||
static bool compareImpl(const T &, const T &) { return 0; }
|
||||
};
|
||||
|
||||
//! CValueObjectStdTuple polymorphic comparison policy which inherits the policy of the base class
|
||||
@@ -215,14 +215,6 @@ namespace BlackMisc
|
||||
template <class T, class...>
|
||||
static bool compareImpl(const T &a, const T &b) { return compare(Private::EncapsulationBreaker::toMetaTuple(a), Private::EncapsulationBreaker::toMetaTuple(b)); }
|
||||
};
|
||||
|
||||
//! CValueObjectStdTuple policy for a class which implements its own custom poylymorphic comparison support
|
||||
struct Own
|
||||
{
|
||||
//! Policy implementation of CValueObject::compareImpl
|
||||
template <class T, class...>
|
||||
static bool compareImpl(const T &, const T &) { return 0; }
|
||||
};
|
||||
}
|
||||
|
||||
namespace Hash
|
||||
|
||||
@@ -35,24 +35,22 @@ namespace BlackMisc
|
||||
return m_v.toString();
|
||||
}
|
||||
|
||||
int CVariant::compareImpl(const CValueObject &otherBase) const
|
||||
int CVariant::compareImpl(const CVariant &a, const CVariant &b)
|
||||
{
|
||||
const auto &other = static_cast<const CVariant &>(otherBase);
|
||||
|
||||
if (userType() < other.userType()) { return -1; }
|
||||
if (userType() > other.userType()) { return 1; }
|
||||
auto *meta = getValueObjectMetaInfo();
|
||||
auto *otherMeta = other.getValueObjectMetaInfo();
|
||||
if (meta && otherMeta)
|
||||
if (a.userType() < b.userType()) { return -1; }
|
||||
if (a.userType() > b.userType()) { return 1; }
|
||||
auto *aMeta = a.getValueObjectMetaInfo();
|
||||
auto *bMeta = b.getValueObjectMetaInfo();
|
||||
if (aMeta && bMeta)
|
||||
{
|
||||
const void *casted = nullptr;
|
||||
if ((casted = meta->upCastTo(data(), otherMeta->getMetaTypeId())))
|
||||
if ((casted = aMeta->upCastTo(a.data(), bMeta->getMetaTypeId())))
|
||||
{
|
||||
return otherMeta->compare(casted, other.data());
|
||||
return bMeta->compareImpl(casted, b.data());
|
||||
}
|
||||
else if ((casted = otherMeta->upCastTo(other.data(), meta->getMetaTypeId())))
|
||||
else if ((casted = bMeta->upCastTo(b.data(), aMeta->getMetaTypeId())))
|
||||
{
|
||||
return meta->compare(data(), casted);
|
||||
return aMeta->compareImpl(a.data(), casted);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -60,8 +58,8 @@ namespace BlackMisc
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (m_v < other.m_v) { return -1; }
|
||||
if (m_v > other.m_v) { return 1; }
|
||||
if (a.m_v < b.m_v) { return -1; }
|
||||
if (a.m_v > b.m_v) { return 1; }
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace BlackMisc
|
||||
using MetaType = Policy::MetaType::QMetaTypeAndDBusOnly;
|
||||
using Equals = Policy::Equals::OwnEquals;
|
||||
using LessThan = Policy::LessThan::OwnLessThan;
|
||||
using Compare = Policy::Compare::Own;
|
||||
using Compare = Policy::Compare::None;
|
||||
using Hash = Policy::Hash::Own;
|
||||
using DBus = Policy::DBus::Own;
|
||||
using Json = Policy::Json::Own;
|
||||
@@ -194,8 +194,8 @@ namespace BlackMisc
|
||||
//! Less than operator.
|
||||
friend bool operator <(const CVariant &a, const CVariant &b) { return compare(a, b) < 0; }
|
||||
|
||||
//! \copydoc CValueObject::compareImpl
|
||||
virtual int compareImpl(const CValueObject &other) const override;
|
||||
//! \copydoc CValueObject::compare
|
||||
friend int compare(const CVariant &a, const CVariant &b) { return compareImpl(a, b); }
|
||||
|
||||
//! \copydoc CValueObject::setPropertyByIndex
|
||||
virtual void setPropertyByIndex(const CVariant &variant, const CPropertyIndex &index) override;
|
||||
@@ -215,6 +215,8 @@ namespace BlackMisc
|
||||
Private::IValueObjectMetaInfo *getValueObjectMetaInfo() const { return Private::getValueObjectMetaInfo(m_v); }
|
||||
void *data() { return m_v.data(); }
|
||||
const void *data() const { return m_v.data(); }
|
||||
|
||||
static int compareImpl(const CVariant &, const CVariant &);
|
||||
};
|
||||
|
||||
//! Compare stored value of CVariant with any CValueObject derived class.
|
||||
|
||||
Reference in New Issue
Block a user