From 5e38936fd2a06c7c4f8de3030b2ad0a1abd08170 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Fri, 24 Aug 2018 15:25:47 +0200 Subject: [PATCH] Fix weak vtables --- .../components/dbmappingcomponentaware.h | 5 ++++ .../components/enablefordockwidgetinfoarea.h | 3 +++ src/blackgui/dropbase.cpp | 3 +++ src/blackgui/dropbase.h | 6 ++--- src/blackgui/menus/aircraftmodelmenus.cpp | 3 +++ src/blackgui/menus/aircraftmodelmenus.h | 2 ++ src/blackmisc/geo/coordinategeodetic.cpp | 3 +++ src/blackmisc/geo/coordinategeodetic.h | 2 +- src/blackmisc/jsonexception.cpp | 4 ++++ src/blackmisc/jsonexception.h | 2 ++ src/blackmisc/network/clientprovider.cpp | 4 ++++ src/blackmisc/network/clientprovider.h | 2 ++ src/blackmisc/network/ecosystemprovider.cpp | 4 ++++ src/blackmisc/network/ecosystemprovider.h | 2 ++ src/blackmisc/pq/units.cpp | 23 +++++++++++++++++++ src/blackmisc/pq/units.h | 14 +++++++++++ src/blackmisc/provider.cpp | 16 +++++++++++++ src/blackmisc/provider.h | 4 ++-- .../simulation/interpolationsetupprovider.cpp | 4 ++++ .../simulation/interpolationsetupprovider.h | 2 ++ .../simulation/interpolatorlinear.cpp | 3 +++ src/blackmisc/simulation/interpolatorlinear.h | 2 ++ .../simulation/interpolatorspline.cpp | 4 ++++ src/blackmisc/simulation/interpolatorspline.h | 2 ++ .../simulation/ownaircraftprovider.cpp | 4 ++++ .../simulation/ownaircraftprovider.h | 2 ++ .../simulation/remoteaircraftprovider.cpp | 6 +++++ .../simulation/remoteaircraftprovider.h | 4 ++-- .../simulationenvironmentprovider.cpp | 4 ++++ .../simulationenvironmentprovider.h | 2 ++ 30 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 src/blackmisc/provider.cpp diff --git a/src/blackgui/components/dbmappingcomponentaware.h b/src/blackgui/components/dbmappingcomponentaware.h index 3491af9f0..67dd319a5 100644 --- a/src/blackgui/components/dbmappingcomponentaware.h +++ b/src/blackgui/components/dbmappingcomponentaware.h @@ -25,6 +25,8 @@ namespace BlackGui class BLACKGUI_EXPORT CDbMappingComponentAware { public: + + //! Set the corresponding component virtual void setMappingComponent(CDbMappingComponent *component); @@ -35,6 +37,9 @@ namespace BlackGui //! Constructor CDbMappingComponentAware(QObject *parent); + //! Destructor + virtual ~CDbMappingComponentAware() {} + private : CDbMappingComponent *m_mappingComponent = nullptr; //!< reference to component }; diff --git a/src/blackgui/components/enablefordockwidgetinfoarea.h b/src/blackgui/components/enablefordockwidgetinfoarea.h index 8cab47be0..e2efe0c3a 100644 --- a/src/blackgui/components/enablefordockwidgetinfoarea.h +++ b/src/blackgui/components/enablefordockwidgetinfoarea.h @@ -63,6 +63,9 @@ namespace BlackGui //! \remarks Normally the info area will be provided later \sa setParentDockWidgetInfoArea CEnableForDockWidgetInfoArea(CDockWidgetInfoArea *parentInfoArea = nullptr); + // Destructor + virtual ~CEnableForDockWidgetInfoArea() {} + private: BlackGui::CDockWidgetInfoArea *m_parentDockableInfoArea = nullptr; //!< my parent dockable widget BlackMisc::CConnectionGuard m_connections; diff --git a/src/blackgui/dropbase.cpp b/src/blackgui/dropbase.cpp index 9dcaad5c7..e7cd1e603 100644 --- a/src/blackgui/dropbase.cpp +++ b/src/blackgui/dropbase.cpp @@ -21,6 +21,9 @@ namespace BlackGui CDropBase::CDropBase() { } + CDropBase::~CDropBase() + { } + void CDropBase::setAcceptedMetaTypeIds(const QList &ids) { m_acceptedMetaTypes = ids; diff --git a/src/blackgui/dropbase.h b/src/blackgui/dropbase.h index 97434e921..2fe77a1e2 100644 --- a/src/blackgui/dropbase.h +++ b/src/blackgui/dropbase.h @@ -24,6 +24,9 @@ namespace BlackGui class BLACKGUI_EXPORT CDropBase { public: + //! Dtor + virtual ~CDropBase(); + //! Accepted ids void setAcceptedMetaTypeIds(const QList &ids); @@ -48,9 +51,6 @@ namespace BlackGui //! Mime data to CVariant (normally encapsulating a value object) BlackMisc::CVariant toCVariant(const QMimeData *mime) const; - //! Dtor - virtual ~CDropBase() {} - protected: //! Ctor CDropBase(); diff --git a/src/blackgui/menus/aircraftmodelmenus.cpp b/src/blackgui/menus/aircraftmodelmenus.cpp index 9d377602d..718b1d947 100644 --- a/src/blackgui/menus/aircraftmodelmenus.cpp +++ b/src/blackgui/menus/aircraftmodelmenus.cpp @@ -34,6 +34,9 @@ namespace BlackGui { namespace Menus { + void IAircraftModelViewMenu::anchor() + { } + const CLogCategoryList &IAircraftModelViewMenu::getLogCategories() { static const CLogCategoryList cats { CLogCategory::guiComponent() }; diff --git a/src/blackgui/menus/aircraftmodelmenus.h b/src/blackgui/menus/aircraftmodelmenus.h index bb01332c0..99667d6eb 100644 --- a/src/blackgui/menus/aircraftmodelmenus.h +++ b/src/blackgui/menus/aircraftmodelmenus.h @@ -28,6 +28,8 @@ namespace BlackGui //! Menu base class for aircraft model view menus class IAircraftModelViewMenu : public IMenuDelegate { + virtual void anchor(); + public: //! Constructor IAircraftModelViewMenu(BlackGui::Views::CAircraftModelView *modelView, bool separator = true) : diff --git a/src/blackmisc/geo/coordinategeodetic.cpp b/src/blackmisc/geo/coordinategeodetic.cpp index 5a20942f0..926dfc3a5 100644 --- a/src/blackmisc/geo/coordinategeodetic.cpp +++ b/src/blackmisc/geo/coordinategeodetic.cpp @@ -25,6 +25,9 @@ namespace BlackMisc { namespace Geo { + ICoordinateGeodetic::~ICoordinateGeodetic() + { } + QString CCoordinateGeodetic::convertToQString(bool i18n) const { return ICoordinateGeodetic::convertToQString(i18n); diff --git a/src/blackmisc/geo/coordinategeodetic.h b/src/blackmisc/geo/coordinategeodetic.h index 3956dcc1d..1f3e55221 100644 --- a/src/blackmisc/geo/coordinategeodetic.h +++ b/src/blackmisc/geo/coordinategeodetic.h @@ -56,7 +56,7 @@ namespace BlackMisc }; //! Destructor - virtual ~ICoordinateGeodetic() {} + virtual ~ICoordinateGeodetic(); //! Latitude virtual CLatitude latitude() const = 0; diff --git a/src/blackmisc/jsonexception.cpp b/src/blackmisc/jsonexception.cpp index f2c8f10ed..d9c900ab4 100644 --- a/src/blackmisc/jsonexception.cpp +++ b/src/blackmisc/jsonexception.cpp @@ -24,6 +24,10 @@ namespace BlackMisc return stack.localData(); } + // pin vtables to this file + void CJsonException::anchor() + { } + CStatusMessage CJsonException::toStatusMessage(const CLogCategoryList &categories, const QString &prefix) const { return CStatusMessage(categories).validationError(toString(prefix)); diff --git a/src/blackmisc/jsonexception.h b/src/blackmisc/jsonexception.h index da631ac10..6ea18998e 100644 --- a/src/blackmisc/jsonexception.h +++ b/src/blackmisc/jsonexception.h @@ -26,6 +26,8 @@ namespace BlackMisc */ class BLACKMISC_EXPORT CJsonException : public std::runtime_error { + virtual void anchor(); + public: //! Constructor. explicit CJsonException(const QString &message) : std::runtime_error(message.toStdString()) {} diff --git a/src/blackmisc/network/clientprovider.cpp b/src/blackmisc/network/clientprovider.cpp index 6dd7e1096..c06623273 100644 --- a/src/blackmisc/network/clientprovider.cpp +++ b/src/blackmisc/network/clientprovider.cpp @@ -132,6 +132,10 @@ namespace BlackMisc return true; } + // Pin the vtable to this file + void CClientAware::anchor() + { } + CClientList CClientAware::getClients() const { if (this->provider()) { return this->provider()->getClients(); } diff --git a/src/blackmisc/network/clientprovider.h b/src/blackmisc/network/clientprovider.h index 5d79c0cfd..2acdfe807 100644 --- a/src/blackmisc/network/clientprovider.h +++ b/src/blackmisc/network/clientprovider.h @@ -109,6 +109,8 @@ namespace BlackMisc //! Class which can be directly used to access an \sa IClientProvider object class BLACKMISC_EXPORT CClientAware : public IProviderAware { + virtual void anchor(); + public: //! \copydoc CClientProvider::getClients CClientList getClients() const; diff --git a/src/blackmisc/network/ecosystemprovider.cpp b/src/blackmisc/network/ecosystemprovider.cpp index d76aa876c..583db5647 100644 --- a/src/blackmisc/network/ecosystemprovider.cpp +++ b/src/blackmisc/network/ecosystemprovider.cpp @@ -57,6 +57,10 @@ namespace BlackMisc return true; } + // pin vtable to this file + void CEcosystemAware::anchor() + { } + CEcosystem CEcosystemAware::getCurrentEcosystem() const { if (!this->hasProvider()) { return CEcosystem::unspecified(); } diff --git a/src/blackmisc/network/ecosystemprovider.h b/src/blackmisc/network/ecosystemprovider.h index 247428eb2..0e5450036 100644 --- a/src/blackmisc/network/ecosystemprovider.h +++ b/src/blackmisc/network/ecosystemprovider.h @@ -63,6 +63,8 @@ namespace BlackMisc //! Delegating class which can be directly used to access an \sa IEcosystemProvider instance class BLACKMISC_EXPORT CEcosystemAware : public IProviderAware { + virtual void anchor(); + public: //! Set the provider void setEcosystemProvider(IEcosystemProvider *provider) { this->setProvider(provider); } diff --git a/src/blackmisc/pq/units.cpp b/src/blackmisc/pq/units.cpp index 0401438e9..ea317e74b 100644 --- a/src/blackmisc/pq/units.cpp +++ b/src/blackmisc/pq/units.cpp @@ -18,6 +18,29 @@ namespace BlackMisc { using BlackMisc::Math::CMathUtils; + // pin vtables to this file + + void CLengthUnit::anchor() + { } + + void CFrequencyUnit::anchor() + { } + + void CMassUnit::anchor() + { } + + void CPressureUnit::anchor() + { } + + void CTemperatureUnit::anchor() + { } + + void CSpeedUnit::anchor() + { } + + void CAccelerationUnit::anchor() + { } + QString CAngleUnit::makeRoundedQStringWithUnit(double value, int digits, bool i18n) const { if (digits < 0) digits = this->getDisplayDigits(); diff --git a/src/blackmisc/pq/units.h b/src/blackmisc/pq/units.h index a2347c6d9..c44e8c4ac 100644 --- a/src/blackmisc/pq/units.h +++ b/src/blackmisc/pq/units.h @@ -56,6 +56,8 @@ namespace BlackMisc struct StatuteMilesToMeters { static double factor() { return 1609.3472; } }; using MetersToMeters = One; + virtual void anchor(); + public: //! Base type using base_type = CMeasurementUnit; @@ -271,6 +273,8 @@ namespace BlackMisc using HertzToHertz = One; + virtual void anchor(); + public: //! Base type using base_type = CMeasurementUnit; @@ -362,6 +366,8 @@ namespace BlackMisc using GramsToKilograms = Milli; struct PoundsToKilograms { static double factor() { return 0.45359237; } }; + virtual void anchor(); + public: //! Base type using base_type = CMeasurementUnit; @@ -464,6 +470,8 @@ namespace BlackMisc struct InchesToHectopascals { static double factor() { return 33.86389; } }; struct MillimetersToHectopascals { static double factor() { return 860.142806; } }; + virtual void anchor(); + public: //! Base type using base_type = CMeasurementUnit; @@ -589,6 +597,8 @@ namespace BlackMisc static double offset() { return 32.0; } }; + virtual void anchor(); + public: //! Base type using base_type = CMeasurementUnit; @@ -673,6 +683,8 @@ namespace BlackMisc struct FtPerSecToMps { static double factor() { return 0.3048 ; } }; struct FtPerMinToMps { static double factor() { return 0.3048 / 60.0; } }; + virtual void anchor(); + public: //! Base type using base_type = CMeasurementUnit; @@ -918,6 +930,8 @@ namespace BlackMisc struct FeetToMeters { static double factor() { return 0.3048; } }; + virtual void anchor(); + public: //! Base type using base_type = CMeasurementUnit; diff --git a/src/blackmisc/provider.cpp b/src/blackmisc/provider.cpp new file mode 100644 index 000000000..8c5dfa696 --- /dev/null +++ b/src/blackmisc/provider.cpp @@ -0,0 +1,16 @@ +/* Copyright (C) 2018 + * 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/provider.h" + +namespace BlackMisc +{ + IProvider::~IProvider() + { } +} diff --git a/src/blackmisc/provider.h b/src/blackmisc/provider.h index ec25cce43..33fc703cd 100644 --- a/src/blackmisc/provider.h +++ b/src/blackmisc/provider.h @@ -20,11 +20,11 @@ namespace BlackMisc { //! Base class for providers - class IProvider + class BLACKMISC_EXPORT IProvider { public: //! Dtor - virtual ~IProvider() {} + virtual ~IProvider(); //! Return as QObject virtual QObject *asQObject() { return nullptr; } diff --git a/src/blackmisc/simulation/interpolationsetupprovider.cpp b/src/blackmisc/simulation/interpolationsetupprovider.cpp index 95e508219..4a28d95bc 100644 --- a/src/blackmisc/simulation/interpolationsetupprovider.cpp +++ b/src/blackmisc/simulation/interpolationsetupprovider.cpp @@ -197,6 +197,10 @@ namespace BlackMisc return m_setups; } + // pin vtables to this file + void CInterpolationSetupAware::anchor() + { } + CInterpolationAndRenderingSetupPerCallsign CInterpolationSetupAware::getInterpolationSetupPerCallsignOrDefault(const CCallsign &callsign) const { if (!this->hasProvider()) { return CInterpolationAndRenderingSetupPerCallsign(); } diff --git a/src/blackmisc/simulation/interpolationsetupprovider.h b/src/blackmisc/simulation/interpolationsetupprovider.h index 6cccb35a9..3a1488291 100644 --- a/src/blackmisc/simulation/interpolationsetupprovider.h +++ b/src/blackmisc/simulation/interpolationsetupprovider.h @@ -110,6 +110,8 @@ namespace BlackMisc //! Class which can be directly used to access an \sa IInterpolationSetupProvider object class BLACKMISC_EXPORT CInterpolationSetupAware : public IProviderAware { + virtual void anchor(); + public: //! \copydoc IInterpolationSetupProvider::getInterpolationSetupPerCallsignOrDefault CInterpolationAndRenderingSetupPerCallsign getInterpolationSetupPerCallsignOrDefault(const Aviation::CCallsign &callsign) const; diff --git a/src/blackmisc/simulation/interpolatorlinear.cpp b/src/blackmisc/simulation/interpolatorlinear.cpp index 3c407ece1..dfe1beaa1 100644 --- a/src/blackmisc/simulation/interpolatorlinear.cpp +++ b/src/blackmisc/simulation/interpolatorlinear.cpp @@ -54,6 +54,9 @@ namespace BlackMisc m_pbh = CInterpolatorPbh(m_simulationTimeFraction, situation1, situation2); } + void CInterpolatorLinear::anchor() + { } + CAircraftSituation CInterpolatorLinear::CInterpolant::interpolatePositionAndAltitude(const CAircraftSituation &situation, bool interpolateGndFactor) const { const std::array oldVec(m_oldSituation.getPosition().normalVectorDouble()); diff --git a/src/blackmisc/simulation/interpolatorlinear.h b/src/blackmisc/simulation/interpolatorlinear.h index c160f892a..17d4783fa 100644 --- a/src/blackmisc/simulation/interpolatorlinear.h +++ b/src/blackmisc/simulation/interpolatorlinear.h @@ -30,6 +30,8 @@ namespace BlackMisc //! Linear interpolator, calculation inbetween positions class BLACKMISC_EXPORT CInterpolatorLinear : public CInterpolator { + virtual void anchor(); + public: //! Constructor CInterpolatorLinear(const Aviation::CCallsign &callsign, diff --git a/src/blackmisc/simulation/interpolatorspline.cpp b/src/blackmisc/simulation/interpolatorspline.cpp index 3e478624c..0b987e84c 100644 --- a/src/blackmisc/simulation/interpolatorspline.cpp +++ b/src/blackmisc/simulation/interpolatorspline.cpp @@ -142,6 +142,10 @@ namespace BlackMisc return true; } + // pin vtables to this file + void CInterpolatorSpline::anchor() + { } + CInterpolatorSpline::CInterpolant CInterpolatorSpline::getInterpolant(SituationLog &log) { // recalculate derivatives only if they changed diff --git a/src/blackmisc/simulation/interpolatorspline.h b/src/blackmisc/simulation/interpolatorspline.h index 8a44fac58..1e0fb35d4 100644 --- a/src/blackmisc/simulation/interpolatorspline.h +++ b/src/blackmisc/simulation/interpolatorspline.h @@ -27,6 +27,8 @@ namespace BlackMisc //! Cubic spline interpolator class BLACKMISC_EXPORT CInterpolatorSpline : public CInterpolator { + virtual void anchor(); + public: //! Constructor CInterpolatorSpline(const Aviation::CCallsign &callsign, diff --git a/src/blackmisc/simulation/ownaircraftprovider.cpp b/src/blackmisc/simulation/ownaircraftprovider.cpp index a2bed3d44..b7261c1c4 100644 --- a/src/blackmisc/simulation/ownaircraftprovider.cpp +++ b/src/blackmisc/simulation/ownaircraftprovider.cpp @@ -24,6 +24,10 @@ namespace BlackMisc return changed1 || changed2; } + // pin vtables to this file + void COwnAircraftAware::anchor() + { } + CSimulatedAircraft COwnAircraftAware::getOwnAircraft() const { Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); diff --git a/src/blackmisc/simulation/ownaircraftprovider.h b/src/blackmisc/simulation/ownaircraftprovider.h index 3e908e54b..db44d7143 100644 --- a/src/blackmisc/simulation/ownaircraftprovider.h +++ b/src/blackmisc/simulation/ownaircraftprovider.h @@ -111,6 +111,8 @@ namespace BlackMisc //! Delegating class which can be directly used to access an \sa IOwnAircraftProvider instance class BLACKMISC_EXPORT COwnAircraftAware : public IProviderAware { + virtual void anchor(); + public: //! Set the provider void setOwnAircraftProvider(IOwnAircraftProvider *provider) { this->setProvider(provider); } diff --git a/src/blackmisc/simulation/remoteaircraftprovider.cpp b/src/blackmisc/simulation/remoteaircraftprovider.cpp index b03236e74..aca5f18f3 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.cpp +++ b/src/blackmisc/simulation/remoteaircraftprovider.cpp @@ -24,6 +24,9 @@ namespace BlackMisc { namespace Simulation { + IRemoteAircraftProvider::~IRemoteAircraftProvider() + { } + const CLogCategoryList &CRemoteAircraftProvider::getLogCategories() { static const CLogCategoryList cats { CLogCategory::matching(), CLogCategory::network() }; @@ -756,6 +759,9 @@ namespace BlackMisc return removedCallsign; } + CRemoteAircraftAware::~CRemoteAircraftAware() + { } + CSimulatedAircraftList CRemoteAircraftAware::getAircraftInRange() const { Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); diff --git a/src/blackmisc/simulation/remoteaircraftprovider.h b/src/blackmisc/simulation/remoteaircraftprovider.h index 5c1e4dbd3..a6aabe7d5 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.h +++ b/src/blackmisc/simulation/remoteaircraftprovider.h @@ -52,7 +52,7 @@ namespace BlackMisc static constexpr int DefaultOffsetTimeMs = 6000; //!< \fixme copied from CNetworkVatlib::c_positionTimeOffsetMsec //! Destructor - virtual ~IRemoteAircraftProvider() {} + virtual ~IRemoteAircraftProvider(); //! All remote aircraft //! \threadsafe @@ -449,7 +449,7 @@ namespace BlackMisc { public: //! Destructor - virtual ~CRemoteAircraftAware() {} + virtual ~CRemoteAircraftAware(); //! \copydoc IRemoteAircraftProvider::getAircraftInRange CSimulatedAircraftList getAircraftInRange() const; diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.cpp b/src/blackmisc/simulation/simulationenvironmentprovider.cpp index 341ce1e18..2e52f5f0f 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.cpp +++ b/src/blackmisc/simulation/simulationenvironmentprovider.cpp @@ -344,6 +344,10 @@ namespace BlackMisc this->resetSimulationEnvironmentStatistics(); } + // pin vtables to this file + void CSimulationEnvironmentAware::anchor() + { } + CElevationPlane CSimulationEnvironmentAware::findClosestElevationWithinRange(const ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range) const { if (!this->hasProvider()) { return CElevationPlane::null(); } diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.h b/src/blackmisc/simulation/simulationenvironmentprovider.h index 0e2f4b676..884c3ba70 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.h +++ b/src/blackmisc/simulation/simulationenvironmentprovider.h @@ -216,6 +216,8 @@ namespace BlackMisc //! Class which can be directly used to access an \sa ISimulationEnvironmentProvider object class BLACKMISC_EXPORT CSimulationEnvironmentAware : public IProviderAware { + virtual void anchor(); + public: //! Set the provider void setSimulationEnvironmentProvider(ISimulationEnvironmentProvider *provider) { this->setProvider(provider); }