#include "timeline.h" #include "log.h" using namespace osdev::components; Timeline::Timeline() : m_timeline(10) , m_proposedChange() { } const OrmBatchChange& Timeline::evaluate(const OrmBatchChange& desiredChange, bool exclusiveUpdate) { m_proposedChange = OrmBatchChange {}; if (m_timeline.full() && desiredChange < m_timeline.front()) { LogWarning("[Timeline::evaluate]", QString("Incoming change (%1) is older then the oldest registered change (%2).").arg(desiredChange.timestamp().toString()).arg(m_timeline.front().timestamp().toString())); return m_proposedChange; // change is older then anything we know, discard. } m_proposedChange = desiredChange; for (const auto& ch : m_timeline) { if (!m_proposedChange.processChange(ch, exclusiveUpdate)) { break; } } if ( m_proposedChange.valid() && !m_timeline.empty() && m_proposedChange < m_timeline.back()) { // reset the timestamp so that the proposed change will be the latest in the timeline when committed. auto ts = m_timeline.back().timestamp(); m_proposedChange.setTimestamp(++ts); } return m_proposedChange; } void Timeline::commit() { if (m_proposedChange.valid()) { m_timeline.push_back(m_proposedChange); m_proposedChange = OrmBatchChange {}; } }