refs #667 XBus: use the thread-agnostic interpolator method, to avoid an unnecessary dynamic memory allocation.

This commit is contained in:
Mathew Sutcliffe
2016-06-06 20:02:00 +01:00
parent f82a3b53e4
commit 6134b3d0a3
2 changed files with 2 additions and 26 deletions

View File

@@ -42,30 +42,9 @@ namespace XBus
surfaces.lights.timeOffset = static_cast<quint16>(qrand() % 0xffff);
}
class CTraffic::AircraftProvider : public BlackMisc::Simulation::CRemoteAircraftProviderDummy
{
public:
//! Constructor.
AircraftProvider(QObject *parent = nullptr) : CRemoteAircraftProviderDummy(parent) {}
//! \copydoc IRemoteAircraftProvider::remoteAircraftSituations
//! \todo return reference not copy, thread safety not needed
virtual BlackMisc::Aviation::CAircraftSituationList remoteAircraftSituations(const BlackMisc::Aviation::CCallsign &) const override { return *m_situations; }
//! \copydoc IRemoteAircraftProvider::remoteAircraftSituationsCount
virtual int remoteAircraftSituationsCount(const BlackMisc::Aviation::CCallsign &) const override { return m_situations->size(); }
//! Inject the situations to be interpolated (for performance, no lookup by callsign).
void setSituations(const BlackMisc::Aviation::CAircraftSituationList *situations) { m_situations = situations; }
private:
const BlackMisc::Aviation::CAircraftSituationList *m_situations = nullptr;
};
CTraffic::CTraffic(QObject *parent) :
QObject(parent),
m_provider(new AircraftProvider(this)),
m_interpolator(new BlackMisc::CInterpolatorLinear(m_provider, this))
m_interpolator(new BlackMisc::CInterpolatorLinear(new BlackMisc::Simulation::CRemoteAircraftProviderDummy(this), this))
{
}
@@ -328,8 +307,7 @@ namespace XBus
case xpmpDataType_Position:
{
BlackMisc::IInterpolator::InterpolationStatus status;
m_provider->setSituations(&plane->situations);
auto situation = m_interpolator->getInterpolatedSituation(plane->callsign, -1, false, status);
auto situation = m_interpolator->getInterpolatedSituation(plane->situations, -1, false, status);
if (! status.interpolationSucceeded) { return xpmpData_Unavailable; }
if (! status.changedPosition) { return xpmpData_Unchanged; }