mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-12 23:35:33 +08:00
refs #386, performance issues
* keep split per callsign map in IInterpolator (so it is available for all interpolators) * Interpolator using CWorker, so it can run in background * added signals to provider to add split situations / callsigns * adjustments to airspace / context for those signals * thread safe access to those from interpolator * renamed from rendered to remote aircraft as discussed * adjust samples * removed no longer required functions in timestampobjectlist * changed connectioStatusChanged from uint -> int
This commit is contained in:
@@ -100,11 +100,11 @@ namespace BlackMisc
|
||||
}
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
QMap<CCallsign, CONTAINER> ICallsignObjectList<OBJ, CONTAINER>::splitPerCallsign() const
|
||||
QHash<CCallsign, CONTAINER> ICallsignObjectList<OBJ, CONTAINER>::splitPerCallsign() const
|
||||
{
|
||||
CONTAINER copyContainer(getContainer());
|
||||
copyContainer.sortByCallsign();
|
||||
QMap<CCallsign, CONTAINER> result;
|
||||
QHash<CCallsign, CONTAINER> result;
|
||||
CCallsign cs;
|
||||
for (const OBJ &csObj : copyContainer)
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#include "blackmisc/propertyindexlist.h"
|
||||
#include "blackmisc/propertyindexvariantmap.h"
|
||||
#include <QList>
|
||||
#include <QMap>
|
||||
#include <QHash>
|
||||
|
||||
namespace BlackMisc
|
||||
{
|
||||
@@ -58,7 +58,7 @@ namespace BlackMisc
|
||||
QMap<QString, int> getSuffixes() const;
|
||||
|
||||
//! Split into 0..n containers as per callsign
|
||||
QMap<BlackMisc::Aviation::CCallsign, CONTAINER> splitPerCallsign() const;
|
||||
QHash<BlackMisc::Aviation::CCallsign, CONTAINER> splitPerCallsign() const;
|
||||
|
||||
//! Sort by callsign
|
||||
void sortByCallsign();
|
||||
|
||||
86
src/blackmisc/simulation/simdirectaccessremoteaircraft.cpp
Normal file
86
src/blackmisc/simulation/simdirectaccessremoteaircraft.cpp
Normal file
@@ -0,0 +1,86 @@
|
||||
/* 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 "simdirectaccessremoteaircraft.h"
|
||||
|
||||
using namespace BlackMisc::Aviation;
|
||||
|
||||
namespace BlackMisc
|
||||
{
|
||||
namespace Simulation
|
||||
{
|
||||
|
||||
const CSimulatedAircraftList &CRemoteAircraftProviderSupportReadOnly::remoteAircraft() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "renderedAircraft", "No object available");
|
||||
return this->m_remoteAircraftProvider->remoteAircraft();
|
||||
}
|
||||
|
||||
const Aviation::CAircraftSituationList &CRemoteAircraftProviderSupportReadOnly::remoteAircraftSituations() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "renderedAircraftSituations", "No object available");
|
||||
return this->m_remoteAircraftProvider->remoteAircraftSituations();
|
||||
}
|
||||
|
||||
const Aviation::CAircraftPartsList &CRemoteAircraftProviderSupportReadOnly::remoteAircraftParts() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "renderedAircraftParts", "No object available");
|
||||
return this->m_remoteAircraftProvider->remoteAircraftParts();
|
||||
}
|
||||
|
||||
const CSimulatedAircraftList &CRemoteAircraftProviderSupport::remoteAircraft() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "renderedAircraft", "No object available");
|
||||
return this->m_remoteAircraftProvider->remoteAircraft();
|
||||
}
|
||||
|
||||
CSimulatedAircraftList &CRemoteAircraftProviderSupport::remoteAircraft()
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "renderedAircraft", "No object available");
|
||||
return this->m_remoteAircraftProvider->remoteAircraft();
|
||||
}
|
||||
|
||||
const CAircraftSituationList &CRemoteAircraftProviderSupport::remoteAircraftSituations() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "renderedAircraftSituations", "No object available");
|
||||
return this->m_remoteAircraftProvider->remoteAircraftSituations();
|
||||
}
|
||||
|
||||
CAircraftSituationList &CRemoteAircraftProviderSupport::remoteAircraftSituations()
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "renderedAircraftSituations", "No object available");
|
||||
return this->m_remoteAircraftProvider->remoteAircraftSituations();
|
||||
}
|
||||
|
||||
const CAircraftPartsList &CRemoteAircraftProviderSupport::remoteAircraftParts() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "renderedAircraftParts", "No object available");
|
||||
return this->m_remoteAircraftProvider->remoteAircraftParts();
|
||||
}
|
||||
|
||||
CAircraftPartsList &CRemoteAircraftProviderSupport::remoteAircraftParts()
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "renderedAircraftParts", "No object available");
|
||||
return this->m_remoteAircraftProvider->remoteAircraftParts();
|
||||
}
|
||||
|
||||
bool CRemoteAircraftProviderSupport::providerUpdateAircraftModel(const Aviation::CCallsign &callsign, const CAircraftModel &model, const QString &originator)
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "providerUpdateAircraftModel", "No object available");
|
||||
return this->m_remoteAircraftProvider->updateAircraftModel(callsign, model, originator);
|
||||
}
|
||||
|
||||
bool CRemoteAircraftProviderSupport::providerUpdateAircraftEnabled(const Aviation::CCallsign &callsign, bool enabledForRedering, const QString &originator)
|
||||
{
|
||||
Q_ASSERT_X(this->m_remoteAircraftProvider, "providerUpdateAircraftEnabled", "No object available");
|
||||
return this->m_remoteAircraftProvider->updateAircraftEnabled(callsign, enabledForRedering, originator);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
149
src/blackmisc/simulation/simdirectaccessremoteaircraft.h
Normal file
149
src/blackmisc/simulation/simdirectaccessremoteaircraft.h
Normal file
@@ -0,0 +1,149 @@
|
||||
/* 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_SIMDIRECTACCESSREMOTEAIRCRAFT_H
|
||||
#define BLACKMISC_SIMDIRECTACCESSREMOTEAIRCRAFT_H
|
||||
|
||||
#include "blackmisc/simulation/simulatedaircraftlist.h"
|
||||
#include "blackmisc/avaircraftsituationlist.h"
|
||||
#include "blackmisc/aviation/aircraftpartslist.h"
|
||||
#include <functional>
|
||||
|
||||
namespace BlackMisc
|
||||
{
|
||||
namespace Simulation
|
||||
{
|
||||
//! Direct in memory access to remote aircraft
|
||||
//! \note Can not be derived from QObject (as for the signals), as this would create multiple
|
||||
//! inheritance. Hence Q_DECLARE_INTERFACE is used.
|
||||
class IRemoteAircraftProviderReadOnly
|
||||
{
|
||||
public:
|
||||
//! All rendered aircraft
|
||||
virtual const CSimulatedAircraftList &remoteAircraft() const = 0;
|
||||
|
||||
//! All situation (per callsign, time history)
|
||||
virtual const BlackMisc::Aviation::CAircraftSituationList &remoteAircraftSituations() const = 0;
|
||||
|
||||
//! All parts (per callsign, time history)
|
||||
virtual const BlackMisc::Aviation::CAircraftPartsList &remoteAircraftParts() const = 0;
|
||||
|
||||
//! Destructor
|
||||
virtual ~IRemoteAircraftProviderReadOnly() {}
|
||||
|
||||
//! Connect signals to slot receiver. As the interface is no QObject, slots can not be connected directly.
|
||||
virtual bool connectRemoteAircraftProviderSignals(
|
||||
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> situationSlot,
|
||||
std::function<void(const BlackMisc::Aviation::CAircraftParts &)> partsSlot,
|
||||
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot
|
||||
) = 0;
|
||||
|
||||
// those signals have to be implemented by classes using the interface.
|
||||
signals:
|
||||
//! A new situation got added
|
||||
virtual void addedRemoteAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) = 0;
|
||||
|
||||
//! New parts got added
|
||||
virtual void addedRemoteAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts) = 0;
|
||||
|
||||
//! Aircraft was removed
|
||||
virtual void removedAircraft(const BlackMisc::Aviation::CCallsign &callsign) = 0;
|
||||
|
||||
};
|
||||
|
||||
//! Direct in memory access to own aircraft
|
||||
class IRemoteAircraftProvider : public IRemoteAircraftProviderReadOnly
|
||||
{
|
||||
public:
|
||||
//! All rendered aircraft
|
||||
//! \note in memory reference, not thread safe
|
||||
virtual CSimulatedAircraftList &remoteAircraft() = 0;
|
||||
|
||||
//! Rendered aircraft situations (history)
|
||||
virtual BlackMisc::Aviation::CAircraftSituationList &remoteAircraftSituations() = 0;
|
||||
|
||||
//! All parts (per callsign, time history)
|
||||
//! \note in memory reference, not thread safe
|
||||
virtual BlackMisc::Aviation::CAircraftPartsList &remoteAircraftParts() = 0;
|
||||
|
||||
//! Enable/disable rendering
|
||||
virtual bool updateAircraftEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRedering, const QString &originator) = 0;
|
||||
|
||||
//! Change model string
|
||||
virtual bool updateAircraftModel(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) = 0;
|
||||
};
|
||||
|
||||
//! Class which can be directly used providing access to such an interface
|
||||
class CRemoteAircraftProviderSupportReadOnly
|
||||
{
|
||||
public:
|
||||
//! \copydoc IRemoteAircraftProviderReadOnly::renderedAircraft
|
||||
virtual const CSimulatedAircraftList &remoteAircraft() const;
|
||||
|
||||
//!\copydoc IRemoteAircraftProviderReadOnly::renderedAircraftSituations
|
||||
virtual const BlackMisc::Aviation::CAircraftSituationList &remoteAircraftSituations() const;
|
||||
|
||||
//!\copydoc IRemoteAircraftProviderReadOnly::renderedAircraftParts
|
||||
virtual const BlackMisc::Aviation::CAircraftPartsList &remoteAircraftParts() const;
|
||||
|
||||
//! Destructor
|
||||
virtual ~CRemoteAircraftProviderSupportReadOnly() {}
|
||||
|
||||
protected:
|
||||
//! Constructor
|
||||
CRemoteAircraftProviderSupportReadOnly(const IRemoteAircraftProviderReadOnly *remoteAircraftProvider) : m_remoteAircraftProvider(remoteAircraftProvider) {}
|
||||
const IRemoteAircraftProviderReadOnly *m_remoteAircraftProvider = nullptr; //!< access to object
|
||||
};
|
||||
|
||||
//! Delegating class which can be directly used providing access to such an interface
|
||||
class CRemoteAircraftProviderSupport
|
||||
{
|
||||
public:
|
||||
//! \copydoc IRemoteAircraftProviderReadOnly::renderedAircraft
|
||||
virtual const CSimulatedAircraftList &remoteAircraft() const;
|
||||
|
||||
//! \copydoc IRemoteAircraftProvider::renderedAircraft
|
||||
virtual CSimulatedAircraftList &remoteAircraft();
|
||||
|
||||
//!\copydoc IRemoteAircraftProviderReadOnly::renderedAircraftSituations
|
||||
virtual const BlackMisc::Aviation::CAircraftSituationList &remoteAircraftSituations() const;
|
||||
|
||||
//!\copydoc IRemoteAircraftProvider::remoteAircraftSituations
|
||||
virtual BlackMisc::Aviation::CAircraftSituationList &remoteAircraftSituations();
|
||||
|
||||
//!\copydoc IRemoteAircraftProviderReadOnly::renderedAircraftParts
|
||||
virtual const BlackMisc::Aviation::CAircraftPartsList &remoteAircraftParts() const;
|
||||
|
||||
//!\copydoc IRemoteAircraftProvider::remoteAircraftParts
|
||||
virtual BlackMisc::Aviation::CAircraftPartsList &remoteAircraftParts();
|
||||
|
||||
//! \copydoc IRemoteAircraftProvider::updateAircraftEnabled
|
||||
virtual bool providerUpdateAircraftEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRedering, const QString &originator);
|
||||
|
||||
//! \copydoc IRemoteAircraftProvider::updateAircraftModel
|
||||
virtual bool providerUpdateAircraftModel(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Simulation::CAircraftModel &model, const QString &originator);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CRemoteAircraftProviderSupport() {}
|
||||
|
||||
protected:
|
||||
//! Constructor
|
||||
CRemoteAircraftProviderSupport(IRemoteAircraftProvider *remoteAircraftProvider) : m_remoteAircraftProvider(remoteAircraftProvider) { Q_ASSERT(remoteAircraftProvider); }
|
||||
IRemoteAircraftProvider *m_remoteAircraftProvider = nullptr; //!< access to object
|
||||
};
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
Q_DECLARE_INTERFACE(BlackMisc::Simulation::IRemoteAircraftProviderReadOnly, "IRemoteAircraftProviderReadOnly")
|
||||
Q_DECLARE_INTERFACE(BlackMisc::Simulation::IRemoteAircraftProvider, "IRemoteAircraftProvider")
|
||||
|
||||
#endif // guard
|
||||
@@ -1,85 +0,0 @@
|
||||
/* 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 "simdirectaccessrenderedaircraft.h"
|
||||
|
||||
using namespace BlackMisc::Aviation;
|
||||
|
||||
namespace BlackMisc
|
||||
{
|
||||
namespace Simulation
|
||||
{
|
||||
const CSimulatedAircraftList &CRenderedAircraftProviderSupportReadOnly::renderedAircraft() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "renderedAircraft", "No object available");
|
||||
return this->m_renderedAircraftProvider->renderedAircraft();
|
||||
}
|
||||
|
||||
const Aviation::CAircraftSituationList &CRenderedAircraftProviderSupportReadOnly::renderedAircraftSituations() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "renderedAircraftSituations", "No object available");
|
||||
return this->m_renderedAircraftProvider->renderedAircraftSituations();
|
||||
}
|
||||
|
||||
const Aviation::CAircraftPartsList &CRenderedAircraftProviderSupportReadOnly::renderedAircraftParts() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "renderedAircraftParts", "No object available");
|
||||
return this->m_renderedAircraftProvider->renderedAircraftParts();
|
||||
}
|
||||
|
||||
const CSimulatedAircraftList &CRenderedAircraftProviderSupport::renderedAircraft() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "renderedAircraft", "No object available");
|
||||
return this->m_renderedAircraftProvider->renderedAircraft();
|
||||
}
|
||||
|
||||
CSimulatedAircraftList &CRenderedAircraftProviderSupport::renderedAircraft()
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "renderedAircraft", "No object available");
|
||||
return this->m_renderedAircraftProvider->renderedAircraft();
|
||||
}
|
||||
|
||||
const CAircraftSituationList &CRenderedAircraftProviderSupport::renderedAircraftSituations() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "renderedAircraftSituations", "No object available");
|
||||
return this->m_renderedAircraftProvider->renderedAircraftSituations();
|
||||
}
|
||||
|
||||
CAircraftSituationList &CRenderedAircraftProviderSupport::renderedAircraftSituations()
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "renderedAircraftSituations", "No object available");
|
||||
return this->m_renderedAircraftProvider->renderedAircraftSituations();
|
||||
}
|
||||
|
||||
const CAircraftPartsList &CRenderedAircraftProviderSupport::renderedAircraftParts() const
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "renderedAircraftParts", "No object available");
|
||||
return this->m_renderedAircraftProvider->renderedAircraftParts();
|
||||
}
|
||||
|
||||
CAircraftPartsList &CRenderedAircraftProviderSupport::renderedAircraftParts()
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "renderedAircraftParts", "No object available");
|
||||
return this->m_renderedAircraftProvider->renderedAircraftParts();
|
||||
}
|
||||
|
||||
bool CRenderedAircraftProviderSupport::providerUpdateAircraftModel(const Aviation::CCallsign &callsign, const CAircraftModel &model, const QString &originator)
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "providerUpdateAircraftModel", "No object available");
|
||||
return this->m_renderedAircraftProvider->updateAircraftModel(callsign, model, originator);
|
||||
}
|
||||
|
||||
bool CRenderedAircraftProviderSupport::providerUpdateAircraftEnabled(const Aviation::CCallsign &callsign, bool enabledForRedering, const QString &originator)
|
||||
{
|
||||
Q_ASSERT_X(this->m_renderedAircraftProvider, "providerUpdateAircraftEnabled", "No object available");
|
||||
return this->m_renderedAircraftProvider->updateAircraftEnabled(callsign, enabledForRedering, originator);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
@@ -1,126 +0,0 @@
|
||||
/* 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_SIMDIRECTACCESSRENDEREDAIRCRAFT_H
|
||||
#define BLACKMISC_SIMDIRECTACCESSRENDEREDAIRCRAFT_H
|
||||
|
||||
#include "blackmisc/simulation/simulatedaircraftlist.h"
|
||||
#include "blackmisc/avaircraftsituationlist.h"
|
||||
#include "blackmisc/aviation/aircraftpartslist.h"
|
||||
|
||||
namespace BlackMisc
|
||||
{
|
||||
namespace Simulation
|
||||
{
|
||||
//! Direct in memory access to rendered aircraft
|
||||
class IRenderedAircraftProviderReadOnly
|
||||
{
|
||||
public:
|
||||
//! All rendered aircraft
|
||||
virtual const CSimulatedAircraftList &renderedAircraft() const = 0;
|
||||
|
||||
//! All situation (per callsign, time history)
|
||||
virtual const BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() const = 0;
|
||||
|
||||
//! Rendered aircraft situations (history) as copy
|
||||
//! \threadsafe
|
||||
virtual BlackMisc::Aviation::CAircraftSituationList getRenderedAircraftSituations() const = 0;
|
||||
|
||||
//! All parts (per callsign, time history)
|
||||
virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const = 0;
|
||||
|
||||
//! All parts (per callsign, time history) as copy
|
||||
//! \threadsafe
|
||||
virtual BlackMisc::Aviation::CAircraftPartsList getRenderedAircraftParts() const = 0;
|
||||
|
||||
//! Destructor
|
||||
virtual ~IRenderedAircraftProviderReadOnly() {}
|
||||
};
|
||||
|
||||
//! Direct in memory access to own aircraft
|
||||
class IRenderedAircraftProvider : public IRenderedAircraftProviderReadOnly
|
||||
{
|
||||
public:
|
||||
//! All rendered aircraft
|
||||
//! \note in memory reference, not thread safe
|
||||
virtual CSimulatedAircraftList &renderedAircraft() = 0;
|
||||
|
||||
//! Rendered aircraft situations (history)
|
||||
virtual BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() = 0;
|
||||
|
||||
//! All parts (per callsign, time history)
|
||||
//! \note in memory reference, not thread safe
|
||||
virtual BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() = 0;
|
||||
|
||||
//! Enable/disable rendering
|
||||
virtual bool updateAircraftEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRedering, const QString &originator) = 0;
|
||||
|
||||
//! Change model string
|
||||
virtual bool updateAircraftModel(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) = 0;
|
||||
};
|
||||
|
||||
//! Class which can be directly used providing access to such an interface
|
||||
class CRenderedAircraftProviderSupportReadOnly
|
||||
{
|
||||
public:
|
||||
//! \copydoc IRenderedAircraftProviderReadOnly::renderedAircraft
|
||||
virtual const CSimulatedAircraftList &renderedAircraft() const;
|
||||
|
||||
//!\copydoc IRenderedAircraftProviderReadOnly::renderedAircraftSituations
|
||||
virtual const BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() const;
|
||||
|
||||
//!\copydoc IRenderedAircraftProviderReadOnly::renderedAircraftParts
|
||||
virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const;
|
||||
|
||||
protected:
|
||||
//! Constructor
|
||||
CRenderedAircraftProviderSupportReadOnly(const IRenderedAircraftProviderReadOnly *renderedAircraftProvider) : m_renderedAircraftProvider(renderedAircraftProvider) {}
|
||||
const IRenderedAircraftProviderReadOnly *m_renderedAircraftProvider = nullptr; //!< access to object
|
||||
};
|
||||
|
||||
//! Delegating class which can be directly used providing access to such an interface
|
||||
class CRenderedAircraftProviderSupport
|
||||
{
|
||||
public:
|
||||
//! \copydoc IRenderedAircraftProviderReadOnly::renderedAircraft
|
||||
virtual const CSimulatedAircraftList &renderedAircraft() const;
|
||||
|
||||
//! \copydoc IRenderedAircraftProvider::renderedAircraft
|
||||
virtual CSimulatedAircraftList &renderedAircraft();
|
||||
|
||||
//!\copydoc IRenderedAircraftProviderReadOnly::renderedAircraftSituations
|
||||
virtual const BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() const;
|
||||
|
||||
//!\copydoc IRenderedAircraftProvider::renderedAircraftSituations
|
||||
virtual BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations();
|
||||
|
||||
//!\copydoc IRenderedAircraftProviderReadOnly::renderedAircraftParts
|
||||
virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const;
|
||||
|
||||
//!\copydoc IRenderedAircraftProvider::renderedAircraftParts
|
||||
virtual BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts();
|
||||
|
||||
//! \copydoc IRenderedAircraftProvider::updateAircraftEnabled
|
||||
virtual bool providerUpdateAircraftEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRedering, const QString &originator);
|
||||
|
||||
//! \copydoc IRenderedAircraftProvider::updateAircraftModel
|
||||
virtual bool providerUpdateAircraftModel(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Simulation::CAircraftModel &model, const QString &originator);
|
||||
|
||||
protected:
|
||||
//! Constructor
|
||||
CRenderedAircraftProviderSupport(IRenderedAircraftProvider *renderedAircraftProvider) : m_renderedAircraftProvider(renderedAircraftProvider) { Q_ASSERT(renderedAircraftProvider); }
|
||||
IRenderedAircraftProvider *m_renderedAircraftProvider = nullptr; //!< access to object
|
||||
};
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
#endif // guard
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Copyright (C) 2015
|
||||
* swift Project Community / Contributors
|
||||
* 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,
|
||||
@@ -7,146 +7,79 @@
|
||||
* contained in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "blackmisc/timestampobjectlist.h"
|
||||
#include "blackmisc/predicates.h"
|
||||
#include "blackmisc/avaircraftsituationlist.h"
|
||||
#include "blackmisc/aviation/aircraftpartslist.h"
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
//! \file
|
||||
|
||||
#ifndef BLACKMISC_TIMESTAMPOBJECTLIST_H
|
||||
#define BLACKMISC_TIMESTAMPOBJECTLIST_H
|
||||
|
||||
#include "blackmisc/collection.h"
|
||||
#include "blackmisc/sequence.h"
|
||||
#include <QList>
|
||||
#include <QMap>
|
||||
|
||||
namespace BlackMisc
|
||||
{
|
||||
template <class OBJ, class CONTAINER>
|
||||
ITimestampObjectList<OBJ, CONTAINER>::ITimestampObjectList()
|
||||
{ }
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
CONTAINER ITimestampObjectList<OBJ, CONTAINER>::findBefore(qint64 msSinceEpoch) const
|
||||
//! List of objects with timestamp.
|
||||
//! Such objects should implement \sa ITimestampBased
|
||||
template<class OBJ, class CONTAINER>
|
||||
class ITimestampObjectList
|
||||
{
|
||||
return this->container().findBy([&](const OBJ & obj)
|
||||
{
|
||||
return obj.isOlderThan(msSinceEpoch);
|
||||
});
|
||||
}
|
||||
public:
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
CONTAINER ITimestampObjectList<OBJ, CONTAINER>::findBeforeNowMinusOffset(qint64 msOffset) const
|
||||
{
|
||||
return this->findBefore(QDateTime::currentMSecsSinceEpoch() - msOffset);
|
||||
}
|
||||
//! List of objects before dateTime
|
||||
CONTAINER findBefore(const QDateTime &dateTime) const;
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
CONTAINER ITimestampObjectList<OBJ, CONTAINER>::findBefore(const QDateTime &dateTime) const
|
||||
{
|
||||
return this->findBefore(dateTime.toMSecsSinceEpoch());
|
||||
}
|
||||
//! List of objects before msSinceEpoch
|
||||
CONTAINER findBefore(qint64 msSinceEpoch) const;
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
CONTAINER ITimestampObjectList<OBJ, CONTAINER>::findAfter(qint64 msSinceEpoc) const
|
||||
{
|
||||
return this->container().findBy([&](const OBJ & obj)
|
||||
{
|
||||
return obj.isNewerThan(msSinceEpoc);
|
||||
});
|
||||
}
|
||||
//! List of objects before now - offset
|
||||
CONTAINER findBeforeNowMinusOffset(qint64 msOffset) const;
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
QList<CONTAINER> ITimestampObjectList<OBJ, CONTAINER>::splitByTime(qint64 msSinceEpoch) const
|
||||
{
|
||||
CONTAINER newer(this->container());
|
||||
newer.sortLatestFirst();
|
||||
CONTAINER older;
|
||||
for (auto it = newer.begin(); it != newer.end(); ++it)
|
||||
{
|
||||
if (it->isOlderThan(msSinceEpoch))
|
||||
{
|
||||
// better "move", ?? std::make_move_iterator
|
||||
older.insert(CRange<CONTAINER::iterator>(it, newer.end()));
|
||||
newer.erase(it, newer.end());
|
||||
break;
|
||||
}
|
||||
}
|
||||
//! List of objects after dateTime
|
||||
CONTAINER findAfter(const QDateTime &dateTime) const;
|
||||
|
||||
// before / after
|
||||
return QList<CONTAINER>({newer, older});
|
||||
}
|
||||
//! List of objects after msSinceEpoch
|
||||
CONTAINER findAfter(qint64 msSinceEpoch) const;
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
OBJ ITimestampObjectList<OBJ, CONTAINER>::latestValue() const
|
||||
{
|
||||
if (this->container().isEmpty()) { return OBJ(); }
|
||||
CONTAINER container(container()); // copy
|
||||
container.sortLatestFirst();
|
||||
return container.front();
|
||||
}
|
||||
//! Split into 2 containers, [0] >= msSinceEpoch ("newer") [b] < msSinceEpoch ("older")
|
||||
//! \note Sort order: latest elements first
|
||||
QList<CONTAINER> splitByTime(qint64 msSinceEpoch) const;
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
OBJ ITimestampObjectList<OBJ, CONTAINER>::oldestValue() const
|
||||
{
|
||||
if (this->container().isEmpty()) { return OBJ(); }
|
||||
CONTAINER container(container()); // copy
|
||||
container.sortLatestFirst();
|
||||
return container.back();
|
||||
}
|
||||
//! Latest value
|
||||
OBJ latestValue() const;
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
CONTAINER ITimestampObjectList<OBJ, CONTAINER>::findAfter(const QDateTime &dateTime) const
|
||||
{
|
||||
return this->findAfter(dateTime.toMSecsSinceEpoch());
|
||||
}
|
||||
//! Latest value
|
||||
OBJ oldestValue() const;
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
void ITimestampObjectList<OBJ, CONTAINER>::removeBefore(const QDateTime &dateTime)
|
||||
{
|
||||
this->removeBefore(dateTime.toMSecsSinceEpoch());
|
||||
}
|
||||
//! Remove objects with timestamp before dateTime
|
||||
void removeBefore(const QDateTime &dateTime);
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
void ITimestampObjectList<OBJ, CONTAINER>::removeBefore(qint64 msSinceEpoc)
|
||||
{
|
||||
this->container().removeIf([&](const OBJ & obj)
|
||||
{
|
||||
return obj.isOlderThan(msSinceEpoc);
|
||||
});
|
||||
}
|
||||
//! Remove objects with timestamp before dateTime
|
||||
void removeBefore(qint64 msSinceEpoch);
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
void ITimestampObjectList<OBJ, CONTAINER>::removeOlderThanNowMinusOffset(int offsetMs)
|
||||
{
|
||||
const qint64 epoch = QDateTime::currentMSecsSinceEpoch() - offsetMs;
|
||||
this->container().removeIf([&](const OBJ & obj)
|
||||
{
|
||||
return obj.isOlderThan(epoch);
|
||||
});
|
||||
}
|
||||
//! Remove objects older than seconds
|
||||
void removeOlderThanNowMinusOffset(int offsetMs);
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
void ITimestampObjectList<OBJ, CONTAINER>::sortLatestFirst()
|
||||
{
|
||||
this->container().sortOldestFirst();
|
||||
std::reverse(this->container().begin(), this->container().end());
|
||||
}
|
||||
//! Sort by timestamp
|
||||
void sortLatestFirst();
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
void ITimestampObjectList<OBJ, CONTAINER>::sortOldestFirst()
|
||||
{
|
||||
this->container().sort(BlackMisc::Predicates::MemberLess(&OBJ::getMSecsSinceEpoch));
|
||||
}
|
||||
//! Sort by timestamp
|
||||
void sortOldestFirst();
|
||||
|
||||
template <class OBJ, class CONTAINER>
|
||||
void ITimestampObjectList<OBJ, CONTAINER>::insertTimestampObject(const OBJ &object, int maxElements)
|
||||
{
|
||||
Q_ASSERT(maxElements > 1);
|
||||
if (this->container().size() >= (maxElements - 1))
|
||||
{
|
||||
this->container().truncate(maxElements - 1);
|
||||
}
|
||||
this->container().insert_front(object);
|
||||
}
|
||||
//! Inserts as first object by keeping max. elements
|
||||
void insertTimestampObject(const OBJ &object, int maxElements);
|
||||
|
||||
// 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<BlackMisc::Aviation::CAircraftSituation, BlackMisc::Aviation::CAircraftSituationList>;
|
||||
template class ITimestampObjectList<BlackMisc::Aviation::CAircraftParts, BlackMisc::Aviation::CAircraftPartsList>;
|
||||
protected:
|
||||
//! Constructor
|
||||
ITimestampObjectList();
|
||||
|
||||
} // namespace
|
||||
//! Container
|
||||
virtual const CONTAINER &container() const = 0;
|
||||
|
||||
//! Container
|
||||
virtual CONTAINER &container() = 0;
|
||||
};
|
||||
|
||||
} //namespace
|
||||
|
||||
#endif //guard
|
||||
|
||||
Reference in New Issue
Block a user