/* Copyright (C) 2015 * swift project Community / Contributors * * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, * including this file, may be copied, modified, propagated, or distributed except according to the terms * contained in the LICENSE file. */ //! \file #ifndef BLACKMISC_TIMESTAMPOBJECTLIST_H #define BLACKMISC_TIMESTAMPOBJECTLIST_H #include "blackmisc/timestampbased.h" #include "blackmisc/blackmiscexport.h" #include #include class QDateTime; namespace BlackMisc { //! Milliseconds minimum/maximum/mean struct MillisecondsMinMaxMean { qint64 min; //!< Minimum qint64 max; //!< Maximum double mean; //!< Mean (average) //! Valid? bool isValid() const { return min >= 0 && max >= 0; } //! Reset the values void reset() { min = -1; max = -1; mean = -1;} //! As string QString asString() const { static const QString s("Min: %1ms Max: %2ms Mean: %3ms"); return s.arg(min).arg(max).arg(mean, 0, 'f', 2); } }; //! List of objects with timestamp. //! Such objects should implement \sa ITimestampBased template class ITimestampObjectList { public: //! Hint if the list is sorted enum HintTimestampSort { NoTimestampSortHint, TimestampLatestFirst, TimestampLatestLast }; //! List of objects before dateTime (older) CONTAINER findBefore(const QDateTime &dateTime) const; //! List of objects before msSinceEpoch (older) CONTAINER findBefore(qint64 msSinceEpoch) const; //! Object before timestamp or default (older) OBJ findObjectBeforeOrDefault(qint64 msSinceEpoch) const; //! Get objects before msSinceEpoch and remove those CONTAINER findBeforeAndRemove(qint64 msSinceEpoch); //! List of objects before now - offset CONTAINER findBeforeNowMinusOffset(qint64 msOffset) const; //! List of objects after dateTime (newer) CONTAINER findAfter(const QDateTime &dateTime) const; //! List of objects after msSinceEpoch (newer) CONTAINER findAfter(qint64 msSinceEpoch) const; //! List of objects before now - offset CONTAINER findAfterNowMinusOffset(qint64 msOffset) const; //! List of objects after msSinceEpoch (newer) OBJ findObjectAfterOrDefault(qint64 msSinceEpoch) const; //! Objects without valid timestamp CONTAINER findInvalidTimestamps() const; //! Find closest (or default) OBJ findClosestTimeDistance(qint64 msSinceEpoch) const; //! Has invalid timestamp bool hasInvalidTimestamps() const; //! Set all timestamps to now void setCurrentUtcTime(); //! Set all timestamps to given time void setUtcTime(qint64 msSinceEpoch); //! Set invalid timestamps to now void setInvalidTimestampsToCurrentUtcTime(); //! Latest timestamp QDateTime latestTimestamp() const; //! Latest timestamp qint64 latestTimestampMsecsSinceEpoch() const; //! Oldest timestamp QDateTime oldestTimestamp() const; //! Oldest timestamp qint64 oldestTimestampMsecsSinceEpoch() const; //! Latest object OBJ latestObject() const; //! Latest object OBJ oldestObject() const; //! Remove objects with timestamp before dateTime int removeBefore(const QDateTime &dateTime); //! Remove objects with timestamp before dateTime int removeBefore(qint64 msSinceEpoch); //! Remove objects older than seconds int removeOlderThanNowMinusOffset(qint64 offsetMs); //! Sort by timestamp void sortLatestFirst(); //! Sort by timestamp void sortOldestFirst(); //! Insert as first element by keeping maxElements and the latest first void push_frontKeepLatestFirst(const OBJ &value, bool replaceSameTimestamp = true, int maxElements = -1); //! Replace if an object has the same timestamp int replaceIfSameTimestamp(const OBJ &newObject); //! Is completely sorted: latest last //! \remark all object must have a valid timestamp bool isSortedLatestLast() const; //! Is completely sorted: latest last //! \remark all object must have a valid timestamp bool isSortedLatestFirst() const; //! Adds a time to all values void addMsecs(qint64 msToAdd); //! Set the hint void setSortHint(HintTimestampSort hint); //! Difference of timestamp values //! \cond timestamp list has to be sorted to get meaningful values MillisecondsMinMaxMean getTimestampDifferenceMinMaxMean() const; protected: //! Constructor ITimestampObjectList(); //! Container const CONTAINER &container() const; //! Container CONTAINER &container(); HintTimestampSort m_tsSortHint = NoTimestampSortHint; //!< sort hint }; //! List of objects with timestamp and offset. //! Such objects should implement \sa ITimestampWithOffsetBased template class ITimestampWithOffsetObjectList : public ITimestampObjectList { public: //! Hint if the list is sorted enum HintAdjustedTimestampSort { NoAdjustedTimestampSortHint, AdjustedTimestampLatestFirst }; //! Sort by adjusted timestamp void sortAdjustedLatestFirst(); //! As sorted copy CONTAINER getSortedAdjustedLatestFirst() const; //! Get the latest 2 values CONTAINER getLatestAdjustedTwoObjects(bool alreadySortedLatestFirst = false) const; //! Sort by adjusted timestamp void sortAdjustedOldestFirst(); //! Any negative or zero offset time? bool containsZeroOrNegativeOffsetTime() const; //! Any negative offset time? bool containsNegativeOffsetTime() const; //! Adds a time to all offset values void addMsecsToOffset(qint64 msToAdd); //! Insert as first element by keeping maxElements and the latest first void push_frontKeepLatestAdjustedFirst(const OBJ &value, bool replaceSameTimestamp = true, int maxElements = -1); //! Insert as first element by keeping maxElements and the latest first //! \remark adjust offset to average offset of two adjacent elements so adjusted values are sorted void push_frontKeepLatestFirstAdjustOffset(const OBJ &value, bool replaceSameTimestamp = true, int maxElements = -1); //! Add value, but ignore overlapping (past) values void push_frontKeepLatestFirstIgnoreOverlapping(const OBJ &value, bool replaceSameTimestamp = true, int maxElements = -1); //! Prefill with elements void prefillLatestAdjustedFirst(const OBJ &value, int elements, qint64 deltaTimeMs = -1); //! Is completely sorted: latest last //! \remark all object must have a valid timestamp bool isSortedAdjustedLatestLast() const; //! Is completely sorted: latest last //! \remark all object must have a valid timestamp bool isSortedAdjustedLatestFirst() const; //! List of objects after msSinceEpoch (newer) CONTAINER findAfterAdjusted(qint64 msSinceEpoch) const; //! List of objects after msSinceEpoch (newer) OBJ findObjectAfterAdjustedOrDefault(qint64 msSinceEpoch) const; //! List of objects before msSinceEpoch (older) CONTAINER findBeforeAdjusted(qint64 msSinceEpoch) const; //! Object before timestamp (older) OBJ findObjectBeforeAdjustedOrDefault(qint64 msSinceEpoch) const; //! Closest adjusted time difference OBJ findClosestTimeDistanceAdjusted(qint64 msSinceEpoch) const; //! Latest adjusted object OBJ latestAdjustedObject() const; //! Oldest adjusted object OBJ oldestAdjustedObject() const; //! Latest adjusted timestamp QDateTime latestAdjustedTimestamp() const; //! Oldest adjusted timestamp QDateTime oldestAdjustedTimestamp() const; //! Latest adjusted timestamp qint64 latestAdjustedTimestampMsecsSinceEpoch() const; //! Oldest adjusted timestamp qint64 oldestAdjustedTimestampMsecsSinceEpoch() const; //! Set the hint void setAdjustedSortHint(HintAdjustedTimestampSort hint); //! Difference of timestamp values //! \cond timestamp list has to be sorted to get meaningful values MillisecondsMinMaxMean getOffsetMinMaxMean() const; protected: //! Constructor ITimestampWithOffsetObjectList(); HintAdjustedTimestampSort m_tsAdjustedSortHint = NoAdjustedTimestampSortHint; //!< sort hint }; //! \cond PRIVATE namespace Aviation { class CAircraftSituation; class CAircraftSituationList; class CAircraftSituationChange; class CAircraftSituationChangeList; class CAircraftParts; class CAircraftPartsList; class CAirport; class CAirportList; class CLivery; class CLiveryList; class CAircraftIcaoCode; class CAircraftIcaoCodeList; class CAirlineIcaoCode; class CAirlineIcaoCodeList; } namespace Network { class CTextMessage; class CTextMessageList; class CRawFsdMessage; class CRawFsdMessageList; class CUrlLog; class CUrlLogList; } namespace Db { class CDbInfo; class CDbInfoList; class CArtifact; class CArtifactList; class CDistribution; class CDistributionList; } namespace Simulation { class CDistributor; class CDistributorList; class CAircraftModel; class CAircraftModelList; } class CStatusMessage; class CStatusMessageList; class CIdentifier; class CIdentifierList; class CCountry; class CCountryList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; // for the derived version both templates are required extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampWithOffsetObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampWithOffsetObjectList; extern template class BLACKMISC_EXPORT_DECLARE_TEMPLATE ITimestampWithOffsetObjectList; //! \endcond } //namespace #endif //guard