mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-21 04:45:31 +08:00
Ref T397, sort by timestamp, then adjust offset + function which ignores overlapping situations
This commit is contained in:
@@ -274,15 +274,22 @@ namespace BlackMisc
|
|||||||
{
|
{
|
||||||
c[0] = value;
|
c[0] = value;
|
||||||
if (maxElements > 0) { c.truncate(maxElements); }
|
if (maxElements > 0) { c.truncate(maxElements); }
|
||||||
return;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (maxElements > 0) { c.truncate(maxElements - 1); }
|
||||||
|
const bool needSort = !c.isEmpty() && value.isOlderThan(c.front());
|
||||||
|
c.push_front(value);
|
||||||
|
if (needSort)
|
||||||
|
{
|
||||||
|
ITimestampObjectList::sortLatestFirst();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxElements > 0) { c.truncate(maxElements - 1); }
|
// crosscheck
|
||||||
const bool needSort = !c.isEmpty() && value.isOlderThan(c.front());
|
if (CBuildConfig::isLocalDeveloperDebugBuild())
|
||||||
c.push_front(value);
|
|
||||||
if (needSort)
|
|
||||||
{
|
{
|
||||||
ITimestampObjectList::sortLatestFirst();
|
Q_ASSERT_X(this->isSortedLatestFirst(), Q_FUNC_INFO, "Wrong sort order");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -404,7 +411,7 @@ namespace BlackMisc
|
|||||||
c++;
|
c++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c >0) { mmm.mean = mean / c; }
|
if (c > 0) { mmm.mean = mean / c; }
|
||||||
return mmm;
|
return mmm;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -498,31 +505,47 @@ namespace BlackMisc
|
|||||||
template<class OBJ, class CONTAINER>
|
template<class OBJ, class CONTAINER>
|
||||||
void ITimestampWithOffsetObjectList<OBJ, CONTAINER>::push_frontKeepLatestFirstAdjustOffset(const OBJ &value, bool replaceSameTimestamp, int maxElements)
|
void ITimestampWithOffsetObjectList<OBJ, CONTAINER>::push_frontKeepLatestFirstAdjustOffset(const OBJ &value, bool replaceSameTimestamp, int maxElements)
|
||||||
{
|
{
|
||||||
ITimestampWithOffsetObjectList<OBJ, CONTAINER>::push_frontKeepLatestAdjustedFirst(value, replaceSameTimestamp, maxElements);
|
ITimestampWithOffsetObjectList<OBJ, CONTAINER>::push_frontKeepLatestFirst(value, replaceSameTimestamp, maxElements);
|
||||||
|
|
||||||
// now sorted by timestamp
|
// now sorted by timestamp
|
||||||
// this reflects normally the incoming order
|
// this reflects normally the incoming order
|
||||||
// ts
|
// ts
|
||||||
// 8: os 2 adj 10
|
// 8: os 2 adj 12 => min os 4
|
||||||
// 6: os 2 adj 8
|
// 6: os 2 adj 11 => min os 5
|
||||||
// 5: os 5 adj 10 => max os 3
|
// 5: os 5 adj 10
|
||||||
// 0: os 5 adj 5
|
// 0: os 5 adj 5
|
||||||
CONTAINER &c = this->container();
|
CONTAINER &c = this->container();
|
||||||
if (c.size() < 2) { return; }
|
if (c.size() < 2) { return; }
|
||||||
const ITimestampWithOffsetBased &front = c.front();
|
ITimestampWithOffsetBased &front = c.front();
|
||||||
ITimestampWithOffsetBased &second = c[1];
|
const ITimestampWithOffsetBased &second = c[1];
|
||||||
if (front.isNewerThanAdjusted(second)) { return; }
|
if (!front.isNewerThanAdjusted(second))
|
||||||
const qint64 diffOs = front.getAdjustedMSecsSinceEpoch() - second.getMSecsSinceEpoch() - 1;
|
{
|
||||||
const qint64 avgOs = (diffOs + qMin(front.getTimeOffsetMs(), diffOs)) / 2;
|
// const qint64 minOs = qMin(front.getTimeOffsetMs(), second.getTimeOffsetMs());
|
||||||
second.setTimeOffsetMs(avgOs);
|
const qint64 minReqOs = second.getAdjustedMSecsSinceEpoch() - front.getMSecsSinceEpoch(); // minimal required
|
||||||
|
const qint64 avgOs = (front.getTimeOffsetMs() + second.getTimeOffsetMs()) / 2;
|
||||||
|
const qint64 os = qMax(minReqOs + 1, avgOs); // at least +1, as value must be > (greater)
|
||||||
|
front.setTimeOffsetMs(os);
|
||||||
|
}
|
||||||
|
|
||||||
if (CBuildConfig::isLocalDeveloperDebugBuild())
|
if (CBuildConfig::isLocalDeveloperDebugBuild())
|
||||||
{
|
{
|
||||||
Q_ASSERT_X(front.isNewerThanAdjusted(second), Q_FUNC_INFO, "Front/second timestamp");
|
BLACK_VERIFY_X(front.isNewerThanAdjusted(second), Q_FUNC_INFO, "Front/second timestamp");
|
||||||
Q_ASSERT_X(this->isSortedAdjustedLatestFirst(), Q_FUNC_INFO, "Wrong sort order");
|
BLACK_VERIFY_X(this->isSortedAdjustedLatestFirst(), Q_FUNC_INFO, "Wrong sort order");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class OBJ, class CONTAINER>
|
||||||
|
void ITimestampWithOffsetObjectList<OBJ, CONTAINER>::push_frontKeepLatestFirstIgnoreOverlapping(const OBJ &value, bool replaceSameTimestamp, int maxElements)
|
||||||
|
{
|
||||||
|
CONTAINER &c = this->container();
|
||||||
|
if (c.size() > 1)
|
||||||
|
{
|
||||||
|
const ITimestampWithOffsetBased front = c.front();
|
||||||
|
if (value.getAdjustedMSecsSinceEpoch() <= front.getAdjustedMSecsSinceEpoch()) { return; }
|
||||||
|
}
|
||||||
|
ITimestampWithOffsetObjectList<OBJ, CONTAINER>::push_frontKeepLatestFirst(value, replaceSameTimestamp, maxElements);
|
||||||
|
}
|
||||||
|
|
||||||
template<class OBJ, class CONTAINER>
|
template<class OBJ, class CONTAINER>
|
||||||
void ITimestampWithOffsetObjectList<OBJ, CONTAINER>::prefillLatestAdjustedFirst(const OBJ &value, int elements, qint64 deltaTimeMs)
|
void ITimestampWithOffsetObjectList<OBJ, CONTAINER>::prefillLatestAdjustedFirst(const OBJ &value, int elements, qint64 deltaTimeMs)
|
||||||
{
|
{
|
||||||
@@ -561,7 +584,6 @@ namespace BlackMisc
|
|||||||
template<class OBJ, class CONTAINER>
|
template<class OBJ, class CONTAINER>
|
||||||
bool ITimestampWithOffsetObjectList<OBJ, CONTAINER>::isSortedAdjustedLatestFirst() const
|
bool ITimestampWithOffsetObjectList<OBJ, CONTAINER>::isSortedAdjustedLatestFirst() const
|
||||||
{
|
{
|
||||||
if (this->container().isEmpty()) { return false; }
|
|
||||||
if (this->container().size() < 2) { return true; }
|
if (this->container().size() < 2) { return true; }
|
||||||
qint64 min = std::numeric_limits <qint64>::max();
|
qint64 min = std::numeric_limits <qint64>::max();
|
||||||
for (const ITimestampWithOffsetBased &obj : this->container())
|
for (const ITimestampWithOffsetBased &obj : this->container())
|
||||||
|
|||||||
@@ -206,6 +206,9 @@ namespace BlackMisc
|
|||||||
//! \remark adjust offset to average offset of two adjacent elements so adjusted values are sorted
|
//! \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);
|
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
|
//! Prefill with elements
|
||||||
void prefillLatestAdjustedFirst(const OBJ &value, int elements, qint64 deltaTimeMs = -1);
|
void prefillLatestAdjustedFirst(const OBJ &value, int elements, qint64 deltaTimeMs = -1);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user