/* 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. */ #include "blackmisc/timestampobjectlist.h" #include "blackmisc/predicates.h" #include "blackmisc/aviation/aircraftsituationlist.h" #include "blackmisc/aviation/aircraftpartslist.h" #include "blackmisc/aviation/liverylist.h" #include "blackmisc/network/textmessagelist.h" #include "blackmisc/simulation/distributorlist.h" #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/statusmessagelist.h" #include "blackmisc/identifierlist.h" #include #include namespace BlackMisc { template ITimestampObjectList::ITimestampObjectList() { } template const CONTAINER &ITimestampObjectList::container() const { return static_cast(*this); } template CONTAINER &ITimestampObjectList::container() { return static_cast(*this); } template CONTAINER ITimestampObjectList::findBefore(qint64 msSinceEpoch) const { return this->container().findBy([&](const OBJ & obj) { return obj.isOlderThan(msSinceEpoch); }); } template CONTAINER ITimestampObjectList::findBeforeAndRemove(qint64 msSinceEpoch) { CONTAINER result(findBefore(msSinceEpoch)); this->removeBefore(msSinceEpoch); return result; } template CONTAINER ITimestampObjectList::findBeforeNowMinusOffset(qint64 msOffset) const { return this->findBefore(QDateTime::currentMSecsSinceEpoch() - msOffset); } template CONTAINER ITimestampObjectList::findBefore(const QDateTime &dateTime) const { return this->findBefore(dateTime.toMSecsSinceEpoch()); } template CONTAINER ITimestampObjectList::findAfter(qint64 msSinceEpoc) const { return this->container().findBy([&](const OBJ & obj) { return obj.isNewerThan(msSinceEpoc); }); } template QList ITimestampObjectList::splitByTime(qint64 msSinceEpoch, bool alreadySortedLatestFirst) const { // fixme: Split by time is one of the most frequently called functions in interpolator, so any performance improvement here counts CONTAINER newer(this->container()); if (!alreadySortedLatestFirst) { newer.sortLatestFirst(); } CONTAINER older; for (auto it = newer.begin(); it != newer.end(); ++it) { if (it->isOlderThan(msSinceEpoch)) { older.insert(CRange(it, newer.end())); newer.erase(it, newer.end()); break; } } // before / after return QList({newer, older}); } template OBJ ITimestampObjectList::latestValue() const { if (this->container().isEmpty()) { return OBJ(); } CONTAINER copy(container()); // copy copy.sortLatestFirst(); return copy.front(); } template OBJ ITimestampObjectList::oldestValue() const { if (this->container().isEmpty()) { return OBJ(); } CONTAINER copy(container()); // copy copy.sortLatestFirst(); return copy.back(); } template CONTAINER ITimestampObjectList::findAfter(const QDateTime &dateTime) const { return this->findAfter(dateTime.toMSecsSinceEpoch()); } template void ITimestampObjectList::removeBefore(const QDateTime &dateTime) { this->removeBefore(dateTime.toMSecsSinceEpoch()); } template void ITimestampObjectList::removeBefore(qint64 msSinceEpoc) { this->container().removeIf([&](const OBJ & obj) { return obj.isOlderThan(msSinceEpoc); }); } template void ITimestampObjectList::removeOlderThanNowMinusOffset(qint64 offsetMs) { const qint64 epoch = QDateTime::currentMSecsSinceEpoch() - offsetMs; this->container().removeIf([&](const OBJ & obj) { return obj.isOlderThan(epoch); }); } template void ITimestampObjectList::sortLatestFirst() { this->container().sortOldestFirst(); std::reverse(this->container().begin(), this->container().end()); } template void ITimestampObjectList::sortOldestFirst() { this->container().sort(BlackMisc::Predicates::MemberLess(&OBJ::getMSecsSinceEpoch)); } template void ITimestampObjectList::push_frontMaxElements(const OBJ &object, int maxElements) { Q_ASSERT(maxElements > 1); if (this->container().size() >= (maxElements - 1)) { this->container().truncate(maxElements - 1); } this->container().push_front(object); } // see here for the reason of thess forward instantiations // http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html template class ITimestampObjectList; template class ITimestampObjectList; template class ITimestampObjectList; template class ITimestampObjectList; template class ITimestampObjectList; template class ITimestampObjectList; template class ITimestampObjectList; template class ITimestampObjectList; } // namespace