mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-28 11:45:40 +08:00
Ref T241, Ref T243, ITimestampWithOffsetObjectList
* there was already ITimestampWithOffsetBased for objects * this creates the container version * functions to add objects (parts/situations) and guarantee the sort order * moved push_frontMaxElements to CSequence (not specific for timestamp lists) * added in-place reverse
This commit is contained in:
@@ -25,6 +25,5 @@ namespace BlackMisc
|
|||||||
CAircraftPartsList::CAircraftPartsList(std::initializer_list<CAircraftParts> il) :
|
CAircraftPartsList::CAircraftPartsList(std::initializer_list<CAircraftParts> il) :
|
||||||
CSequence<CAircraftParts>(il)
|
CSequence<CAircraftParts>(il)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace BlackMisc
|
|||||||
//! Value object encapsulating a list of aircraft parts.
|
//! Value object encapsulating a list of aircraft parts.
|
||||||
class BLACKMISC_EXPORT CAircraftPartsList :
|
class BLACKMISC_EXPORT CAircraftPartsList :
|
||||||
public CSequence<CAircraftParts>,
|
public CSequence<CAircraftParts>,
|
||||||
public ITimestampObjectList<CAircraftParts, CAircraftPartsList>,
|
public ITimestampWithOffsetObjectList<CAircraftParts, CAircraftPartsList>,
|
||||||
public BlackMisc::Mixin::MetaType<CAircraftPartsList>
|
public BlackMisc::Mixin::MetaType<CAircraftPartsList>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include "blackmisc/aviation/aircraftsituationlist.h"
|
#include "blackmisc/aviation/aircraftsituationlist.h"
|
||||||
#include "blackmisc/aviation/aircraftsituation.h"
|
#include "blackmisc/aviation/aircraftsituation.h"
|
||||||
#include "blackmisc/geo/elevationplane.h"
|
#include "blackmisc/geo/elevationplane.h"
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
using namespace BlackMisc::PhysicalQuantities;
|
using namespace BlackMisc::PhysicalQuantities;
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ namespace BlackMisc
|
|||||||
//! Value object encapsulating a list of aircraft situations
|
//! Value object encapsulating a list of aircraft situations
|
||||||
class BLACKMISC_EXPORT CAircraftSituationList :
|
class BLACKMISC_EXPORT CAircraftSituationList :
|
||||||
public CSequence<CAircraftSituation>,
|
public CSequence<CAircraftSituation>,
|
||||||
public ITimestampObjectList<CAircraftSituation, CAircraftSituationList>,
|
public ITimestampWithOffsetObjectList<CAircraftSituation, CAircraftSituationList>,
|
||||||
public ICallsignObjectList<CAircraftSituation, CAircraftSituationList>,
|
public ICallsignObjectList<CAircraftSituation, CAircraftSituationList>,
|
||||||
public Mixin::MetaType<CAircraftSituationList>
|
public Mixin::MetaType<CAircraftSituationList>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -178,6 +178,14 @@ namespace BlackMisc
|
|||||||
//! Insert as first element.
|
//! Insert as first element.
|
||||||
void push_front(const T &value) { insert(begin(), value); }
|
void push_front(const T &value) { insert(begin(), value); }
|
||||||
|
|
||||||
|
//! Insert as first element by keep maxElements
|
||||||
|
void push_frontMaxElements(const T &value, int maxElements)
|
||||||
|
{
|
||||||
|
Q_ASSERT(maxElements > 1);
|
||||||
|
if (this->size() >= (maxElements - 1)) { this->truncate(maxElements - 1); }
|
||||||
|
this->push_front(value);
|
||||||
|
}
|
||||||
|
|
||||||
//! Move-appends an element at the end of the sequence.
|
//! Move-appends an element at the end of the sequence.
|
||||||
void push_back(T &&value) { m_impl.push_back(std::move(value)); }
|
void push_back(T &&value) { m_impl.push_back(std::move(value)); }
|
||||||
|
|
||||||
@@ -376,6 +384,12 @@ namespace BlackMisc
|
|||||||
else { push_back(replacement); }
|
else { push_back(replacement); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! In-place reverse
|
||||||
|
void reverse()
|
||||||
|
{
|
||||||
|
std::reverse(begin(), end());
|
||||||
|
}
|
||||||
|
|
||||||
//! In-place sort by a given comparator predicate.
|
//! In-place sort by a given comparator predicate.
|
||||||
template <class Predicate> void sort(Predicate p)
|
template <class Predicate> void sort(Predicate p)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -290,6 +290,11 @@ namespace BlackMisc
|
|||||||
return (i >= static_cast<int>(IndexOffsetMs)) && (i <= static_cast<int>(IndexOffsetWithUnit));
|
return (i >= static_cast<int>(IndexOffsetMs)) && (i <= static_cast<int>(IndexOffsetWithUnit));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ITimestampWithOffsetBased::hasOffsetTime() const
|
||||||
|
{
|
||||||
|
return m_timeOffsetMs != 0;
|
||||||
|
}
|
||||||
|
|
||||||
QString ITimestampWithOffsetBased::getTimeOffsetWithUnit() const
|
QString ITimestampWithOffsetBased::getTimeOffsetWithUnit() const
|
||||||
{
|
{
|
||||||
static const QString os("%1ms");
|
static const QString os("%1ms");
|
||||||
|
|||||||
@@ -161,6 +161,9 @@ namespace BlackMisc
|
|||||||
//! Milliseconds to add to timestamp for interpolation
|
//! Milliseconds to add to timestamp for interpolation
|
||||||
qint64 getTimeOffsetMs() const { return m_timeOffsetMs; }
|
qint64 getTimeOffsetMs() const { return m_timeOffsetMs; }
|
||||||
|
|
||||||
|
//! Having a valid offset time
|
||||||
|
bool hasOffsetTime() const;
|
||||||
|
|
||||||
//! Offset with unit
|
//! Offset with unit
|
||||||
QString getTimeOffsetWithUnit() const;
|
QString getTimeOffsetWithUnit() const;
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <limits>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
@@ -216,7 +217,7 @@ namespace BlackMisc
|
|||||||
void ITimestampObjectList<OBJ, CONTAINER>::sortLatestFirst()
|
void ITimestampObjectList<OBJ, CONTAINER>::sortLatestFirst()
|
||||||
{
|
{
|
||||||
this->container().sortOldestFirst();
|
this->container().sortOldestFirst();
|
||||||
std::reverse(this->container().begin(), this->container().end());
|
this->container().reverse();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class OBJ, class CONTAINER>
|
template <class OBJ, class CONTAINER>
|
||||||
@@ -225,15 +226,111 @@ namespace BlackMisc
|
|||||||
this->container().sort(BlackMisc::Predicates::MemberLess(&OBJ::getMSecsSinceEpoch));
|
this->container().sort(BlackMisc::Predicates::MemberLess(&OBJ::getMSecsSinceEpoch));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class OBJ, class CONTAINER>
|
template<class OBJ, class CONTAINER>
|
||||||
void ITimestampObjectList<OBJ, CONTAINER>::push_frontMaxElements(const OBJ &object, int maxElements)
|
void ITimestampObjectList<OBJ, CONTAINER>::push_frontKeepLatestFirst(const OBJ &value, int maxElements)
|
||||||
{
|
{
|
||||||
Q_ASSERT(maxElements > 1);
|
Q_ASSERT_X(maxElements < 0 || maxElements > 1, Q_FUNC_INFO, "Max.value wrong range");
|
||||||
if (this->container().size() >= (maxElements - 1))
|
CONTAINER &c = this->container();
|
||||||
|
if (!c.isEmpty() && value.isOlderThan(c.front()))
|
||||||
{
|
{
|
||||||
this->container().truncate(maxElements - 1);
|
ITimestampObjectList::sortLatestFirst();
|
||||||
}
|
}
|
||||||
this->container().push_front(object);
|
c.push_front(value);
|
||||||
|
if (maxElements < 0 || maxElements <= c.size()) { return; }
|
||||||
|
c.truncate(maxElements);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class OBJ, class CONTAINER>
|
||||||
|
bool ITimestampObjectList<OBJ, CONTAINER>::isSortedLatestLast() const
|
||||||
|
{
|
||||||
|
if (this->container().isEmpty()) { return true; }
|
||||||
|
qint64 max = -1;
|
||||||
|
for (const ITimestampBased &obj : this->container())
|
||||||
|
{
|
||||||
|
if (!obj.hasValidTimestamp()) { return false; }
|
||||||
|
if (obj.getMSecsSinceEpoch() < max) { return false; }
|
||||||
|
max = obj.getMSecsSinceEpoch();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class OBJ, class CONTAINER>
|
||||||
|
bool ITimestampObjectList<OBJ, CONTAINER>::isSortedLatestFirst() const
|
||||||
|
{
|
||||||
|
if (this->container().isEmpty()) { return true; }
|
||||||
|
qint64 min = std::numeric_limits <qint64>::max();
|
||||||
|
for (const ITimestampBased &obj : this->container())
|
||||||
|
{
|
||||||
|
if (!obj.hasValidTimestamp()) { return false; }
|
||||||
|
if (obj.getMSecsSinceEpoch() > min) { return false; }
|
||||||
|
min = obj.getMSecsSinceEpoch();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class OBJ, class CONTAINER>
|
||||||
|
void ITimestampWithOffsetObjectList<OBJ, CONTAINER>::sortAdjustedLatestFirst()
|
||||||
|
{
|
||||||
|
this->container().sortAdjustedOldestFirst();
|
||||||
|
this->container().reverse();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class OBJ, class CONTAINER>
|
||||||
|
void ITimestampWithOffsetObjectList<OBJ, CONTAINER>::sortAdjustedOldestFirst()
|
||||||
|
{
|
||||||
|
this->container().sort(Predicates::MemberLess(&OBJ::getAdjustedMSecsSinceEpoch));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class OBJ, class CONTAINER>
|
||||||
|
ITimestampWithOffsetObjectList<OBJ, CONTAINER>::ITimestampWithOffsetObjectList() : ITimestampObjectList<OBJ, CONTAINER>()
|
||||||
|
{
|
||||||
|
static_assert(std::is_base_of<ITimestampWithOffsetBased, OBJ>::value, "OBJ needs to implement ITimestampBased");
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class OBJ, class CONTAINER>
|
||||||
|
void ITimestampWithOffsetObjectList<OBJ, CONTAINER>::push_frontKeepLatestAdjustedFirst(const OBJ &value, int maxElements)
|
||||||
|
{
|
||||||
|
Q_ASSERT_X(maxElements < 0 || maxElements > 1, Q_FUNC_INFO, "Max.value wrong range");
|
||||||
|
CONTAINER &c = this->container();
|
||||||
|
if (!c.isEmpty() && value.isOlderThan(c.front()))
|
||||||
|
{
|
||||||
|
ITimestampWithOffsetObjectList::sortAdjustedLatestFirst();
|
||||||
|
}
|
||||||
|
c.push_front(value);
|
||||||
|
if (maxElements < 0 || maxElements <= c.size()) { return; }
|
||||||
|
c.truncate(maxElements);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class OBJ, class CONTAINER>
|
||||||
|
bool ITimestampWithOffsetObjectList<OBJ, CONTAINER>::isSortedAdjustedLatestLast() const
|
||||||
|
{
|
||||||
|
if (this->container().isEmpty()) { return true; }
|
||||||
|
qint64 max = -1;
|
||||||
|
for (const ITimestampWithOffsetBased &obj : this->container())
|
||||||
|
{
|
||||||
|
if (!obj.hasValidTimestamp()) { return false; }
|
||||||
|
if (obj.getAdjustedMSecsSinceEpoch() < max) { return false; }
|
||||||
|
max = obj.getAdjustedMSecsSinceEpoch();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class OBJ, class CONTAINER>
|
||||||
|
bool ITimestampWithOffsetObjectList<OBJ, CONTAINER>::isSortedAdjustedLatestFirst() const
|
||||||
|
{
|
||||||
|
if (this->container().isEmpty()) { return true; }
|
||||||
|
qint64 min = std::numeric_limits <qint64>::max();
|
||||||
|
for (const ITimestampWithOffsetBased &obj : this->container())
|
||||||
|
{
|
||||||
|
if (!obj.hasValidTimestamp()) { return false; }
|
||||||
|
if (obj.getAdjustedMSecsSinceEpoch() > min) { return false; }
|
||||||
|
min = obj.getAdjustedMSecsSinceEpoch();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// see here for the reason of thess forward instantiations
|
// see here for the reason of thess forward instantiations
|
||||||
@@ -243,8 +340,6 @@ namespace BlackMisc
|
|||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::CIdentifier, BlackMisc::CIdentifierList>;
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::CIdentifier, BlackMisc::CIdentifierList>;
|
||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::CStatusMessage, BlackMisc::CStatusMessageList>;
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::CStatusMessage, BlackMisc::CStatusMessageList>;
|
||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Aviation::CAircraftIcaoCode, BlackMisc::Aviation::CAircraftIcaoCodeList>;
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Aviation::CAircraftIcaoCode, BlackMisc::Aviation::CAircraftIcaoCodeList>;
|
||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Aviation::CAircraftParts, BlackMisc::Aviation::CAircraftPartsList>;
|
|
||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Aviation::CAircraftSituation, BlackMisc::Aviation::CAircraftSituationList>;
|
|
||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Aviation::CAirlineIcaoCode, BlackMisc::Aviation::CAirlineIcaoCodeList>;
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Aviation::CAirlineIcaoCode, BlackMisc::Aviation::CAirlineIcaoCodeList>;
|
||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Aviation::CAirport, BlackMisc::Aviation::CAirportList>;
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Aviation::CAirport, BlackMisc::Aviation::CAirportList>;
|
||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Aviation::CLivery, BlackMisc::Aviation::CLiveryList>;
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Aviation::CLivery, BlackMisc::Aviation::CLiveryList>;
|
||||||
@@ -256,6 +351,9 @@ namespace BlackMisc
|
|||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Simulation::CAircraftModel, BlackMisc::Simulation::CAircraftModelList>;
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Simulation::CAircraftModel, BlackMisc::Simulation::CAircraftModelList>;
|
||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Simulation::CDistributor, BlackMisc::Simulation::CDistributorList>;
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Simulation::CDistributor, BlackMisc::Simulation::CDistributorList>;
|
||||||
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Simulation::CMatchingStatisticsEntry, BlackMisc::Simulation::CMatchingStatistics>;
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampObjectList<BlackMisc::Simulation::CMatchingStatisticsEntry, BlackMisc::Simulation::CMatchingStatistics>;
|
||||||
|
|
||||||
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampWithOffsetObjectList<BlackMisc::Aviation::CAircraftParts, BlackMisc::Aviation::CAircraftPartsList>;
|
||||||
|
template class BLACKMISC_EXPORT_DEFINE_TEMPLATE ITimestampWithOffsetObjectList<BlackMisc::Aviation::CAircraftSituation, BlackMisc::Aviation::CAircraftSituationList>;
|
||||||
//! \endcond
|
//! \endcond
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#ifndef BLACKMISC_TIMESTAMPOBJECTLIST_H
|
#ifndef BLACKMISC_TIMESTAMPOBJECTLIST_H
|
||||||
#define BLACKMISC_TIMESTAMPOBJECTLIST_H
|
#define BLACKMISC_TIMESTAMPOBJECTLIST_H
|
||||||
|
|
||||||
|
#include "blackmisc/timestampbased.h"
|
||||||
#include "blackmisc/blackmiscexport.h"
|
#include "blackmisc/blackmiscexport.h"
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
@@ -22,8 +23,7 @@ namespace BlackMisc
|
|||||||
{
|
{
|
||||||
//! List of objects with timestamp.
|
//! List of objects with timestamp.
|
||||||
//! Such objects should implement \sa ITimestampBased
|
//! Such objects should implement \sa ITimestampBased
|
||||||
template<class OBJ, class CONTAINER>
|
template<class OBJ, class CONTAINER> class ITimestampObjectList
|
||||||
class ITimestampObjectList
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//! List of objects before dateTime
|
//! List of objects before dateTime
|
||||||
@@ -92,8 +92,16 @@ namespace BlackMisc
|
|||||||
//! Sort by timestamp
|
//! Sort by timestamp
|
||||||
void sortOldestFirst();
|
void sortOldestFirst();
|
||||||
|
|
||||||
//! Inserts as first object by keeping max. elements
|
//! Insert as first element by keeping maxElements and the latest first
|
||||||
void push_frontMaxElements(const OBJ &object, int maxElements);
|
void push_frontKeepLatestFirst(const OBJ &value, int maxElements = -1);
|
||||||
|
|
||||||
|
//! Is completelty sorted: latest last
|
||||||
|
//! \remark all object must have a valid timestamp
|
||||||
|
bool isSortedLatestLast() const;
|
||||||
|
|
||||||
|
//! Is completelty sorted: latest last
|
||||||
|
//! \remark all object must have a valid timestamp
|
||||||
|
bool isSortedLatestFirst() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//! Constructor
|
//! Constructor
|
||||||
@@ -106,6 +114,33 @@ namespace BlackMisc
|
|||||||
CONTAINER &container();
|
CONTAINER &container();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//! List of objects with timestamp and offset.
|
||||||
|
//! Such objects should implement \sa ITimestampWithOffsetBased
|
||||||
|
template<class OBJ, class CONTAINER> class ITimestampWithOffsetObjectList : public ITimestampObjectList<OBJ, CONTAINER>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//! Sort by adjusted timestamp
|
||||||
|
void sortAdjustedLatestFirst();
|
||||||
|
|
||||||
|
//! Sort by adjusted timestamp
|
||||||
|
void sortAdjustedOldestFirst();
|
||||||
|
|
||||||
|
//! Insert as first element by keeping maxElements and the latest first
|
||||||
|
void push_frontKeepLatestAdjustedFirst(const OBJ &value, int maxElements = -1);
|
||||||
|
|
||||||
|
//! Is completelty sorted: latest last
|
||||||
|
//! \remark all object must have a valid timestamp
|
||||||
|
bool isSortedAdjustedLatestLast() const;
|
||||||
|
|
||||||
|
//! Is completelty sorted: latest last
|
||||||
|
//! \remark all object must have a valid timestamp
|
||||||
|
bool isSortedAdjustedLatestFirst() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//! Constructor
|
||||||
|
ITimestampWithOffsetObjectList();
|
||||||
|
};
|
||||||
|
|
||||||
//! \cond PRIVATE
|
//! \cond PRIVATE
|
||||||
namespace Aviation
|
namespace Aviation
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user