diff --git a/samples/blackmisc/samplescontainer.cpp b/samples/blackmisc/samplescontainer.cpp index e8f7fe764..de6a2345f 100644 --- a/samples/blackmisc/samplescontainer.cpp +++ b/samples/blackmisc/samplescontainer.cpp @@ -14,7 +14,7 @@ #include "blackmisc/aviation/atcstation.h" #include "blackmisc/aviation/atcstationlist.h" #include "blackmisc/aviation/callsign.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/geo/coordinategeodetic.h" #include "blackmisc/network/user.h" #include "blackmisc/pq/frequency.h" diff --git a/samples/blackmiscquantities/samplesaviation.cpp b/samples/blackmiscquantities/samplesaviation.cpp index 5def4a772..f6fdea1c9 100644 --- a/samples/blackmiscquantities/samplesaviation.cpp +++ b/samples/blackmiscquantities/samplesaviation.cpp @@ -19,7 +19,7 @@ #include "blackmisc/aviation/heading.h" #include "blackmisc/aviation/navsystem.h" #include "blackmisc/aviation/transponder.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/geo/coordinategeodetic.h" #include "blackmisc/network/user.h" #include "blackmisc/pq/frequency.h" diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index 41aec4fd4..6cb323587 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -26,7 +26,7 @@ #include "blackmisc/network/voicecapabilities.h" #include "blackmisc/pq/units.h" #include "blackmisc/test/testing.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/iterator.h" #include "blackmisc/logmessage.h" #include "blackmisc/propertyindexvariantmap.h" diff --git a/src/blackcore/context/contextapplication.h b/src/blackcore/context/contextapplication.h index 2c76cb080..ebd8eec39 100644 --- a/src/blackcore/context/contextapplication.h +++ b/src/blackcore/context/contextapplication.h @@ -14,7 +14,7 @@ #include "blackcore/blackcoreexport.h" #include "blackcore/context/context.h" #include "blackcore/corefacadeconfig.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/dictionary.h" #include "blackmisc/identifier.h" #include "blackmisc/identifierlist.h" diff --git a/src/blackcore/context/contextownaircraftimpl.cpp b/src/blackcore/context/contextownaircraftimpl.cpp index fe3d8e6cb..825205dce 100644 --- a/src/blackcore/context/contextownaircraftimpl.cpp +++ b/src/blackcore/context/contextownaircraftimpl.cpp @@ -30,7 +30,7 @@ #include "blackmisc/pq/physicalquantity.h" #include "blackmisc/pq/units.h" #include "blackmisc/simplecommandparser.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/dbusserver.h" #include "blackmisc/logcategory.h" #include "blackmisc/logmessage.h" diff --git a/src/blackcore/context/contextsimulatorimpl.cpp b/src/blackcore/context/contextsimulatorimpl.cpp index 6ff9247a5..a76ee35c8 100644 --- a/src/blackcore/context/contextsimulatorimpl.cpp +++ b/src/blackcore/context/contextsimulatorimpl.cpp @@ -25,7 +25,7 @@ #include "blackmisc/aviation/logutils.h" #include "blackmisc/aviation/callsign.h" #include "blackmisc/pq/units.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/dbusserver.h" #include "blackmisc/simplecommandparser.h" #include "blackmisc/logcategory.h" diff --git a/src/blackcore/inputmanager.cpp b/src/blackcore/inputmanager.cpp index 1a701a5f9..1c8ab9499 100644 --- a/src/blackcore/inputmanager.cpp +++ b/src/blackcore/inputmanager.cpp @@ -7,7 +7,7 @@ */ #include "blackcore/inputmanager.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/dictionary.h" #include "blackmisc/input/actionhotkey.h" #include "blackmisc/range.h" diff --git a/src/blackcore/setupreader.cpp b/src/blackcore/setupreader.cpp index 0658250a0..398458283 100644 --- a/src/blackcore/setupreader.cpp +++ b/src/blackcore/setupreader.cpp @@ -9,7 +9,7 @@ #include "blackcore/application.h" #include "blackcore/setupreader.h" #include "blackmisc/verify.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/fileutils.h" #include "blackmisc/swiftdirectories.h" #include "blackmisc/directoryutils.h" diff --git a/src/blackcore/vatsim/vatsimdatafilereader.cpp b/src/blackcore/vatsim/vatsimdatafilereader.cpp index 6b59936bb..740da5fdc 100644 --- a/src/blackcore/vatsim/vatsimdatafilereader.cpp +++ b/src/blackcore/vatsim/vatsimdatafilereader.cpp @@ -22,7 +22,7 @@ #include "blackmisc/pq/speed.h" #include "blackmisc/pq/units.h" #include "blackmisc/logmessage.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/predicates.h" #include "blackmisc/range.h" #include "blackmisc/simulation/simulatedaircraft.h" diff --git a/src/blackcore/vatsim/vatsimmetarreader.cpp b/src/blackcore/vatsim/vatsimmetarreader.cpp index 8b6eebdf4..94c64239a 100644 --- a/src/blackcore/vatsim/vatsimmetarreader.cpp +++ b/src/blackcore/vatsim/vatsimmetarreader.cpp @@ -8,7 +8,7 @@ #include "blackcore/vatsim/vatsimmetarreader.h" #include "blackcore/application.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/logmessage.h" #include "blackmisc/network/entityflags.h" #include "blackmisc/network/url.h" diff --git a/src/blackgui/components/atcstationcomponent.cpp b/src/blackgui/components/atcstationcomponent.cpp index 08dc8b595..dd908b0c7 100644 --- a/src/blackgui/components/atcstationcomponent.cpp +++ b/src/blackgui/components/atcstationcomponent.cpp @@ -22,7 +22,7 @@ #include "blackmisc/aviation/atcstationlist.h" #include "blackmisc/aviation/informationmessage.h" #include "blackmisc/weather/metar.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icons.h" #include "blackmisc/logmessage.h" #include "ui_atcstationcomponent.h" diff --git a/src/blackgui/components/colorselector.cpp b/src/blackgui/components/colorselector.cpp index acce1dbee..4b9dbe636 100644 --- a/src/blackgui/components/colorselector.cpp +++ b/src/blackgui/components/colorselector.cpp @@ -8,7 +8,7 @@ #include "blackgui/components/colorselector.h" #include "blackgui/guiutility.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icons.h" #include "blackmisc/rgbcolor.h" #include "blackmisc/variant.h" diff --git a/src/blackgui/components/dbaircrafticaoselectorcomponent.cpp b/src/blackgui/components/dbaircrafticaoselectorcomponent.cpp index 7c23ff0d7..94e6b2c78 100644 --- a/src/blackgui/components/dbaircrafticaoselectorcomponent.cpp +++ b/src/blackgui/components/dbaircrafticaoselectorcomponent.cpp @@ -14,7 +14,7 @@ #include "blackgui/uppercasevalidator.h" #include "blackmisc/aviation/aircrafticaocodelist.h" #include "blackmisc/db/datastoreutility.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/stringutils.h" #include "blackmisc/variant.h" diff --git a/src/blackgui/components/dbairlineicaoselectorbase.cpp b/src/blackgui/components/dbairlineicaoselectorbase.cpp index c6680b6ce..225cccca6 100644 --- a/src/blackgui/components/dbairlineicaoselectorbase.cpp +++ b/src/blackgui/components/dbairlineicaoselectorbase.cpp @@ -11,7 +11,7 @@ #include "blackcore/webdataservices.h" #include "blackmisc/aviation/airlineicaocodelist.h" #include "blackmisc/db/datastoreutility.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/variant.h" #include diff --git a/src/blackgui/components/dbcountryselectorcomponent.cpp b/src/blackgui/components/dbcountryselectorcomponent.cpp index c89b9853f..bdf54b319 100644 --- a/src/blackgui/components/dbcountryselectorcomponent.cpp +++ b/src/blackgui/components/dbcountryselectorcomponent.cpp @@ -10,7 +10,7 @@ #include "blackgui/components/dbcountryselectorcomponent.h" #include "blackgui/guiapplication.h" #include "blackgui/uppercasevalidator.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/countrylist.h" #include "blackmisc/variant.h" #include "ui_dbcountryselectorcomponent.h" diff --git a/src/blackgui/components/dbdistributorselectorcomponent.cpp b/src/blackgui/components/dbdistributorselectorcomponent.cpp index ee9140cae..16f4c125a 100644 --- a/src/blackgui/components/dbdistributorselectorcomponent.cpp +++ b/src/blackgui/components/dbdistributorselectorcomponent.cpp @@ -11,7 +11,7 @@ #include "blackgui/components/dbdistributorselectorcomponent.h" #include "blackgui/guiapplication.h" #include "blackgui/uppercasevalidator.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/simulation/distributorlist.h" #include "blackmisc/variant.h" #include "ui_dbdistributorselectorcomponent.h" diff --git a/src/blackgui/components/dbliveryselectorcomponent.cpp b/src/blackgui/components/dbliveryselectorcomponent.cpp index aebdc2b1a..05eaa01c0 100644 --- a/src/blackgui/components/dbliveryselectorcomponent.cpp +++ b/src/blackgui/components/dbliveryselectorcomponent.cpp @@ -13,7 +13,7 @@ #include "blackgui/uppercasevalidator.h" #include "blackmisc/aviation/liverylist.h" #include "blackmisc/db/datastoreutility.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/stringutils.h" #include "blackmisc/variant.h" #include "ui_dbliveryselectorcomponent.h" diff --git a/src/blackgui/components/dbownmodelsetcomponent.cpp b/src/blackgui/components/dbownmodelsetcomponent.cpp index 61d3bdc2c..c889251fe 100644 --- a/src/blackgui/components/dbownmodelsetcomponent.cpp +++ b/src/blackgui/components/dbownmodelsetcomponent.cpp @@ -24,7 +24,7 @@ #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/distributorlist.h" #include "blackmisc/simulation/distributorlistpreferences.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icons.h" #include "blackmisc/logmessage.h" #include "blackmisc/orderable.h" diff --git a/src/blackgui/components/simulatorcomponent.cpp b/src/blackgui/components/simulatorcomponent.cpp index b62d7924c..b7050e3ba 100644 --- a/src/blackgui/components/simulatorcomponent.cpp +++ b/src/blackgui/components/simulatorcomponent.cpp @@ -25,6 +25,7 @@ #include "blackmisc/pq/frequency.h" #include "blackmisc/pq/speed.h" #include "blackmisc/stringutils.h" +#include "blackmisc/iconlist.h" using namespace BlackMisc; using namespace BlackMisc::Aviation; diff --git a/src/blackgui/components/simulatorselector.cpp b/src/blackgui/components/simulatorselector.cpp index 6e3c1bc87..66b13760c 100644 --- a/src/blackgui/components/simulatorselector.cpp +++ b/src/blackgui/components/simulatorselector.cpp @@ -11,7 +11,7 @@ #include "blackgui/guiutility.h" #include "blackcore/context/contextsimulator.h" #include "blackmisc/icons.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackconfig/buildconfig.h" #include "ui_simulatorselector.h" diff --git a/src/blackgui/components/textmessagecomponent.cpp b/src/blackgui/components/textmessagecomponent.cpp index a5788a6a1..bd2ee47b6 100644 --- a/src/blackgui/components/textmessagecomponent.cpp +++ b/src/blackgui/components/textmessagecomponent.cpp @@ -26,7 +26,7 @@ #include "blackmisc/pq/constants.h" #include "blackmisc/pq/frequency.h" #include "blackmisc/pq/units.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/iterator.h" #include "blackmisc/logmessage.h" #include "blackmisc/sequence.h" diff --git a/src/blackgui/editors/aircrafticaoform.cpp b/src/blackgui/editors/aircrafticaoform.cpp index a0c76cb89..11af98f1c 100644 --- a/src/blackgui/editors/aircrafticaoform.cpp +++ b/src/blackgui/editors/aircrafticaoform.cpp @@ -20,7 +20,7 @@ #include "blackcore/webdataservices.h" #include "blackmisc/aviation/aircrafticaocodelist.h" #include "blackmisc/db/datastore.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icons.h" #include diff --git a/src/blackgui/editors/airlineicaoform.cpp b/src/blackgui/editors/airlineicaoform.cpp index 3d7f77c78..fc095f2a4 100644 --- a/src/blackgui/editors/airlineicaoform.cpp +++ b/src/blackgui/editors/airlineicaoform.cpp @@ -17,7 +17,7 @@ #include "blackgui/guiapplication.h" #include "blackcore/webdataservices.h" #include "blackmisc/aviation/airlineicaocodelist.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icons.h" #include "ui_airlineicaoform.h" diff --git a/src/blackgui/editors/distributorform.cpp b/src/blackgui/editors/distributorform.cpp index 96386e08e..4f9ac5bc4 100644 --- a/src/blackgui/editors/distributorform.cpp +++ b/src/blackgui/editors/distributorform.cpp @@ -11,7 +11,7 @@ #include "blackgui/editors/validationindicator.h" #include "blackgui/labelandicon.h" #include "blackgui/dropsite.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icons.h" #include "blackmisc/simulation/distributorlist.h" #include "distributorform.h" diff --git a/src/blackgui/editors/liveryform.cpp b/src/blackgui/editors/liveryform.cpp index 37a3269bd..acbae2a7a 100644 --- a/src/blackgui/editors/liveryform.cpp +++ b/src/blackgui/editors/liveryform.cpp @@ -19,7 +19,7 @@ #include "blackgui/labelandicon.h" #include "blackcore/webdataservices.h" #include "blackmisc/aviation/liverylist.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icons.h" #include diff --git a/src/blackgui/enablefordockwidgetinfoarea.h b/src/blackgui/enablefordockwidgetinfoarea.h index 8f7ef3f8a..3c371c792 100644 --- a/src/blackgui/enablefordockwidgetinfoarea.h +++ b/src/blackgui/enablefordockwidgetinfoarea.h @@ -14,6 +14,8 @@ #include "blackgui/blackguiexport.h" #include "blackmisc/connectionguard.h" +class QWidget; + namespace BlackGui { class CDockWidgetInfoArea; diff --git a/src/blackgui/models/aircraftcategorytreemodel.cpp b/src/blackgui/models/aircraftcategorytreemodel.cpp index b45b1070f..90a15069e 100644 --- a/src/blackgui/models/aircraftcategorytreemodel.cpp +++ b/src/blackgui/models/aircraftcategorytreemodel.cpp @@ -9,7 +9,7 @@ #include "blackgui/models/aircraftcategorytreemodel.h" #include "blackgui/models/columnformatters.h" #include "blackgui/models/columns.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icon.h" #include "blackmisc/threadutils.h" #include "blackmisc/variant.h" diff --git a/src/blackgui/models/atcstationlistmodel.cpp b/src/blackgui/models/atcstationlistmodel.cpp index cee26b37f..2d434642e 100644 --- a/src/blackgui/models/atcstationlistmodel.cpp +++ b/src/blackgui/models/atcstationlistmodel.cpp @@ -11,7 +11,7 @@ #include "blackgui/models/columnformatters.h" #include "blackgui/models/columns.h" #include "blackmisc/aviation/callsign.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icon.h" #include "blackmisc/network/user.h" #include "blackmisc/pq/frequency.h" diff --git a/src/blackgui/models/atcstationtreemodel.cpp b/src/blackgui/models/atcstationtreemodel.cpp index fe0d24c10..f9e561eb5 100644 --- a/src/blackgui/models/atcstationtreemodel.cpp +++ b/src/blackgui/models/atcstationtreemodel.cpp @@ -10,7 +10,7 @@ #include "blackgui/models/columnformatters.h" #include "blackgui/models/columns.h" #include "blackmisc/aviation/callsign.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icon.h" #include "blackmisc/network/user.h" #include "blackmisc/pq/frequency.h" diff --git a/src/blackgui/models/clientlistmodel.cpp b/src/blackgui/models/clientlistmodel.cpp index 07a92a7e7..52aacd3a9 100644 --- a/src/blackgui/models/clientlistmodel.cpp +++ b/src/blackgui/models/clientlistmodel.cpp @@ -11,7 +11,7 @@ #include "blackgui/models/columns.h" #include "blackmisc/simulation/aircraftmodel.h" #include "blackmisc/network/user.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/propertyindex.h" #include "blackmisc/propertyindexvariantmap.h" diff --git a/src/blackgui/models/columns.cpp b/src/blackgui/models/columns.cpp index ed2463c2d..89fdd5a18 100644 --- a/src/blackgui/models/columns.cpp +++ b/src/blackgui/models/columns.cpp @@ -8,7 +8,7 @@ #include "blackgui/models/columns.h" #include "blackgui/guiapplication.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include #include diff --git a/src/blackgui/models/namevariantpairlistmodel.cpp b/src/blackgui/models/namevariantpairlistmodel.cpp index 6fb206c8d..495e4b195 100644 --- a/src/blackgui/models/namevariantpairlistmodel.cpp +++ b/src/blackgui/models/namevariantpairlistmodel.cpp @@ -9,7 +9,7 @@ #include "blackgui/models/columnformatters.h" #include "blackgui/models/columns.h" #include "blackgui/models/namevariantpairlistmodel.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/namevariantpair.h" #include "blackmisc/propertyindexvariantmap.h" diff --git a/src/blackmisc/audio/audiodeviceinfolist.cpp b/src/blackmisc/audio/audiodeviceinfolist.cpp index 09b9062b2..6ceace87b 100644 --- a/src/blackmisc/audio/audiodeviceinfolist.cpp +++ b/src/blackmisc/audio/audiodeviceinfolist.cpp @@ -9,6 +9,7 @@ #include "blackmisc/audio/audiodeviceinfolist.h" #include "blackmisc/iterator.h" #include "blackmisc/range.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/aviation/aircraftcategory.cpp b/src/blackmisc/aviation/aircraftcategory.cpp index 99cff17d5..22ca8e8bb 100644 --- a/src/blackmisc/aviation/aircraftcategory.cpp +++ b/src/blackmisc/aviation/aircraftcategory.cpp @@ -13,6 +13,7 @@ #include "blackmisc/propertyindex.h" #include "blackmisc/statusmessage.h" #include "blackmisc/variant.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/aviation/aircrafticaocode.cpp b/src/blackmisc/aviation/aircrafticaocode.cpp index 9d0715582..6df50ead5 100644 --- a/src/blackmisc/aviation/aircrafticaocode.cpp +++ b/src/blackmisc/aviation/aircrafticaocode.cpp @@ -15,6 +15,7 @@ #include "blackmisc/propertyindex.h" #include "blackmisc/statusmessage.h" #include "blackmisc/variant.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/aviation/aircraftsituation.cpp b/src/blackmisc/aviation/aircraftsituation.cpp index 340e224a3..c960f42e4 100644 --- a/src/blackmisc/aviation/aircraftsituation.cpp +++ b/src/blackmisc/aviation/aircraftsituation.cpp @@ -17,6 +17,7 @@ #include "blackmisc/comparefunctions.h" #include "blackmisc/variant.h" #include "blackmisc/verify.h" +#include "blackmisc/stringutils.h" #include "blackconfig/buildconfig.h" #include "QStringBuilder" diff --git a/src/blackmisc/aviation/airporticaocode.cpp b/src/blackmisc/aviation/airporticaocode.cpp index e4aea01b6..3ae297c94 100644 --- a/src/blackmisc/aviation/airporticaocode.cpp +++ b/src/blackmisc/aviation/airporticaocode.cpp @@ -9,7 +9,8 @@ //! \file #include "blackmisc/aviation/airporticaocode.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/aviation/airportlist.cpp b/src/blackmisc/aviation/airportlist.cpp index c83482895..8551782eb 100644 --- a/src/blackmisc/aviation/airportlist.cpp +++ b/src/blackmisc/aviation/airportlist.cpp @@ -7,7 +7,7 @@ */ #include "blackmisc/aviation/airportlist.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/range.h" #include diff --git a/src/blackmisc/aviation/altitude.h b/src/blackmisc/aviation/altitude.h index c1b0ceae9..5bc9fffb2 100644 --- a/src/blackmisc/aviation/altitude.h +++ b/src/blackmisc/aviation/altitude.h @@ -15,16 +15,16 @@ #include "blackmisc/pq/pqstring.h" #include "blackmisc/pq/units.h" #include "blackmisc/statusmessagelist.h" -#include "blackmisc/compare.h" -#include "blackmisc/dbus.h" -#include "blackmisc/datastream.h" -#include "blackmisc/dictionary.h" -#include "blackmisc/icon.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixindatastream.h" +#include "blackmisc/mixin/mixinhash.h" +#include "blackmisc/mixin/mixinicon.h" #include "blackmisc/metaclass.h" #include "blackmisc/pq/pressure.h" -#include "blackmisc/propertyindexvariantmap.h" -#include "blackmisc/stringutils.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinindex.h" +#include "blackmisc/mixin/mixinstring.h" +#include "blackmisc/mixin/mixinmetatype.h" #include "blackmisc/blackmiscexport.h" #include diff --git a/src/blackmisc/aviation/atcstation.cpp b/src/blackmisc/aviation/atcstation.cpp index 1219fc323..3bacba943 100644 --- a/src/blackmisc/aviation/atcstation.cpp +++ b/src/blackmisc/aviation/atcstation.cpp @@ -8,12 +8,13 @@ #include "blackmisc/aviation/atcstation.h" #include "blackmisc/aviation/comsystem.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/pq/physicalquantity.h" #include "blackmisc/pq/units.h" #include "blackmisc/propertyindex.h" #include "blackmisc/variant.h" #include "blackmisc/comparefunctions.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/aviation/atcstationlist.cpp b/src/blackmisc/aviation/atcstationlist.cpp index 3d9266494..14c69594e 100644 --- a/src/blackmisc/aviation/atcstationlist.cpp +++ b/src/blackmisc/aviation/atcstationlist.cpp @@ -9,7 +9,7 @@ #include "blackmisc/aviation/atcstationlist.h" #include "blackmisc/aviation/callsign.h" #include "blackmisc/aviation/comsystem.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/iterator.h" #include "blackmisc/network/user.h" #include "blackmisc/predicates.h" diff --git a/src/blackmisc/aviation/callsign.cpp b/src/blackmisc/aviation/callsign.cpp index bb53c200e..e0b67bfee 100644 --- a/src/blackmisc/aviation/callsign.cpp +++ b/src/blackmisc/aviation/callsign.cpp @@ -7,7 +7,8 @@ */ #include "blackmisc/aviation/callsign.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/aviation/callsignset.h b/src/blackmisc/aviation/callsignset.h index 49a3791d2..c72bd0470 100644 --- a/src/blackmisc/aviation/callsignset.h +++ b/src/blackmisc/aviation/callsignset.h @@ -14,7 +14,7 @@ #include "blackmisc/aviation/callsign.h" #include "blackmisc/blackmiscexport.h" #include "blackmisc/collection.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/sequence.h" #include diff --git a/src/blackmisc/aviation/comsystem.cpp b/src/blackmisc/aviation/comsystem.cpp index dc452389e..356c0a0f5 100644 --- a/src/blackmisc/aviation/comsystem.cpp +++ b/src/blackmisc/aviation/comsystem.cpp @@ -9,6 +9,7 @@ #include "blackmisc/aviation/comsystem.h" #include "blackmisc/math/mathutils.h" #include "blackmisc/dbus.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/aviation/comsystem.h b/src/blackmisc/aviation/comsystem.h index ccce3acb5..12ad24a6f 100644 --- a/src/blackmisc/aviation/comsystem.h +++ b/src/blackmisc/aviation/comsystem.h @@ -19,10 +19,10 @@ #include "blackmisc/pq/units.h" #include "blackmisc/pq/pqstring.h" #include "blackmisc/blackmiscexport.h" -#include "blackmisc/propertyindexvariantmap.h" -#include "blackmisc/dictionary.h" -#include "blackmisc/json.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinindex.h" +#include "blackmisc/mixin/mixinhash.h" +#include "blackmisc/mixin/mixinjson.h" +#include "blackmisc/mixin/mixinmetatype.h" #include #include diff --git a/src/blackmisc/aviation/flightplanlist.cpp b/src/blackmisc/aviation/flightplanlist.cpp index f0501d720..9278119ce 100644 --- a/src/blackmisc/aviation/flightplanlist.cpp +++ b/src/blackmisc/aviation/flightplanlist.cpp @@ -7,7 +7,7 @@ */ #include "flightplanlist.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/iterator.h" #include "blackmisc/predicates.h" #include "blackmisc/range.h" diff --git a/src/blackmisc/aviation/heading.h b/src/blackmisc/aviation/heading.h index b7c68ce3f..060947cbd 100644 --- a/src/blackmisc/aviation/heading.h +++ b/src/blackmisc/aviation/heading.h @@ -12,16 +12,16 @@ #define BLACKMISC_AVIATION_HEADING_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/compare.h" -#include "blackmisc/dbus.h" -#include "blackmisc/dictionary.h" -#include "blackmisc/json.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixinhash.h" +#include "blackmisc/mixin/mixinjson.h" #include "blackmisc/metaclass.h" #include "blackmisc/pq/angle.h" #include "blackmisc/pq/units.h" -#include "blackmisc/propertyindexvariantmap.h" -#include "blackmisc/stringutils.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinindex.h" +#include "blackmisc/mixin/mixinstring.h" +#include "blackmisc/mixin/mixinmetatype.h" #include #include diff --git a/src/blackmisc/aviation/informationmessage.h b/src/blackmisc/aviation/informationmessage.h index 284473f5d..00627314c 100644 --- a/src/blackmisc/aviation/informationmessage.h +++ b/src/blackmisc/aviation/informationmessage.h @@ -14,6 +14,7 @@ #include "blackmisc/timestampbased.h" #include "blackmisc/metaclass.h" #include "blackmisc/valueobject.h" +#include "blackmisc/dbus.h" #include "blackmisc/blackmiscexport.h" #include diff --git a/src/blackmisc/aviation/livery.cpp b/src/blackmisc/aviation/livery.cpp index 68c7e010c..34f055f2d 100644 --- a/src/blackmisc/aviation/livery.cpp +++ b/src/blackmisc/aviation/livery.cpp @@ -9,7 +9,7 @@ #include "blackmisc/db/datastoreutility.h" #include "blackmisc/aviation/livery.h" #include "blackmisc/aviation/logutils.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/comparefunctions.h" #include "blackmisc/logcategory.h" #include "blackmisc/logcategorylist.h" diff --git a/src/blackmisc/aviation/track.h b/src/blackmisc/aviation/track.h index aaca7f388..de232d864 100644 --- a/src/blackmisc/aviation/track.h +++ b/src/blackmisc/aviation/track.h @@ -12,16 +12,16 @@ #define BLACKMISC_AVIATION_TRACK_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/compare.h" -#include "blackmisc/dbus.h" -#include "blackmisc/dictionary.h" -#include "blackmisc/json.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixinhash.h" +#include "blackmisc/mixin/mixinjson.h" #include "blackmisc/metaclass.h" #include "blackmisc/pq/angle.h" #include "blackmisc/pq/units.h" -#include "blackmisc/propertyindexvariantmap.h" -#include "blackmisc/stringutils.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinindex.h" +#include "blackmisc/mixin/mixinstring.h" +#include "blackmisc/mixin/mixinmetatype.h" #include #include diff --git a/src/blackmisc/blackmisc.pro b/src/blackmisc/blackmisc.pro index bf9a80376..93ac7e784 100644 --- a/src/blackmisc/blackmisc.pro +++ b/src/blackmisc/blackmisc.pro @@ -33,6 +33,7 @@ HEADERS += *.h \ $$files($$PWD/geo/*.h) \ $$files($$PWD/input/*.h) \ $$files($$PWD/math/*.h) \ + $$files($$PWD/mixin/*.h) \ $$files($$PWD/network/*.h) \ $$files($$PWD/network/data/*.h) \ $$files($$PWD/network/settings/*.h) \ @@ -59,6 +60,7 @@ SOURCES += *.cpp \ $$files($$PWD/geo/*.cpp) \ $$files($$PWD/input/*.cpp) \ $$files($$PWD/math/*.cpp) \ + $$files($$PWD/mixin/*.cpp) \ $$files($$PWD/network/*.cpp) \ $$files($$PWD/network/settings/*.cpp) \ $$files($$PWD/network/external/*.cpp) \ diff --git a/src/blackmisc/collection.h b/src/blackmisc/collection.h index ce4a1eab2..1ef8d75fc 100644 --- a/src/blackmisc/collection.h +++ b/src/blackmisc/collection.h @@ -12,8 +12,8 @@ #define BLACKMISC_COLLECTION_H #include "blackmisc/containerbase.h" -#include "blackmisc/datastream.h" -#include "blackmisc/icon.h" +#include "blackmisc/mixin/mixindatastream.h" +#include "blackmisc/mixin/mixinicon.h" #include #include #include diff --git a/src/blackmisc/comparefunctions.h b/src/blackmisc/comparefunctions.h index 5f6c05539..5a0ad892c 100644 --- a/src/blackmisc/comparefunctions.h +++ b/src/blackmisc/comparefunctions.h @@ -11,12 +11,10 @@ #ifndef BLACKMISC_COMPAREFUNCTIONS_H #define BLACKMISC_COMPAREFUNCTIONS_H +#include #include #include -template -class QFlags; - namespace BlackMisc { namespace Compare diff --git a/src/blackmisc/containerbase.h b/src/blackmisc/containerbase.h index e81e346e7..09de24de7 100644 --- a/src/blackmisc/containerbase.h +++ b/src/blackmisc/containerbase.h @@ -14,8 +14,10 @@ #include "blackmisc/range.h" #include "blackmisc/predicates.h" #include "blackmisc/json.h" -#include "blackmisc/variant.h" -#include "blackmisc/dbus.h" +#include "blackmisc/mixin/mixinjson.h" +#include "blackmisc/mixin/mixinmetatype.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixinstring.h" #include #include diff --git a/src/blackmisc/datastream.h b/src/blackmisc/datastream.h index 24ceaac50..773911bfd 100644 --- a/src/blackmisc/datastream.h +++ b/src/blackmisc/datastream.h @@ -11,85 +11,8 @@ #ifndef BLACKMISC_DATASTREAM_H #define BLACKMISC_DATASTREAM_H -#include "blackmisc/typetraits.h" #include - -namespace BlackMisc -{ - class CEmpty; - - namespace Mixin - { - /*! - * CRTP class template to generate non-member QDataStream streaming operators. - * - * \tparam Derived Must implement public methods marshalToDataStream(QDataStream &) and unmarshalFromDataStream(QDataStream &). - */ - template - class DataStreamOperators - { - public: - //! Marshal a value to a QDataStream. - friend QDataStream &operator <<(QDataStream &stream, const Derived &value) - { - value.marshalToDataStream(stream); - return stream; - } - - //! Unmarshal a value from a QDataStream. - friend QDataStream &operator >>(QDataStream &stream, Derived &value) - { - value.unmarshalFromDataStream(stream); - return stream; - } - }; - - /*! - * CRTP class template to generate QDataStream marshalling methods using CMetaClass. - * - * \see BLACKMISC_DECLARE_USING_MIXIN_DATASTREAM - */ - template - class DataStreamByMetaClass : public DataStreamOperators - { - public: - //! Marshal a value to a QDataStream. - void marshalToDataStream(QDataStream &stream) const - { - baseMarshal(static_cast *>(derived()), stream); - constexpr auto meta = introspect().without(MetaFlags()); - meta.forEachMember([ &, this ](auto member) { stream << member.in(*this->derived()); }); - } - - //! Unmarshal a value from a QDataStream. - void unmarshalFromDataStream(QDataStream &stream) - { - baseUnmarshal(static_cast *>(derived()), stream); - constexpr auto meta = introspect().without(MetaFlags()); - meta.forEachMember([ &, this ](auto member) { stream >> member.in(*this->derived()); }); - } - - private: - const Derived *derived() const { return static_cast(this); } - Derived *derived() { return static_cast(this); } - - template static void baseMarshal(const T *base, QDataStream &stream) { base->marshalToDataStream(stream); } - template static void baseUnmarshal(T *base, QDataStream &stream) { base->unmarshalFromDataStream(stream); } - static void baseMarshal(const void *, QDataStream &) {} - static void baseUnmarshal(void *, QDataStream &) {} - static void baseMarshal(const CEmpty *, QDataStream &) {} - static void baseUnmarshal(CEmpty *, QDataStream &) {} - }; - - /*! - * When a derived class and a base class both inherit from Mixin::DataStreamByMetaClass, - * the derived class uses this macro to disambiguate the inherited members. - */ -# define BLACKMISC_DECLARE_USING_MIXIN_DATASTREAM(DERIVED) \ - using ::BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream; \ - using ::BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream; - } -} +#include /*! * Operator for marshalling pairs with QDataStream. diff --git a/src/blackmisc/dbus.h b/src/blackmisc/dbus.h index fa55cc9f0..6aa8aa38c 100644 --- a/src/blackmisc/dbus.h +++ b/src/blackmisc/dbus.h @@ -11,132 +11,13 @@ #ifndef BLACKMISC_DBUS_H #define BLACKMISC_DBUS_H -#include "blackmisc/metaclass.h" -#include "blackmisc/inheritancetraits.h" -#include "blackmisc/typetraits.h" #include "blackmisc/blackmiscexport.h" + +#include #include #include - -namespace BlackMisc -{ - class CEmpty; - - /*! - * Tag type signifying overloaded marshalling methods that preserve data at the expense of size. - */ - class LosslessTag {}; - - // *INDENT-OFF* - namespace Private - { - //! \cond PRIVATE - template ::value, int> = 0> - void marshallMember(QDBusArgument &arg, const T &value, std::false_type) { value.marshallToDbus(arg); } - template ::value, int> = 0> - void marshallMember(QDBusArgument &arg, const T &value, std::true_type) { value.marshallToDbus(arg, LosslessTag()); } - template ::value, int> = 0> - void marshallMember(QDBusArgument &arg, const T &value, std::false_type) { arg << value; } - - template ::value, int> = 0> - void unmarshallMember(const QDBusArgument &arg, T &value, std::false_type) { value.unmarshallFromDbus(arg); } - template ::value, int> = 0> - void unmarshallMember(const QDBusArgument &arg, T &value, std::true_type) { value.unmarshallFromDbus(arg, LosslessTag()); } - template ::value, int> = 0> - void unmarshallMember(const QDBusArgument &arg, T &value, std::false_type) { arg >> value; } - //! \endcond - } - // *INDENT-ON* - - namespace Mixin - { - /*! - * CRTP class template which will generate marshalling operators for a derived class with its own marshalling implementation. - * - * \tparam Derived Must implement public methods void marshallToDbus(QDBusArgument &arg) const and void unmarshallFromDbus(const QDBusArgument &arg). - */ - template - class DBusOperators - { - public: - //! Unmarshalling operator >>, DBus to object - friend const QDBusArgument &operator>>(const QDBusArgument &arg, Derived &obj) - { - arg.beginStructure(); - obj.unmarshallFromDbus(arg); - arg.endStructure(); - return arg; - } - - //! Marshalling operator <<, object to DBus - friend QDBusArgument &operator<<(QDBusArgument &arg, const Derived &obj) - { - arg.beginStructure(); - obj.marshallToDbus(arg); - arg.endStructure(); - return arg; - } - }; - template - class DBusOperators {}; - - /*! - * CRTP class template from which a derived class can inherit common methods dealing with marshalling instances by metaclass. - * - * \see BLACKMISC_DECLARE_USING_MIXIN_DBUS - */ - template - class DBusByMetaClass : public DBusOperators - { - public: - //! Marshall without begin/endStructure, for when composed within another object - void marshallToDbus(QDBusArgument &arg, Tags...) const - { - baseMarshall(static_cast *>(derived()), arg); - constexpr auto meta = introspect().without(MetaFlags()); - meta.forEachMember([ &, this ](auto member) - { - using lossless = std::integral_constant())>; - Private::marshallMember(arg, member.in(*this->derived()), lossless()); - }); - } - - //! Unmarshall without begin/endStructure, for when composed within another object - void unmarshallFromDbus(const QDBusArgument &arg, Tags...) - { - baseUnmarshall(static_cast *>(derived()), arg); - constexpr auto meta = introspect().without(MetaFlags()); - meta.forEachMember([ &, this ](auto member) - { - using lossless = std::integral_constant())>; - Private::unmarshallMember(arg, member.in(*this->derived()), lossless()); - }); - } - - private: - const Derived *derived() const { return static_cast(this); } - Derived *derived() { return static_cast(this); } - - template static void baseMarshall(const T *base, QDBusArgument &arg) { base->marshallToDbus(arg, Tags()...); } - template static void baseUnmarshall(T *base, const QDBusArgument &arg) { base->unmarshallFromDbus(arg, Tags()...); } - static void baseMarshall(const void *, QDBusArgument &) {} - static void baseUnmarshall(void *, const QDBusArgument &) {} - static void baseMarshall(const CEmpty *, QDBusArgument &) {} - static void baseUnmarshall(CEmpty *, const QDBusArgument &) {} - }; - - // *INDENT-OFF* - /*! - * When a derived class and a base class both inherit from Mixin::DBusByTuple, - * the derived class uses this macro to disambiguate the inherited members. - */ -# define BLACKMISC_DECLARE_USING_MIXIN_DBUS(DERIVED, ...) \ - using ::BlackMisc::Mixin::DBusByMetaClass::marshallToDbus; \ - using ::BlackMisc::Mixin::DBusByMetaClass::unmarshallFromDbus; - // *INDENT-ON* - - } // Mixin -} // BlackMisc +#include +#include /*! * Non member non-friend streaming for std::string diff --git a/src/blackmisc/dictionary.h b/src/blackmisc/dictionary.h index 9f787049f..428fec411 100644 --- a/src/blackmisc/dictionary.h +++ b/src/blackmisc/dictionary.h @@ -12,16 +12,18 @@ #define BLACKMISC_DICTIONARY_H #include "blackmisc/containerbase.h" -#include "blackmisc/dbus.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixindatastream.h" #include "blackmisc/datastream.h" #include "blackmisc/inheritancetraits.h" #include "blackmisc/iterator.h" -#include "blackmisc/json.h" +#include "blackmisc/mixin/mixinjson.h" #include "blackmisc/metaclass.h" #include "blackmisc/predicates.h" #include "blackmisc/range.h" -#include "blackmisc/stringutils.h" +#include "blackmisc/mixin/mixinstring.h" #include "blackmisc/typetraits.h" +#include "blackmisc/mixin/mixinhash.h" #include "blackmisc/blackmiscexport.h" #include @@ -42,13 +44,6 @@ namespace BlackMisc { - class CEmpty; - - // Needed so that our qHash overload doesn't hide the qHash overloads in the global namespace. - // This will be safe as long as no global qHash has the same signature as ours. - // Alternative would be to qualify all our invokations of the global qHash as ::qHash. - using ::qHash; - namespace Private { //! \cond PRIVATE @@ -70,19 +65,8 @@ namespace BlackMisc template struct DefaultType { static_assert(std::is_void::value, "Key does not support either QHash or QMap"); }; }; - - // Work around MSVC2015 bug affecting generic lambda - template - struct Hasher - { - template - void operator()(const U &member) { m_hash ^= qHash(member.in(m_object)); } - const T &m_object; - uint &m_hash; - }; - //! \endcond - } // namespace Private + } /*! * Trait to select the appropriate default associative container type depending on what the key type supports. @@ -504,39 +488,6 @@ namespace BlackMisc else { functor(it1.key(), it1.value(), it2); ++it1; ++it2; } } } - - namespace Mixin - { - /*! - * CRTP class template from which a derived class can inherit common methods dealing with hashing instances by metaclass. - * - * \tparam Derived Must be registered with BLACK_DECLARE_TUPLE_CONVERSION. - */ - template - class HashByMetaClass - { - public: - //! qHash overload, needed for storing value in a QSet. - friend uint qHash(const Derived &value, uint seed = 0) // clazy:exclude=qhash-namespace - { - return ::qHash(hashImpl(value), seed); - } - - private: - static uint hashImpl(const Derived &value) - { - uint hash = baseHash(static_cast *>(&value)); - constexpr auto meta = introspect().without(MetaFlags()); - meta.forEachMember(Private::Hasher { value, hash }); - return hash; - } - - template static uint baseHash(const T *base) { return qHash(*base); } - static uint baseHash(const void *) { return 0; } - static uint baseHash(const CEmpty *) { return 0; } - }; - } - } // namespace BlackMisc #endif // BLACKMISC_DICTIONARY_H diff --git a/src/blackmisc/fileutils.cpp b/src/blackmisc/fileutils.cpp index 8d5c6eccc..46a70a7b1 100644 --- a/src/blackmisc/fileutils.cpp +++ b/src/blackmisc/fileutils.cpp @@ -8,6 +8,7 @@ #include "blackmisc/fileutils.h" #include "blackmisc/directoryutils.h" +#include "blackmisc/stringutils.h" #include "blackconfig/buildconfig.h" #include diff --git a/src/blackmisc/geo/coordinategeodetic.h b/src/blackmisc/geo/coordinategeodetic.h index 17cd22b46..ceca8e358 100644 --- a/src/blackmisc/geo/coordinategeodetic.h +++ b/src/blackmisc/geo/coordinategeodetic.h @@ -20,9 +20,10 @@ #include "blackmisc/math/mathutils.h" #include "blackmisc/metaclass.h" #include "blackmisc/propertyindex.h" -#include "blackmisc/stringutils.h" +#include "blackmisc/mixin/mixinstring.h" #include "blackmisc/valueobject.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinmetatype.h" +#include "blackmisc/stringutils.h" #include "blackmisc/blackmiscexport.h" #include diff --git a/src/blackmisc/geo/elevationplane.h b/src/blackmisc/geo/elevationplane.h index b35fcc803..fcdb569f8 100644 --- a/src/blackmisc/geo/elevationplane.h +++ b/src/blackmisc/geo/elevationplane.h @@ -12,7 +12,7 @@ #define BLACKMISC_GEO_ELEVATIONPLANE_H #include "blackmisc/geo/coordinategeodetic.h" -#include "blackmisc/stringutils.h" +#include "blackmisc/mixin/mixinstring.h" #include "blackmisc/blackmiscexport.h" namespace BlackMisc diff --git a/src/blackmisc/icon.h b/src/blackmisc/icon.h index 76aaa6f88..ee14cd8df 100644 --- a/src/blackmisc/icon.h +++ b/src/blackmisc/icon.h @@ -12,15 +12,16 @@ #define BLACKMISC_ICON_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixindbus.h" #include "blackmisc/dbus.h" -#include "blackmisc/datastream.h" -#include "blackmisc/dictionary.h" +#include "blackmisc/mixin/mixindatastream.h" +#include "blackmisc/mixin/mixinhash.h" #include "blackmisc/icons.h" -#include "blackmisc/json.h" +#include "blackmisc/mixin/mixinjson.h" #include "blackmisc/metaclass.h" -#include "blackmisc/stringutils.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinstring.h" +#include "blackmisc/mixin/mixinmetatype.h" #include #include @@ -30,38 +31,8 @@ namespace BlackMisc { - class CIcon; namespace PhysicalQuantities { class CAngle; } - namespace Mixin - { - /*! - * CRTP class template from which a derived class can inherit icon-related functions. - */ - template - class Icon - { - public: - //! As icon, not implemented by all classes - CIcon toIcon() const; - - //! As pixmap, required for most GUI views - QPixmap toPixmap() const; - - private: - const Derived *derived() const { return static_cast(this); } - Derived *derived() { return static_cast(this); } - }; - - /*! - * When a derived class and a base class both inherit from Mixin::Icon, - * the derived class uses this macro to disambiguate the inherited members. - */ -# define BLACKMISC_DECLARE_USING_MIXIN_ICON(DERIVED) \ - using ::BlackMisc::Mixin::Icon::toIcon; \ - using ::BlackMisc::Mixin::Icon::toPixmap; - } // Mixin - //! Value object for icons. An icon is stored in the global icon repository and //! identified by its index. It contains no(!) pyhsical data for the icon itself. class BLACKMISC_EXPORT CIcon : @@ -163,20 +134,6 @@ namespace BlackMisc //! \private Needed so CValueObjectMetaInfoHelper can copy forward-declared CIcon. inline void assign(CIcon &a, const CIcon &b) { a = b; } } - - namespace Mixin - { - template - CIcon Icon::toIcon() const - { - return CIcon::iconByIndex(IconIndex); - } - template - QPixmap Icon::toPixmap() const - { - return derived()->toIcon().toPixmap(); - } - } } // namespace Q_DECLARE_METATYPE(BlackMisc::CIcon) diff --git a/src/blackmisc/iconlist.h b/src/blackmisc/iconlist.h index 1594451de..91aac2487 100644 --- a/src/blackmisc/iconlist.h +++ b/src/blackmisc/iconlist.h @@ -13,7 +13,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/collection.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icon.h" #include "blackmisc/icons.h" #include "blackmisc/sequence.h" diff --git a/src/blackmisc/identifiable.h b/src/blackmisc/identifiable.h index bad711275..a3ae0743e 100644 --- a/src/blackmisc/identifiable.h +++ b/src/blackmisc/identifiable.h @@ -13,7 +13,7 @@ #define BLACKMISC_IDENTIFIABLE_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/identifier.h" #include diff --git a/src/blackmisc/identifierlist.cpp b/src/blackmisc/identifierlist.cpp index abe2fddea..8af919809 100644 --- a/src/blackmisc/identifierlist.cpp +++ b/src/blackmisc/identifierlist.cpp @@ -7,7 +7,7 @@ */ #include "blackmisc/identifierlist.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include #include diff --git a/src/blackmisc/input/hotkeycombination.cpp b/src/blackmisc/input/hotkeycombination.cpp index 0c5a5912a..f47e9a2a4 100644 --- a/src/blackmisc/input/hotkeycombination.cpp +++ b/src/blackmisc/input/hotkeycombination.cpp @@ -7,7 +7,7 @@ */ #include "blackmisc/input/hotkeycombination.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/iterator.h" #include diff --git a/src/blackmisc/json.cpp b/src/blackmisc/json.cpp index bac96fa4c..75eba6b46 100644 --- a/src/blackmisc/json.cpp +++ b/src/blackmisc/json.cpp @@ -8,6 +8,7 @@ #include "blackmisc/json.h" #include "blackmisc/imageutils.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/json.h b/src/blackmisc/json.h index 4e6826fe1..67385612d 100644 --- a/src/blackmisc/json.h +++ b/src/blackmisc/json.h @@ -217,8 +217,6 @@ QDataStream &operator>>(QDataStream &s, std::string &v); namespace BlackMisc { - class CEmpty; - namespace Json { //! Append to first JSON object (concatenate) @@ -326,182 +324,7 @@ namespace BlackMisc if (jsonString.isEmpty()) { return false; } return CFileUtils::writeStringToFile(jsonString, fileNameAndPath); } - } // Json - - namespace Mixin - { - /*! - * CRTP class template which will generate marshalling operators for a derived class with its own marshalling implementation. - * - * \tparam Must implement public methods QJsonObject toJson() const and void convertFromJson(const QJsonObject &json). - */ - template - class JsonOperators - { - public: - //! operator >> for JSON - friend const QJsonObject &operator>>(const QJsonObject &json, Derived &obj) - { - obj.convertFromJson(json); - return json; - } - - //! operator >> for JSON - friend const QJsonValue &operator>>(const QJsonValue &json, Derived &obj) - { - obj.convertFromJson(json.toObject()); - return json; - } - - //! operator >> for JSON - friend QJsonValueRef operator>>(QJsonValueRef json, Derived &obj) - { - obj.convertFromJson(json.toObject()); - return json; - } - - //! operator << for JSON - friend QJsonArray &operator<<(QJsonArray &json, const Derived &obj) - { - json.append(obj.toJson()); - return json; - } - - //! operator << for JSON - friend QJsonObject &operator<<(QJsonObject &json, const std::pair &value) - { - json.insert(value.first, QJsonValue(value.second.toJson())); - return json; - } - - //! operator << for JSON - friend QJsonObject &operator<<(QJsonObject &json, const std::pair &value) - { - json[value.first] = QJsonValue(value.second.toJson()); - return json; - } - }; - - /*! - * CRTP class template from which a derived class can inherit common methods dealing with JSON by metatuple. - * - * \see BLACKMISC_DECLARE_USING_MIXIN_JSON - */ - template - class JsonByMetaClass : public JsonOperators - { - public: - //! Cast to JSON object - QJsonObject toJson() const - { - QJsonObject json; - constexpr auto meta = introspect().without(MetaFlags()); - meta.forEachMember([ &, this ](auto member) - { - json << std::make_pair(CExplicitLatin1String(member.latin1Name()), std::cref(member.in(*this->derived()))); - }); - return Json::appendJsonObject(json, baseToJson(static_cast *>(derived()))); - } - - //! Convenience function JSON as string - QString toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented) const - { - QJsonDocument jsonDoc(toJson()); - return jsonDoc.toJson(format); - } - - //! Assign from JSON object - void convertFromJson(const QJsonObject &json) - { - baseConvertFromJson(static_cast *>(derived()), json); - constexpr auto meta = introspect().without(MetaFlags()); - meta.forEachMember([ &, this ](auto member) - { - const auto value = json.value(CExplicitLatin1String(member.latin1Name())); - if (value.isUndefined()) - { - constexpr bool required = false; //! \fixme add RequiredForJson flag in metaclass system - // cppcheck-suppress knownConditionTrueFalse - // QLatin1String used instead of QStringLiteral below since the latter causes an internal compiler bug - // in GCC 8 and higher - if (required) { throw CJsonException(QLatin1String("Missing required member '%1'").arg(member.latin1Name())); } - } - else - { - CJsonScope scope(member.latin1Name()); - Q_UNUSED(scope); - value >> member.in(*this->derived()); - } - }); - } - - //! Assign from JSON object string - void convertFromJson(const QString &jsonString, bool acceptCacheFormat = false) - { - const QJsonObject jsonObject = BlackMisc::Json::jsonObjectFromString(jsonString, acceptCacheFormat); - convertFromJson(jsonObject); - } - - //! Get object from QJsonObject - template - static DerivedObj fromJson(const QJsonObject &json) - { - DerivedObj obj; - obj.convertFromJson(json); - return obj; - } - - //! Get object from JSON string - template - static DerivedObj fromJson(const QString &jsonString, bool acceptCacheJson = false) - { - DerivedObj obj; - if (jsonString.isEmpty()) { return obj; } - const QJsonObject jsonObj = acceptCacheJson ? Json::swiftDataObjectValue(jsonString) : Json::jsonObjectFromString(jsonString); - obj.convertFromJson(jsonObj); - return obj; - } - - //! Get object from JSON string - template - static Derived fromJsonNoThrow(const QString &jsonString, bool acceptCacheJson, bool &success, QString &errMsg) - { - success = false; - Derived obj; - try - { - if (jsonString.isEmpty()) { return obj; } - const QJsonObject jsonObj = acceptCacheJson ? Json::swiftDataObjectValue(jsonString) : Json::jsonObjectFromString(jsonString); - obj.convertFromJson(jsonObj); - success = true; - } - catch (const CJsonException &ex) - { - errMsg = ex.toString("JSON conversion"); - } - return obj; - } - - private: - const Derived *derived() const { return static_cast(this); } - Derived *derived() { return static_cast(this); } - - template static QJsonObject baseToJson(const T *base) { return base->toJson(); } - template static void baseConvertFromJson(T *base, const QJsonObject &json) { base->convertFromJson(json); } - static QJsonObject baseToJson(const void *) { return {}; } - static void baseConvertFromJson(void *, const QJsonObject &) {} - static QJsonObject baseToJson(const CEmpty *) { return {}; } - static void baseConvertFromJson(CEmpty *, const QJsonObject &) {} - }; - - /*! - * When a derived class and a base class both inherit from Mixin::JsonByTuple, - * the derived class uses this macro to disambiguate the inherited members. - */ -#define BLACKMISC_DECLARE_USING_MIXIN_JSON(DERIVED) \ - using ::BlackMisc::Mixin::JsonByMetaClass::toJson; \ - using ::BlackMisc::Mixin::JsonByMetaClass::convertFromJson; - } // Mixin ns -} // guard + } +} #endif // guard diff --git a/src/blackmisc/logcategorylist.h b/src/blackmisc/logcategorylist.h index 1a2835a31..c049721e3 100644 --- a/src/blackmisc/logcategorylist.h +++ b/src/blackmisc/logcategorylist.h @@ -13,7 +13,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/collection.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/logcategory.h" #include "blackmisc/sequence.h" #include "blackmisc/typetraits.h" diff --git a/src/blackmisc/loghandler.cpp b/src/blackmisc/loghandler.cpp index 3c029538b..85afeb00d 100644 --- a/src/blackmisc/loghandler.cpp +++ b/src/blackmisc/loghandler.cpp @@ -10,7 +10,7 @@ #include "blackmisc/loghandler.h" #include "blackmisc/algorithm.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/crashhandler.h" #include "blackmisc/worker.h" #include "blackconfig/buildconfig.h" diff --git a/src/blackmisc/logpattern.h b/src/blackmisc/logpattern.h index 5c5d331a0..81b1d53f3 100644 --- a/src/blackmisc/logpattern.h +++ b/src/blackmisc/logpattern.h @@ -12,16 +12,16 @@ #define BLACKMISC_LOGPATTERN_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/compare.h" -#include "blackmisc/dbus.h" -#include "blackmisc/datastream.h" -#include "blackmisc/dictionary.h" -#include "blackmisc/icon.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixindatastream.h" +#include "blackmisc/mixin/mixinhash.h" +#include "blackmisc/mixin/mixinicon.h" #include "blackmisc/metaclass.h" -#include "blackmisc/propertyindexvariantmap.h" +#include "blackmisc/mixin/mixinindex.h" #include "blackmisc/statusmessage.h" -#include "blackmisc/stringutils.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinstring.h" +#include "blackmisc/mixin/mixinmetatype.h" #include #include diff --git a/src/blackmisc/compare.h b/src/blackmisc/mixin/mixincompare.h similarity index 99% rename from src/blackmisc/compare.h rename to src/blackmisc/mixin/mixincompare.h index 03baf5a0e..f0fdfc08d 100644 --- a/src/blackmisc/compare.h +++ b/src/blackmisc/mixin/mixincompare.h @@ -8,8 +8,8 @@ //! \file -#ifndef BLACKMISC_COMPARE_H -#define BLACKMISC_COMPARE_H +#ifndef BLACKMISC_MIXIN_MIXINCOMPARE_H +#define BLACKMISC_MIXIN_MIXINCOMPARE_H #include "blackmisc/metaclass.h" #include "blackmisc/inheritancetraits.h" diff --git a/src/blackmisc/mixin/mixindatastream.h b/src/blackmisc/mixin/mixindatastream.h new file mode 100644 index 000000000..64a23951d --- /dev/null +++ b/src/blackmisc/mixin/mixindatastream.h @@ -0,0 +1,95 @@ +/* Copyright (C) 2019 + * 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. 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_MIXIN_MIXINDATASTREAM_H +#define BLACKMISC_MIXIN_MIXINDATASTREAM_H + +#include "blackmisc/metaclass.h" +#include "blackmisc/inheritancetraits.h" +#include + +namespace BlackMisc +{ + class CEmpty; + + namespace Mixin + { + /*! + * CRTP class template to generate non-member QDataStream streaming operators. + * + * \tparam Derived Must implement public methods marshalToDataStream(QDataStream &) and unmarshalFromDataStream(QDataStream &). + */ + template + class DataStreamOperators + { + public: + //! Marshal a value to a QDataStream. + friend QDataStream &operator <<(QDataStream &stream, const Derived &value) + { + value.marshalToDataStream(stream); + return stream; + } + + //! Unmarshal a value from a QDataStream. + friend QDataStream &operator >>(QDataStream &stream, Derived &value) + { + value.unmarshalFromDataStream(stream); + return stream; + } + }; + + /*! + * CRTP class template to generate QDataStream marshalling methods using CMetaClass. + * + * \see BLACKMISC_DECLARE_USING_MIXIN_DATASTREAM + */ + template + class DataStreamByMetaClass : public DataStreamOperators + { + public: + //! Marshal a value to a QDataStream. + void marshalToDataStream(QDataStream &stream) const + { + baseMarshal(static_cast *>(derived()), stream); + constexpr auto meta = introspect().without(MetaFlags()); + meta.forEachMember([ &, this ](auto member) { stream << member.in(*this->derived()); }); + } + + //! Unmarshal a value from a QDataStream. + void unmarshalFromDataStream(QDataStream &stream) + { + baseUnmarshal(static_cast *>(derived()), stream); + constexpr auto meta = introspect().without(MetaFlags()); + meta.forEachMember([ &, this ](auto member) { stream >> member.in(*this->derived()); }); + } + + private: + const Derived *derived() const { return static_cast(this); } + Derived *derived() { return static_cast(this); } + + template static void baseMarshal(const T *base, QDataStream &stream) { base->marshalToDataStream(stream); } + template static void baseUnmarshal(T *base, QDataStream &stream) { base->unmarshalFromDataStream(stream); } + static void baseMarshal(const void *, QDataStream &) {} + static void baseUnmarshal(void *, QDataStream &) {} + static void baseMarshal(const CEmpty *, QDataStream &) {} + static void baseUnmarshal(CEmpty *, QDataStream &) {} + }; + + /*! + * When a derived class and a base class both inherit from Mixin::DataStreamByMetaClass, + * the derived class uses this macro to disambiguate the inherited members. + */ +# define BLACKMISC_DECLARE_USING_MIXIN_DATASTREAM(DERIVED) \ + using ::BlackMisc::Mixin::DataStreamByMetaClass::marshalToDataStream; \ + using ::BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream; + } +} + +#endif diff --git a/src/blackmisc/mixin/mixindbus.h b/src/blackmisc/mixin/mixindbus.h new file mode 100644 index 000000000..f05b76d52 --- /dev/null +++ b/src/blackmisc/mixin/mixindbus.h @@ -0,0 +1,140 @@ +/* Copyright (C) 2014 + * 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. 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_MIXIN_MIXINDBUS_H +#define BLACKMISC_MIXIN_MIXINDBUS_H + +#include "blackmisc/metaclass.h" +#include "blackmisc/inheritancetraits.h" +#include "blackmisc/typetraits.h" +#include +#include + +namespace BlackMisc +{ + class CEmpty; + + /*! + * Tag type signifying overloaded marshalling methods that preserve data at the expense of size. + */ + class LosslessTag {}; + + // *INDENT-OFF* + namespace Private + { + //! \cond PRIVATE + template ::value, int> = 0> + void marshallMember(QDBusArgument &arg, const T &value, std::false_type) { value.marshallToDbus(arg); } + template ::value, int> = 0> + void marshallMember(QDBusArgument &arg, const T &value, std::true_type) { value.marshallToDbus(arg, LosslessTag()); } + template ::value, int> = 0> + void marshallMember(QDBusArgument &arg, const T &value, std::false_type) { arg << value; } + + template ::value, int> = 0> + void unmarshallMember(const QDBusArgument &arg, T &value, std::false_type) { value.unmarshallFromDbus(arg); } + template ::value, int> = 0> + void unmarshallMember(const QDBusArgument &arg, T &value, std::true_type) { value.unmarshallFromDbus(arg, LosslessTag()); } + template ::value, int> = 0> + void unmarshallMember(const QDBusArgument &arg, T &value, std::false_type) { arg >> value; } + //! \endcond + } + // *INDENT-ON* + + namespace Mixin + { + /*! + * CRTP class template which will generate marshalling operators for a derived class with its own marshalling implementation. + * + * \tparam Derived Must implement public methods void marshallToDbus(QDBusArgument &arg) const and void unmarshallFromDbus(const QDBusArgument &arg). + */ + template + class DBusOperators + { + public: + //! Unmarshalling operator >>, DBus to object + friend const QDBusArgument &operator>>(const QDBusArgument &arg, Derived &obj) + { + arg.beginStructure(); + obj.unmarshallFromDbus(arg); + arg.endStructure(); + return arg; + } + + //! Marshalling operator <<, object to DBus + friend QDBusArgument &operator<<(QDBusArgument &arg, const Derived &obj) + { + arg.beginStructure(); + obj.marshallToDbus(arg); + arg.endStructure(); + return arg; + } + }; + template + class DBusOperators {}; + + /*! + * CRTP class template from which a derived class can inherit common methods dealing with marshalling instances by metaclass. + * + * \see BLACKMISC_DECLARE_USING_MIXIN_DBUS + */ + template + class DBusByMetaClass : public DBusOperators + { + public: + //! Marshall without begin/endStructure, for when composed within another object + void marshallToDbus(QDBusArgument &arg, Tags...) const + { + baseMarshall(static_cast *>(derived()), arg); + constexpr auto meta = introspect().without(MetaFlags()); + meta.forEachMember([ &, this ](auto member) + { + using lossless = std::integral_constant())>; + Private::marshallMember(arg, member.in(*this->derived()), lossless()); + }); + } + + //! Unmarshall without begin/endStructure, for when composed within another object + void unmarshallFromDbus(const QDBusArgument &arg, Tags...) + { + baseUnmarshall(static_cast *>(derived()), arg); + constexpr auto meta = introspect().without(MetaFlags()); + meta.forEachMember([ &, this ](auto member) + { + using lossless = std::integral_constant())>; + Private::unmarshallMember(arg, member.in(*this->derived()), lossless()); + }); + } + + private: + const Derived *derived() const { return static_cast(this); } + Derived *derived() { return static_cast(this); } + + template static void baseMarshall(const T *base, QDBusArgument &arg) { base->marshallToDbus(arg, Tags()...); } + template static void baseUnmarshall(T *base, const QDBusArgument &arg) { base->unmarshallFromDbus(arg, Tags()...); } + static void baseMarshall(const void *, QDBusArgument &) {} + static void baseUnmarshall(void *, const QDBusArgument &) {} + static void baseMarshall(const CEmpty *, QDBusArgument &) {} + static void baseUnmarshall(CEmpty *, const QDBusArgument &) {} + }; + + // *INDENT-OFF* + /*! + * When a derived class and a base class both inherit from Mixin::DBusByTuple, + * the derived class uses this macro to disambiguate the inherited members. + */ +# define BLACKMISC_DECLARE_USING_MIXIN_DBUS(DERIVED, ...) \ + using ::BlackMisc::Mixin::DBusByMetaClass::marshallToDbus; \ + using ::BlackMisc::Mixin::DBusByMetaClass::unmarshallFromDbus; + // *INDENT-ON* + + } // Mixin +} // BlackMisc + +#endif // guard diff --git a/src/blackmisc/mixin/mixinhash.h b/src/blackmisc/mixin/mixinhash.h new file mode 100644 index 000000000..41fc4eb63 --- /dev/null +++ b/src/blackmisc/mixin/mixinhash.h @@ -0,0 +1,91 @@ +/* Copyright (C) 2013 + * 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. 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_MIXIN_MIXINHASH_H +#define BLACKMISC_MIXIN_MIXINHASH_H + +#include "blackmisc/metaclass.h" +#include "blackmisc/inheritancetraits.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace BlackMisc +{ + class CEmpty; + + // Needed so that our qHash overload doesn't hide the qHash overloads in the global namespace. + // This will be safe as long as no global qHash has the same signature as ours. + // Alternative would be to qualify all our invokations of the global qHash as ::qHash. + using ::qHash; + + namespace Private + { + //! \cond PRIVATE + // Work around MSVC2015 bug affecting generic lambda + template + struct Hasher + { + template + void operator()(const U &member) { m_hash ^= qHash(member.in(m_object)); } + const T &m_object; + uint &m_hash; + }; + //! \endcond + } + + namespace Mixin + { + /*! + * CRTP class template from which a derived class can inherit common methods dealing with hashing instances by metaclass. + * + * \tparam Derived Must be registered with BLACK_DECLARE_TUPLE_CONVERSION. + */ + template + class HashByMetaClass + { + public: + //! qHash overload, needed for storing value in a QSet. + friend uint qHash(const Derived &value, uint seed = 0) // clazy:exclude=qhash-namespace + { + return ::qHash(hashImpl(value), seed); + } + + private: + static uint hashImpl(const Derived &value) + { + uint hash = baseHash(static_cast *>(&value)); + constexpr auto meta = introspect().without(MetaFlags()); + meta.forEachMember(Private::Hasher { value, hash }); + return hash; + } + + template static uint baseHash(const T *base) { return qHash(*base); } + static uint baseHash(const void *) { return 0; } + static uint baseHash(const CEmpty *) { return 0; } + }; + } +} // namespace BlackMisc + +#endif // BLACKMISC_DICTIONARY_H + diff --git a/src/blackmisc/mixin/mixinicon.h b/src/blackmisc/mixin/mixinicon.h new file mode 100644 index 000000000..73e2982b7 --- /dev/null +++ b/src/blackmisc/mixin/mixinicon.h @@ -0,0 +1,54 @@ +/* Copyright (C) 2013 + * 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. 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_MIXIN_MIXINICON_H +#define BLACKMISC_MIXIN_MIXINICON_H + +#include "blackmisc/icon.h" +#include +#include +#include +#include + +namespace BlackMisc +{ + class CIcon; + + namespace Mixin + { + /*! + * CRTP class template from which a derived class can inherit icon-related functions. + */ + template + class Icon + { + public: + //! As icon, not implemented by all classes + CIcon toIcon() const { return CIcon::iconByIndex(IconIndex); } + + //! As pixmap, required for most GUI views + QPixmap toPixmap() const { return derived()->toIcon().toPixmap(); } + + private: + const Derived *derived() const { return static_cast(this); } + Derived *derived() { return static_cast(this); } + }; + + /*! + * When a derived class and a base class both inherit from Mixin::Icon, + * the derived class uses this macro to disambiguate the inherited members. + */ +# define BLACKMISC_DECLARE_USING_MIXIN_ICON(DERIVED) \ + using ::BlackMisc::Mixin::Icon::toIcon; \ + using ::BlackMisc::Mixin::Icon::toPixmap; + } +} // namespace + +#endif // guard diff --git a/src/blackmisc/mixin/mixinindex.h b/src/blackmisc/mixin/mixinindex.h new file mode 100644 index 000000000..65cd84d3b --- /dev/null +++ b/src/blackmisc/mixin/mixinindex.h @@ -0,0 +1,202 @@ +/* Copyright (C) 2013 + * 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. 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_MIXIN_MIXININDEX_H +#define BLACKMISC_MIXIN_MIXININDEX_H + +#include "blackmisc/inheritancetraits.h" +#include "blackmisc/predicates.h" +#include "blackmisc/propertyindex.h" +#include "blackmisc/propertyindexlist.h" +#include "blackmisc/propertyindexvariantmap.h" +#include "blackmisc/variant.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace BlackMisc +{ + namespace Mixin + { + /*! + * CRTP class template from which a derived class can inherit property indexing functions. + * + * This is only a placeholder for future support of implementing property indexing through the tuple system. + * At the moment, it just implements the default properties: String, Icon, and Pixmap. + */ + template + class Index + { + public: + //! Base class enums + enum ColumnIndex + { + IndexPixmap = 10, // manually set to avoid circular dependencies + IndexIcon, + IndexString + }; + + //! Update by variant map + //! \return number of values changed, with skipEqualValues equal values will not be changed + CPropertyIndexList apply(const CPropertyIndexVariantMap &indexMap, bool skipEqualValues = false); + + //! Set property by index + void setPropertyByIndex(const CPropertyIndex &index, const CVariant &variant); + + //! Property by index + CVariant propertyByIndex(const CPropertyIndex &index) const; + + //! Property by index as String + QString propertyByIndexAsString(const CPropertyIndex &index, bool i18n = false) const; + + //! Compare for index + int comparePropertyByIndex(const CPropertyIndex &index, const Derived &compareValue) const; + + //! Is given variant equal to value of property index? + bool equalsPropertyByIndex(const CVariant &compareValue, const CPropertyIndex &index) const; + + private: + const Derived *derived() const { return static_cast(this); } + Derived *derived() { return static_cast(this); } + + template ::value, int> = 0> + CVariant myself() const { return CVariant::from(*derived()); } + template ::value, int> = 0> + void myself(const CVariant &variant) { *derived() = variant.to(); } + + template ::value, int> = 0> + CVariant myself() const { qFatal("isMyself should have been handled before reaching here"); return {}; } + template ::value, int> = 0> + void myself(const CVariant &) { qFatal("isMyself should have been handled before reaching here"); } + + template + CVariant basePropertyByIndex(const T *base, const CPropertyIndex &index) const { return base->propertyByIndex(index); } + template + void baseSetPropertyByIndex(T *base, const CVariant &var, const CPropertyIndex &index) { base->setPropertyByIndex(index, var); } + + CVariant basePropertyByIndex(const void *, const CPropertyIndex &index) const + { + qFatal("%s", qPrintable("Property by index not found, index: " + index.toQString())); return {}; + } + + void baseSetPropertyByIndex(void *, const CVariant &, const CPropertyIndex &index) + { + qFatal("%s", qPrintable("Property by index not found (setter), index: " + index.toQString())); + } + }; + + /*! + * When a derived class and a base class both inherit from Mixin::Index, + * the derived class uses this macro to disambiguate the inherited members. + */ + // *INDENT-OFF* +# define BLACKMISC_DECLARE_USING_MIXIN_INDEX(DERIVED) \ + using ::BlackMisc::Mixin::Index::apply; \ + using ::BlackMisc::Mixin::Index::setPropertyByIndex; \ + using ::BlackMisc::Mixin::Index::propertyByIndex; \ + using ::BlackMisc::Mixin::Index::propertyByIndexAsString; \ + using ::BlackMisc::Mixin::Index::comparePropertyByIndex; \ + using ::BlackMisc::Mixin::Index::equalsPropertyByIndex; + // *INDENT-ON* + + template + CPropertyIndexList Index::apply(const BlackMisc::CPropertyIndexVariantMap &indexMap, bool skipEqualValues) + { + if (indexMap.isEmpty()) return {}; + + CPropertyIndexList changed; + const auto &map = indexMap.map(); + for (auto it = map.begin(); it != map.end(); ++it) + { + const CVariant value = it.value(); + const CPropertyIndex index = it.key(); + if (skipEqualValues) + { + const bool equal = derived()->equalsPropertyByIndex(value, index); + if (equal) { continue; } + } + derived()->setPropertyByIndex(index, value); + changed.push_back(index); + } + return changed; + } + + template + void Index::setPropertyByIndex(const CPropertyIndex &index, const CVariant &variant) + { + if (index.isMyself()) + { + myself(variant); + } + else + { + baseSetPropertyByIndex(static_cast *>(derived()), variant, index); + } + } + + template + CVariant Index::propertyByIndex(const CPropertyIndex &index) const + { + if (index.isMyself()) { return myself(); } + const auto i = index.frontCasted(); // keep that "auto", otherwise I won's compile + switch (i) + { + case IndexIcon: return CVariant::from(derived()->toIcon()); + case IndexPixmap: return CVariant::from(derived()->toPixmap()); + case IndexString: return CVariant(derived()->toQString()); + default: return basePropertyByIndex(static_cast *>(derived()), index); + } + } + + template + QString Index::propertyByIndexAsString(const CPropertyIndex &index, bool i18n) const + { + return derived()->propertyByIndex(index).toQString(i18n); + } + + template + bool Index::equalsPropertyByIndex(const CVariant &compareValue, const CPropertyIndex &index) const + { + return derived()->propertyByIndex(index) == compareValue; + } + + template + int Index::comparePropertyByIndex(const CPropertyIndex &index, const Derived &compareValue) const + { + if (this == &compareValue) { return 0; } + if (index.isMyself()) { + // slow, only last resort + return derived()->toQString().compare(compareValue.toQString()); + } + + const auto i = index.frontCasted(); + switch (i) + { + case IndexIcon: + case IndexPixmap: + case IndexString: + default: + break; // also covers + } + + // slow, only last resort + return derived()->toQString().compare(compareValue.toQString()); + } + } // ns +} // ns + +#endif // guard diff --git a/src/blackmisc/mixin/mixinjson.h b/src/blackmisc/mixin/mixinjson.h new file mode 100644 index 000000000..92b46b757 --- /dev/null +++ b/src/blackmisc/mixin/mixinjson.h @@ -0,0 +1,208 @@ +/* Copyright (C) 2014 + * 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. 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_MIXIN_MIXINJSON_H +#define BLACKMISC_MIXIN_MIXINJSON_H + +#include "blackmisc/json.h" +#include "blackmisc/inheritancetraits.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace BlackMisc +{ + class CEmpty; + + namespace Mixin + { + /*! + * CRTP class template which will generate marshalling operators for a derived class with its own marshalling implementation. + * + * \tparam Must implement public methods QJsonObject toJson() const and void convertFromJson(const QJsonObject &json). + */ + template + class JsonOperators + { + public: + //! operator >> for JSON + friend const QJsonObject &operator>>(const QJsonObject &json, Derived &obj) + { + obj.convertFromJson(json); + return json; + } + + //! operator >> for JSON + friend const QJsonValue &operator>>(const QJsonValue &json, Derived &obj) + { + obj.convertFromJson(json.toObject()); + return json; + } + + //! operator >> for JSON + friend QJsonValueRef operator>>(QJsonValueRef json, Derived &obj) + { + obj.convertFromJson(json.toObject()); + return json; + } + + //! operator << for JSON + friend QJsonArray &operator<<(QJsonArray &json, const Derived &obj) + { + json.append(obj.toJson()); + return json; + } + + //! operator << for JSON + friend QJsonObject &operator<<(QJsonObject &json, const std::pair &value) + { + json.insert(value.first, QJsonValue(value.second.toJson())); + return json; + } + + //! operator << for JSON + friend QJsonObject &operator<<(QJsonObject &json, const std::pair &value) + { + json[value.first] = QJsonValue(value.second.toJson()); + return json; + } + }; + + /*! + * CRTP class template from which a derived class can inherit common methods dealing with JSON by metatuple. + * + * \see BLACKMISC_DECLARE_USING_MIXIN_JSON + */ + template + class JsonByMetaClass : public JsonOperators + { + public: + //! Cast to JSON object + QJsonObject toJson() const + { + QJsonObject json; + constexpr auto meta = introspect().without(MetaFlags()); + meta.forEachMember([ &, this ](auto member) + { + json << std::make_pair(CExplicitLatin1String(member.latin1Name()), std::cref(member.in(*this->derived()))); + }); + return Json::appendJsonObject(json, baseToJson(static_cast *>(derived()))); + } + + //! Convenience function JSON as string + QString toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented) const + { + QJsonDocument jsonDoc(toJson()); + return jsonDoc.toJson(format); + } + + //! Assign from JSON object + void convertFromJson(const QJsonObject &json) + { + baseConvertFromJson(static_cast *>(derived()), json); + constexpr auto meta = introspect().without(MetaFlags()); + meta.forEachMember([ &, this ](auto member) + { + const auto value = json.value(CExplicitLatin1String(member.latin1Name())); + if (value.isUndefined()) + { + constexpr bool required = false; //! \fixme add RequiredForJson flag in metaclass system + // cppcheck-suppress knownConditionTrueFalse + // QLatin1String used instead of QStringLiteral below since the latter causes an internal compiler bug + // in GCC 8 and higher + if (required) { throw CJsonException(QLatin1String("Missing required member '%1'").arg(member.latin1Name())); } + } + else + { + CJsonScope scope(member.latin1Name()); + Q_UNUSED(scope); + value >> member.in(*this->derived()); + } + }); + } + + //! Assign from JSON object string + void convertFromJson(const QString &jsonString, bool acceptCacheFormat = false) + { + const QJsonObject jsonObject = BlackMisc::Json::jsonObjectFromString(jsonString, acceptCacheFormat); + convertFromJson(jsonObject); + } + + //! Get object from QJsonObject + template + static DerivedObj fromJson(const QJsonObject &json) + { + DerivedObj obj; + obj.convertFromJson(json); + return obj; + } + + //! Get object from JSON string + template + static DerivedObj fromJson(const QString &jsonString, bool acceptCacheJson = false) + { + DerivedObj obj; + if (jsonString.isEmpty()) { return obj; } + const QJsonObject jsonObj = acceptCacheJson ? Json::swiftDataObjectValue(jsonString) : Json::jsonObjectFromString(jsonString); + obj.convertFromJson(jsonObj); + return obj; + } + + //! Get object from JSON string + template + static Derived fromJsonNoThrow(const QString &jsonString, bool acceptCacheJson, bool &success, QString &errMsg) + { + success = false; + Derived obj; + try + { + if (jsonString.isEmpty()) { return obj; } + const QJsonObject jsonObj = acceptCacheJson ? Json::swiftDataObjectValue(jsonString) : Json::jsonObjectFromString(jsonString); + obj.convertFromJson(jsonObj); + success = true; + } + catch (const CJsonException &ex) + { + errMsg = ex.toString("JSON conversion"); + } + return obj; + } + + private: + const Derived *derived() const { return static_cast(this); } + Derived *derived() { return static_cast(this); } + + template static QJsonObject baseToJson(const T *base) { return base->toJson(); } + template static void baseConvertFromJson(T *base, const QJsonObject &json) { base->convertFromJson(json); } + static QJsonObject baseToJson(const void *) { return {}; } + static void baseConvertFromJson(void *, const QJsonObject &) {} + static QJsonObject baseToJson(const CEmpty *) { return {}; } + static void baseConvertFromJson(CEmpty *, const QJsonObject &) {} + }; + + /*! + * When a derived class and a base class both inherit from Mixin::JsonByTuple, + * the derived class uses this macro to disambiguate the inherited members. + */ + #define BLACKMISC_DECLARE_USING_MIXIN_JSON(DERIVED) \ + using ::BlackMisc::Mixin::JsonByMetaClass::toJson; \ + using ::BlackMisc::Mixin::JsonByMetaClass::convertFromJson; + } // Mixin ns +} // guard + +#endif // guard diff --git a/src/blackmisc/mixin/mixinmetatype.h b/src/blackmisc/mixin/mixinmetatype.h new file mode 100644 index 000000000..b2869d427 --- /dev/null +++ b/src/blackmisc/mixin/mixinmetatype.h @@ -0,0 +1,100 @@ +/* Copyright (C) 2013 + * 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. 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_MIXIN_MIXINMETATYPE_H +#define BLACKMISC_MIXIN_MIXINMETATYPE_H + +#include "blackmisc/inheritancetraits.h" +#include "blackmisc/variantprivate.h" +#include +#include +#include + +namespace BlackMisc +{ + namespace Mixin + { + /*! + * CRTP class template from which a derived class can inherit common methods dealing with the metatype of the class. + * + * \see BLACKMISC_DECLARE_USING_MIXIN_METATYPE + */ + template + class MetaType + { + public: + //! Register metadata + static void registerMetadata() + { + Private::MetaTypeHelper::maybeRegisterMetaType(); + } + + //! Returns the Qt meta type ID of this object + //! \remark for CVariant this returns the id of CVariant, not of the encapsulated object. valueVariant.userType()` returns metatype of the contained object + int getMetaTypeId() const + { + return Private::MetaTypeHelper::maybeGetMetaTypeId(); + } + + //! Class name + QString getClassName() const + { + return QMetaType::typeName(getMetaTypeId()); + } + + //! Returns true if this object is an instance of the class with the given meta type ID, or one of its subclasses. + bool isA(int metaTypeId) const + { + if (metaTypeId == QMetaType::UnknownType) { return false; } + if (metaTypeId == getMetaTypeId()) { return true; } + return baseIsA(static_cast *>(derived()), metaTypeId); + } + + private: + const Derived *derived() const { return static_cast(this); } + Derived *derived() { return static_cast(this); } + + template static bool baseIsA(const Base2 *base, int metaTypeId) { return base->isA(metaTypeId); } + static bool baseIsA(const void *, int) { return false; } + }; + + // *INDENT-OFF* + /*! + * When a derived class and a base class both inherit from Mixin::MetaType, + * the derived class uses this macro to disambiguate the inherited members. + */ +# define BLACKMISC_DECLARE_USING_MIXIN_METATYPE(DERIVED) \ + using ::BlackMisc::Mixin::MetaType::registerMetadata; \ + using ::BlackMisc::Mixin::MetaType::getMetaTypeId; \ + using ::BlackMisc::Mixin::MetaType::getClassName; \ + using ::BlackMisc::Mixin::MetaType::isA; + // *INDENT-ON* + + } // Mixin + + /*! + * This registers the value type T with the BlackMisc meta type system, + * making it available for use with the extended feature set of BlackMisc::CVariant. + * + * The implementation (ab)uses the QMetaType converter function registration mechanism + * to store a type-erased representation of the set of operations supported by T. + */ + template + void registerMetaValueType() + { + if (QMetaType::hasRegisteredConverterFunction()) { return; } + auto converter = [](const T &) { static Private::CValueObjectMetaInfo info; return &info; }; + bool ok = QMetaType::registerConverter(converter); + Q_ASSERT(ok); + Q_UNUSED(ok); + } +} // namespace + +#endif diff --git a/src/blackmisc/mixin/mixinstring.h b/src/blackmisc/mixin/mixinstring.h new file mode 100644 index 000000000..052f804de --- /dev/null +++ b/src/blackmisc/mixin/mixinstring.h @@ -0,0 +1,98 @@ +/* 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. 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_MIXIN_MIXINSTRING_H +#define BLACKMISC_MIXIN_MIXINSTRING_H + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace BlackMisc +{ + namespace Mixin + { + /*! + * CRTP class template from which a derived class can inherit string streaming operations. + * + * \tparam Derived Must implement a public method QString convertToQString(bool i18n = false) const. + * + * \see BLACKMISC_DECLARE_USING_MIXIN_STRING + */ + template + class String + { + public: + //! Stream << overload to be used in debugging messages + friend QDebug operator<<(QDebug debug, const Derived &obj) + { + debug << obj.stringForStreaming(); + return debug; + } + + //! Operator << when there is no debug stream + friend QNoDebug operator<<(QNoDebug nodebug, const Derived &obj) + { + Q_UNUSED(obj) + return nodebug; + } + + //! Operator << based on text stream + friend QTextStream &operator<<(QTextStream &stream, const Derived &obj) + { + stream << obj.stringForStreaming(); + return stream; + } + + //! Stream operator << for std::cout + friend std::ostream &operator<<(std::ostream &ostr, const Derived &obj) + { + ostr << obj.stringForStreaming().toStdString(); + return ostr; + } + + //! Cast as QString + QString toQString(bool i18n = false) const { return derived()->convertToQString(i18n); } + + //! Cast to pretty-printed QString + //! \deprecated not really used and just using toQString + QString toFormattedQString(bool i18n = false) const { return derived()->toQString(i18n); } + + //! To std string + std::string toStdString(bool i18n = false) const { return derived()->convertToQString(i18n).toStdString(); } + + //! String for streaming operators + QString stringForStreaming() const { return derived()->convertToQString(); } + + private: + const Derived *derived() const { return static_cast(this); } + Derived *derived() { return static_cast(this); } + }; + + // *INDENT-OFF* + /*! + * When a derived class and a base class both inherit from Mixin::String, + * the derived class uses this macro to disambiguate the inherited members. + */ +# define BLACKMISC_DECLARE_USING_MIXIN_STRING(DERIVED) \ + using ::BlackMisc::Mixin::String::toQString; \ + using ::BlackMisc::Mixin::String::toFormattedQString; \ + using ::BlackMisc::Mixin::String::toStdString; \ + using ::BlackMisc::Mixin::String::stringForStreaming; + // *INDENT-ON* + } // ns +} // ns + +#endif // guard diff --git a/src/blackmisc/network/client.cpp b/src/blackmisc/network/client.cpp index deebc5795..f45ee65a1 100644 --- a/src/blackmisc/network/client.cpp +++ b/src/blackmisc/network/client.cpp @@ -8,8 +8,8 @@ #include "blackmisc/network/client.h" #include "blackmisc/aviation/callsign.h" -#include "blackmisc/compare.h" -#include "blackmisc/icon.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/iconlist.h" #include #include diff --git a/src/blackmisc/network/ecosystem.cpp b/src/blackmisc/network/ecosystem.cpp index 9aa4c6b38..c942c6c3e 100644 --- a/src/blackmisc/network/ecosystem.cpp +++ b/src/blackmisc/network/ecosystem.cpp @@ -7,7 +7,7 @@ */ #include "blackmisc/network/ecosystem.h" -#include "blackmisc/icon.h" +#include "blackmisc/iconlist.h" #include "blackmisc/verify.h" #include "blackmisc/comparefunctions.h" diff --git a/src/blackmisc/network/urllog.cpp b/src/blackmisc/network/urllog.cpp index 81b94ce29..586793738 100644 --- a/src/blackmisc/network/urllog.cpp +++ b/src/blackmisc/network/urllog.cpp @@ -9,6 +9,7 @@ #include "blackmisc/network/urllog.h" #include "blackmisc/network/networkutils.h" #include "blackmisc/propertyindex.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/pch/pch.h b/src/blackmisc/pch/pch.h index 2b18a9422..610336923 100644 --- a/src/blackmisc/pch/pch.h +++ b/src/blackmisc/pch/pch.h @@ -27,7 +27,6 @@ #endif #include "blackmisc/collection.h" -#include "blackmisc/compare.h" #include "blackmisc/containerbase.h" #include "blackmisc/dbus.h" #include "blackmisc/dictionary.h" diff --git a/src/blackmisc/pq/angle.h b/src/blackmisc/pq/angle.h index 924e2a1c6..fbdf80086 100644 --- a/src/blackmisc/pq/angle.h +++ b/src/blackmisc/pq/angle.h @@ -12,7 +12,7 @@ #define BLACKMISC_PQ_ANGLE_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/icon.h" +#include "blackmisc/mixin/mixinicon.h" #include "blackmisc/math/mathutils.h" #include "blackmisc/pq/physicalquantity.h" #include "blackmisc/pq/units.h" diff --git a/src/blackmisc/pq/measurementunit.h b/src/blackmisc/pq/measurementunit.h index 8a7bec489..b4aad2763 100644 --- a/src/blackmisc/pq/measurementunit.h +++ b/src/blackmisc/pq/measurementunit.h @@ -12,9 +12,10 @@ #define BLACKMISC_PQ_MEASUREMENTUNIT_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/dictionary.h" -#include "blackmisc/icon.h" +#include "blackmisc/mixin/mixinhash.h" +#include "blackmisc/mixin/mixinicon.h" #include "blackmisc/math/mathutils.h" +#include "blackmisc/mixin/mixinstring.h" #include "blackmisc/stringutils.h" #include diff --git a/src/blackmisc/pq/physicalquantity.h b/src/blackmisc/pq/physicalquantity.h index 2a651f80b..151914419 100644 --- a/src/blackmisc/pq/physicalquantity.h +++ b/src/blackmisc/pq/physicalquantity.h @@ -12,16 +12,16 @@ #define BLACKMISC_PQ_PHYSICALQUANTITY_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/dbus.h" -#include "blackmisc/datastream.h" -#include "blackmisc/icon.h" -#include "blackmisc/json.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixindatastream.h" +#include "blackmisc/mixin/mixinicon.h" +#include "blackmisc/mixin/mixinjson.h" #include "blackmisc/pq/pqstring.h" #include "blackmisc/pq/units.h" #include "blackmisc/propertyindex.h" -#include "blackmisc/propertyindexvariantmap.h" -#include "blackmisc/stringutils.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinindex.h" +#include "blackmisc/mixin/mixinstring.h" +#include "blackmisc/mixin/mixinmetatype.h" #include #include diff --git a/src/blackmisc/pq/units.h b/src/blackmisc/pq/units.h index 0f2a3e6e1..d6f326357 100644 --- a/src/blackmisc/pq/units.h +++ b/src/blackmisc/pq/units.h @@ -15,10 +15,10 @@ #undef min #include "blackmisc/blackmiscexport.h" -#include "blackmisc/dbus.h" +#include "blackmisc/mixin/mixindbus.h" #include "blackmisc/pq/measurementunit.h" -#include "blackmisc/propertyindexvariantmap.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinindex.h" +#include "blackmisc/mixin/mixinmetatype.h" #include #include diff --git a/src/blackmisc/propertyindex.h b/src/blackmisc/propertyindex.h index e413a53ca..d24fa8d99 100644 --- a/src/blackmisc/propertyindex.h +++ b/src/blackmisc/propertyindex.h @@ -12,15 +12,15 @@ #define BLACKMISC_PROPERTYINDEX_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/compare.h" -#include "blackmisc/dbus.h" -#include "blackmisc/datastream.h" -#include "blackmisc/dictionary.h" -#include "blackmisc/json.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixindatastream.h" +#include "blackmisc/mixin/mixinhash.h" +#include "blackmisc/mixin/mixinjson.h" #include "blackmisc/metaclass.h" -#include "blackmisc/stringutils.h" +#include "blackmisc/mixin/mixinstring.h" #include "blackmisc/typetraits.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinmetatype.h" #include #include diff --git a/src/blackmisc/propertyindexvariantmap.h b/src/blackmisc/propertyindexvariantmap.h index a77575e7f..8166f8d79 100644 --- a/src/blackmisc/propertyindexvariantmap.h +++ b/src/blackmisc/propertyindexvariantmap.h @@ -12,13 +12,14 @@ #define BLACKMISC_PROPERTYINDEXVARIANTMAP_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/compare.h" -#include "blackmisc/dbus.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixindbus.h" #include "blackmisc/inheritancetraits.h" #include "blackmisc/predicates.h" #include "blackmisc/propertyindex.h" #include "blackmisc/propertyindexlist.h" -#include "blackmisc/stringutils.h" +#include "blackmisc/mixin/mixinstring.h" +#include "blackmisc/mixin/mixinmetatype.h" #include "blackmisc/variant.h" #include @@ -33,93 +34,6 @@ namespace BlackMisc { - class CPropertyIndexVariantMap; - - namespace Mixin - { - /*! - * CRTP class template from which a derived class can inherit property indexing functions. - * - * This is only a placeholder for future support of implementing property indexing through the tuple system. - * At the moment, it just implements the default properties: String, Icon, and Pixmap. - */ - template - class Index - { - public: - //! Base class enums - enum ColumnIndex - { - IndexPixmap = 10, // manually set to avoid circular dependencies - IndexIcon, - IndexString - }; - - //! Update by variant map - //! \return number of values changed, with skipEqualValues equal values will not be changed - CPropertyIndexList apply(const CPropertyIndexVariantMap &indexMap, bool skipEqualValues = false); - - //! Set property by index - void setPropertyByIndex(const CPropertyIndex &index, const CVariant &variant); - - //! Property by index - CVariant propertyByIndex(const CPropertyIndex &index) const; - - //! Property by index as String - QString propertyByIndexAsString(const CPropertyIndex &index, bool i18n = false) const; - - //! Compare for index - int comparePropertyByIndex(const CPropertyIndex &index, const Derived &compareValue) const; - - //! Is given variant equal to value of property index? - bool equalsPropertyByIndex(const CVariant &compareValue, const CPropertyIndex &index) const; - - private: - const Derived *derived() const { return static_cast(this); } - Derived *derived() { return static_cast(this); } - - template ::value, int> = 0> - CVariant myself() const { return CVariant::from(*derived()); } - template ::value, int> = 0> - void myself(const CVariant &variant) { *derived() = variant.to(); } - - template ::value, int> = 0> - CVariant myself() const { qFatal("isMyself should have been handled before reaching here"); return {}; } - template ::value, int> = 0> - void myself(const CVariant &) { qFatal("isMyself should have been handled before reaching here"); } - - template - CVariant basePropertyByIndex(const T *base, const CPropertyIndex &index) const { return base->propertyByIndex(index); } - template - void baseSetPropertyByIndex(T *base, const CVariant &var, const CPropertyIndex &index) { base->setPropertyByIndex(index, var); } - - CVariant basePropertyByIndex(const void *, const CPropertyIndex &index) const - { - qFatal("%s", qPrintable("Property by index not found, index: " + index.toQString())); return {}; - } - - void baseSetPropertyByIndex(void *, const CVariant &, const CPropertyIndex &index) - { - qFatal("%s", qPrintable("Property by index not found (setter), index: " + index.toQString())); - } - }; - - /*! - * When a derived class and a base class both inherit from Mixin::Index, - * the derived class uses this macro to disambiguate the inherited members. - */ - // *INDENT-OFF* -# define BLACKMISC_DECLARE_USING_MIXIN_INDEX(DERIVED) \ - using ::BlackMisc::Mixin::Index::apply; \ - using ::BlackMisc::Mixin::Index::setPropertyByIndex; \ - using ::BlackMisc::Mixin::Index::propertyByIndex; \ - using ::BlackMisc::Mixin::Index::propertyByIndexAsString; \ - using ::BlackMisc::Mixin::Index::comparePropertyByIndex; \ - using ::BlackMisc::Mixin::Index::equalsPropertyByIndex; - // *INDENT-ON* - - } // Mixin - /*! * Specialized value object compliant map for variants, * based on indexes @@ -225,93 +139,6 @@ namespace BlackMisc //! \copydoc BlackMisc::Mixin::DataStreamByMetaClass::unmarshalFromDataStream void unmarshalFromDataStream(QDataStream &stream); }; - - namespace Mixin - { - template - CPropertyIndexList Index::apply(const BlackMisc::CPropertyIndexVariantMap &indexMap, bool skipEqualValues) - { - if (indexMap.isEmpty()) return {}; - - CPropertyIndexList changed; - const auto &map = indexMap.map(); - for (auto it = map.begin(); it != map.end(); ++it) - { - const CVariant value = it.value(); - const CPropertyIndex index = it.key(); - if (skipEqualValues) - { - const bool equal = derived()->equalsPropertyByIndex(value, index); - if (equal) { continue; } - } - derived()->setPropertyByIndex(index, value); - changed.push_back(index); - } - return changed; - } - - template - void Index::setPropertyByIndex(const CPropertyIndex &index, const CVariant &variant) - { - if (index.isMyself()) - { - myself(variant); - } - else - { - baseSetPropertyByIndex(static_cast *>(derived()), variant, index); - } - } - - template - CVariant Index::propertyByIndex(const CPropertyIndex &index) const - { - if (index.isMyself()) { return myself(); } - const auto i = index.frontCasted(); // keep that "auto", otherwise I won's compile - switch (i) - { - case IndexIcon: return CVariant::from(derived()->toIcon()); - case IndexPixmap: return CVariant::from(derived()->toPixmap()); - case IndexString: return CVariant(derived()->toQString()); - default: return basePropertyByIndex(static_cast *>(derived()), index); - } - } - - template - QString Index::propertyByIndexAsString(const CPropertyIndex &index, bool i18n) const - { - return derived()->propertyByIndex(index).toQString(i18n); - } - - template - bool Index::equalsPropertyByIndex(const CVariant &compareValue, const CPropertyIndex &index) const - { - return derived()->propertyByIndex(index) == compareValue; - } - - template - int Index::comparePropertyByIndex(const CPropertyIndex &index, const Derived &compareValue) const - { - if (this == &compareValue) { return 0; } - if (index.isMyself()) { - // slow, only last resort - return derived()->toQString().compare(compareValue.toQString()); - } - - const auto i = index.frontCasted(); - switch (i) - { - case IndexIcon: - case IndexPixmap: - case IndexString: - default: - break; // also covers - } - - // slow, only last resort - return derived()->toQString().compare(compareValue.toQString()); - } - } // Mixin } // ns Q_DECLARE_METATYPE(BlackMisc::CPropertyIndexVariantMap) diff --git a/src/blackmisc/rgbcolor.cpp b/src/blackmisc/rgbcolor.cpp index 62eccec3a..427fb0c83 100644 --- a/src/blackmisc/rgbcolor.cpp +++ b/src/blackmisc/rgbcolor.cpp @@ -7,7 +7,7 @@ */ #include "blackmisc/rgbcolor.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/comparefunctions.h" #include "blackmisc/icons.h" #include "blackmisc/stringutils.h" diff --git a/src/blackmisc/sequence.h b/src/blackmisc/sequence.h index 760582e8b..a2c9ea96c 100644 --- a/src/blackmisc/sequence.h +++ b/src/blackmisc/sequence.h @@ -13,7 +13,7 @@ #include "blackmisc/containerbase.h" #include "blackmisc/propertyindex.h" -#include "blackmisc/icon.h" +#include "blackmisc/mixin/mixinicon.h" #include #include #include diff --git a/src/blackmisc/simulation/aircraftmatchersetup.cpp b/src/blackmisc/simulation/aircraftmatchersetup.cpp index a318e2154..0eb89a14f 100644 --- a/src/blackmisc/simulation/aircraftmatchersetup.cpp +++ b/src/blackmisc/simulation/aircraftmatchersetup.cpp @@ -7,6 +7,7 @@ */ #include "blackmisc/simulation/aircraftmatchersetup.h" +#include "blackmisc/stringutils.h" #include namespace BlackMisc diff --git a/src/blackmisc/simulation/aircraftmodel.cpp b/src/blackmisc/simulation/aircraftmodel.cpp index 291acdc55..6b5162482 100644 --- a/src/blackmisc/simulation/aircraftmodel.cpp +++ b/src/blackmisc/simulation/aircraftmodel.cpp @@ -15,8 +15,9 @@ #include "blackmisc/logcategorylist.h" #include "blackmisc/logcategory.h" #include "blackmisc/statusmessage.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/verify.h" +#include "blackmisc/stringutils.h" #include "blackconfig/buildconfig.h" #include diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index 468744cef..c68815b6f 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -12,7 +12,7 @@ #include "blackmisc/aviation/callsign.h" #include "blackmisc/aviation/logutils.h" #include "blackmisc/math/mathutils.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/iterator.h" #include "blackmisc/range.h" #include "blackmisc/fileutils.h" diff --git a/src/blackmisc/simulation/aircraftmodelloader.cpp b/src/blackmisc/simulation/aircraftmodelloader.cpp index 574ee34ff..18e7a4f63 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelloader.cpp @@ -12,7 +12,7 @@ #include "blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h" #include "blackmisc/simulation/xplane/xplaneutil.h" #include "blackmisc/directoryutils.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/logmessage.h" #include diff --git a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp index ade8b8a96..79af1ce6e 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp +++ b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp @@ -14,6 +14,7 @@ #include "blackmisc/logmessage.h" #include "blackmisc/statusmessagelist.h" #include "blackmisc/worker.h" +#include "blackmisc/stringutils.h" #include "blackconfig/buildconfig.h" #include diff --git a/src/blackmisc/simulation/fscommon/vpilotmodelruleset.h b/src/blackmisc/simulation/fscommon/vpilotmodelruleset.h index a2cc73630..2fdfcb72d 100644 --- a/src/blackmisc/simulation/fscommon/vpilotmodelruleset.h +++ b/src/blackmisc/simulation/fscommon/vpilotmodelruleset.h @@ -17,7 +17,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/collection.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/sequence.h" #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/fscommon/vpilotmodelrule.h" diff --git a/src/blackmisc/simulation/fscommon/vpilotrulesreader.cpp b/src/blackmisc/simulation/fscommon/vpilotrulesreader.cpp index a3782fdde..b8c2c5fca 100644 --- a/src/blackmisc/simulation/fscommon/vpilotrulesreader.cpp +++ b/src/blackmisc/simulation/fscommon/vpilotrulesreader.cpp @@ -11,6 +11,7 @@ #include "blackmisc/simulation/fscommon/vpilotrulesreader.h" #include "blackmisc/statusmessage.h" #include "blackmisc/worker.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/simulation/interpolationlogger.cpp b/src/blackmisc/simulation/interpolationlogger.cpp index 7520e6c92..5efa54545 100644 --- a/src/blackmisc/simulation/interpolationlogger.cpp +++ b/src/blackmisc/simulation/interpolationlogger.cpp @@ -18,6 +18,7 @@ #include "blackmisc/worker.h" #include "blackmisc/swiftdirectories.h" #include "blackmisc/directoryutils.h" +#include "blackmisc/stringutils.h" #include "blackconfig/buildconfig.h" #include #include diff --git a/src/blackmisc/simulation/interpolator.cpp b/src/blackmisc/simulation/interpolator.cpp index 7660d5841..e97082b51 100644 --- a/src/blackmisc/simulation/interpolator.cpp +++ b/src/blackmisc/simulation/interpolator.cpp @@ -20,6 +20,7 @@ #include "blackmisc/pq/length.h" #include "blackmisc/logmessage.h" #include "blackmisc/verify.h" +#include "blackmisc/stringutils.h" #include #include #include diff --git a/src/blackmisc/simulation/interpolatorlinear.cpp b/src/blackmisc/simulation/interpolatorlinear.cpp index e01575af5..881d0a681 100644 --- a/src/blackmisc/simulation/interpolatorlinear.cpp +++ b/src/blackmisc/simulation/interpolatorlinear.cpp @@ -14,7 +14,7 @@ #include "blackmisc/pq/length.h" #include "blackmisc/pq/physicalquantity.h" #include "blackmisc/logmessage.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/verify.h" #include "blackmisc/range.h" #include "blackmisc/sequence.h" diff --git a/src/blackmisc/simulation/matchingstatistics.h b/src/blackmisc/simulation/matchingstatistics.h index ec0b1b904..31438e8f2 100644 --- a/src/blackmisc/simulation/matchingstatistics.h +++ b/src/blackmisc/simulation/matchingstatistics.h @@ -15,6 +15,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/timestampobjectlist.h" #include "blackmisc/collection.h" +#include "blackmisc/mixin/mixinmetatype.h" namespace BlackMisc { diff --git a/src/blackmisc/simulation/remoteaircraftprovider.cpp b/src/blackmisc/simulation/remoteaircraftprovider.cpp index 1a600b860..8cb9206f4 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.cpp +++ b/src/blackmisc/simulation/remoteaircraftprovider.cpp @@ -12,6 +12,7 @@ #include "blackmisc/logmessage.h" #include "blackmisc/json.h" #include "blackmisc/verify.h" +#include "blackmisc/stringutils.h" #include "blackconfig/buildconfig.h" using namespace BlackMisc::Aviation; diff --git a/src/blackmisc/simulation/simulatedaircraft.h b/src/blackmisc/simulation/simulatedaircraft.h index bf84f02c4..a0fb143c5 100644 --- a/src/blackmisc/simulation/simulatedaircraft.h +++ b/src/blackmisc/simulation/simulatedaircraft.h @@ -28,7 +28,7 @@ #include "blackmisc/pq/frequency.h" #include "blackmisc/pq/length.h" #include "blackmisc/blackmiscexport.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/icon.h" #include "blackmisc/metaclass.h" #include "blackmisc/propertyindex.h" diff --git a/src/blackmisc/simulation/simulatedaircraftlist.cpp b/src/blackmisc/simulation/simulatedaircraftlist.cpp index 927314985..c844c475d 100644 --- a/src/blackmisc/simulation/simulatedaircraftlist.cpp +++ b/src/blackmisc/simulation/simulatedaircraftlist.cpp @@ -11,7 +11,7 @@ #include "blackmisc/aviation/aircrafticaocode.h" #include "blackmisc/aviation/airlineicaocode.h" #include "blackmisc/aviation/callsign.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/network/user.h" #include "blackmisc/predicates.h" #include "blackmisc/range.h" diff --git a/src/blackmisc/simulation/xplane/xswiftbusconfigwriter.cpp b/src/blackmisc/simulation/xplane/xswiftbusconfigwriter.cpp index c9ab76d81..9c2bf5b48 100644 --- a/src/blackmisc/simulation/xplane/xswiftbusconfigwriter.cpp +++ b/src/blackmisc/simulation/xplane/xswiftbusconfigwriter.cpp @@ -11,6 +11,7 @@ #include "blackmisc/simulation/xplane/xswiftbusconfigwriter.h" #include "blackmisc/simulation/xplane/xplaneutil.h" #include "blackmisc/dbusserver.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/statusmessage.h b/src/blackmisc/statusmessage.h index 98be0d3f4..21e305d56 100644 --- a/src/blackmisc/statusmessage.h +++ b/src/blackmisc/statusmessage.h @@ -14,11 +14,12 @@ #include "blackmisc/logcategorylist.h" #include "blackmisc/timestampbased.h" #include "blackmisc/orderable.h" -#include "blackmisc/icon.h" +#include "blackmisc/mixin/mixinicon.h" #include "blackmisc/propertyindex.h" -#include "blackmisc/stringutils.h" +#include "blackmisc/mixin/mixinstring.h" #include "blackmisc/typetraits.h" #include "blackmisc/blackmiscexport.h" +#include "blackmisc/stringutils.h" #include diff --git a/src/blackmisc/statusmessagelist.cpp b/src/blackmisc/statusmessagelist.cpp index c67805cd9..99620b019 100644 --- a/src/blackmisc/statusmessagelist.cpp +++ b/src/blackmisc/statusmessagelist.cpp @@ -9,7 +9,7 @@ //! \cond PRIVATE #include "blackmisc/statusmessagelist.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/range.h" #include diff --git a/src/blackmisc/stringutils.h b/src/blackmisc/stringutils.h index fad75677d..2a884a600 100644 --- a/src/blackmisc/stringutils.h +++ b/src/blackmisc/stringutils.h @@ -311,78 +311,6 @@ namespace BlackMisc //! Remove leading 0, trailing 0, " ", and "." from a number BLACKMISC_EXPORT QString cleanNumber(const QString &number); - namespace Mixin - { - /*! - * CRTP class template from which a derived class can inherit string streaming operations. - * - * \tparam Derived Must implement a public method QString convertToQString(bool i18n = false) const. - * - * \see BLACKMISC_DECLARE_USING_MIXIN_STRING - */ - template - class String - { - public: - //! Stream << overload to be used in debugging messages - friend QDebug operator<<(QDebug debug, const Derived &obj) - { - debug << obj.stringForStreaming(); - return debug; - } - - //! Operator << when there is no debug stream - friend QNoDebug operator<<(QNoDebug nodebug, const Derived &obj) - { - Q_UNUSED(obj) - return nodebug; - } - - //! Operator << based on text stream - friend QTextStream &operator<<(QTextStream &stream, const Derived &obj) - { - stream << obj.stringForStreaming(); - return stream; - } - - //! Stream operator << for std::cout - friend std::ostream &operator<<(std::ostream &ostr, const Derived &obj) - { - ostr << obj.stringForStreaming().toStdString(); - return ostr; - } - - //! Cast as QString - QString toQString(bool i18n = false) const { return derived()->convertToQString(i18n); } - - //! Cast to pretty-printed QString - //! \deprecated not really used and just using toQString - QString toFormattedQString(bool i18n = false) const { return derived()->toQString(i18n); } - - //! To std string - std::string toStdString(bool i18n = false) const { return derived()->convertToQString(i18n).toStdString(); } - - //! String for streaming operators - QString stringForStreaming() const { return derived()->convertToQString(); } - - private: - const Derived *derived() const { return static_cast(this); } - Derived *derived() { return static_cast(this); } - }; - - // *INDENT-OFF* - /*! - * When a derived class and a base class both inherit from Mixin::String, - * the derived class uses this macro to disambiguate the inherited members. - */ -# define BLACKMISC_DECLARE_USING_MIXIN_STRING(DERIVED) \ - using ::BlackMisc::Mixin::String::toQString; \ - using ::BlackMisc::Mixin::String::toFormattedQString; \ - using ::BlackMisc::Mixin::String::toStdString; \ - using ::BlackMisc::Mixin::String::stringForStreaming; - // *INDENT-ON* - } // ns - /*! * Stringification traits class. */ diff --git a/src/blackmisc/valuecache.h b/src/blackmisc/valuecache.h index 4891b24fe..0614ace9c 100644 --- a/src/blackmisc/valuecache.h +++ b/src/blackmisc/valuecache.h @@ -12,9 +12,10 @@ #define BLACKMISC_VALUECACHE_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/compare.h" -#include "blackmisc/dbus.h" -#include "blackmisc/datastream.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixindatastream.h" +#include "blackmisc/mixin/mixinhash.h" #include "blackmisc/dictionary.h" #include "blackmisc/identifier.h" #include "blackmisc/metaclass.h" @@ -23,7 +24,7 @@ #include "blackmisc/slot.h" #include "blackmisc/statusmessagelist.h" #include "blackmisc/valuecacheprivate.h" -#include "blackmisc/variant.h" +#include "blackmisc/mixin/mixinmetatype.h" #include "blackmisc/variantmap.h" #include diff --git a/src/blackmisc/valueobject.h b/src/blackmisc/valueobject.h index 6f55a8a66..95dc04750 100644 --- a/src/blackmisc/valueobject.h +++ b/src/blackmisc/valueobject.h @@ -12,16 +12,16 @@ #define BLACKMISC_VALUEOBJECT_H #include "blackmisc/blackmiscexport.h" -#include "blackmisc/dbus.h" -#include "blackmisc/datastream.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixindatastream.h" #include "blackmisc/metaclass.h" -#include "blackmisc/json.h" -#include "blackmisc/compare.h" -#include "blackmisc/variant.h" -#include "blackmisc/propertyindexvariantmap.h" -#include "blackmisc/iconlist.h" -#include "blackmisc/dictionary.h" -#include "blackmisc/stringutils.h" +#include "blackmisc/mixin/mixinjson.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixinmetatype.h" +#include "blackmisc/mixin/mixinindex.h" +#include "blackmisc/mixin/mixinicon.h" +#include "blackmisc/mixin/mixinhash.h" +#include "blackmisc/mixin/mixinstring.h" #include #include diff --git a/src/blackmisc/variant.cpp b/src/blackmisc/variant.cpp index 28758b763..6ca9afdff 100644 --- a/src/blackmisc/variant.cpp +++ b/src/blackmisc/variant.cpp @@ -16,6 +16,7 @@ #include "blackmisc/propertyindex.h" #include "blackmisc/statusmessage.h" #include "blackmisc/variantlist.h" +#include "blackmisc/stringutils.h" #include #include diff --git a/src/blackmisc/variant.h b/src/blackmisc/variant.h index bdbdf98ec..17e8da961 100644 --- a/src/blackmisc/variant.h +++ b/src/blackmisc/variant.h @@ -13,13 +13,14 @@ #include "blackmisc/blackmiscexport.h" -#include "blackmisc/compare.h" -#include "blackmisc/dbus.h" -#include "blackmisc/datastream.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixindbus.h" +#include "blackmisc/mixin/mixindatastream.h" #include "blackmisc/inheritancetraits.h" -#include "blackmisc/json.h" +#include "blackmisc/mixin/mixinjson.h" #include "blackmisc/range.h" -#include "blackmisc/stringutils.h" +#include "blackmisc/mixin/mixinstring.h" +#include "blackmisc/mixin/mixinmetatype.h" #include "blackmisc/variantprivate.h" #include @@ -39,83 +40,6 @@ namespace BlackMisc class CPropertyIndex; class CVariantList; - namespace Mixin - { - /*! - * CRTP class template from which a derived class can inherit common methods dealing with the metatype of the class. - * - * \see BLACKMISC_DECLARE_USING_MIXIN_METATYPE - */ - template - class MetaType - { - public: - //! Register metadata - static void registerMetadata() - { - Private::MetaTypeHelper::maybeRegisterMetaType(); - } - - //! Returns the Qt meta type ID of this object - //! \remark for CVariant this returns the id of CVariant, not of the encapsulated object. valueVariant.userType()` returns metatype of the contained object - int getMetaTypeId() const - { - return Private::MetaTypeHelper::maybeGetMetaTypeId(); - } - - //! Class name - QString getClassName() const - { - return QMetaType::typeName(getMetaTypeId()); - } - - //! Returns true if this object is an instance of the class with the given meta type ID, or one of its subclasses. - bool isA(int metaTypeId) const - { - if (metaTypeId == QMetaType::UnknownType) { return false; } - if (metaTypeId == getMetaTypeId()) { return true; } - return baseIsA(static_cast *>(derived()), metaTypeId); - } - - private: - const Derived *derived() const { return static_cast(this); } - Derived *derived() { return static_cast(this); } - - template static bool baseIsA(const Base2 *base, int metaTypeId) { return base->isA(metaTypeId); } - static bool baseIsA(const void *, int) { return false; } - }; - - // *INDENT-OFF* - /*! - * When a derived class and a base class both inherit from Mixin::MetaType, - * the derived class uses this macro to disambiguate the inherited members. - */ -# define BLACKMISC_DECLARE_USING_MIXIN_METATYPE(DERIVED) \ - using ::BlackMisc::Mixin::MetaType::registerMetadata; \ - using ::BlackMisc::Mixin::MetaType::getMetaTypeId; \ - using ::BlackMisc::Mixin::MetaType::getClassName; \ - using ::BlackMisc::Mixin::MetaType::isA; - // *INDENT-ON* - - } // Mixin - - /*! - * This registers the value type T with the BlackMisc meta type system, - * making it available for use with the extended feature set of BlackMisc::CVariant. - * - * The implementation (ab)uses the QMetaType converter function registration mechanism - * to store a type-erased representation of the set of operations supported by T. - */ - template - void registerMetaValueType() - { - if (QMetaType::hasRegisteredConverterFunction()) { return; } - auto converter = [](const T &) { static Private::CValueObjectMetaInfo info; return &info; }; - bool ok = QMetaType::registerConverter(converter); - Q_ASSERT(ok); - Q_UNUSED(ok); - } - /*! * Wrapper around QVariant which provides transparent access to CValueObject methods * of the contained object if it is registered with BlackMisc::registerMetaValueType. diff --git a/src/blackmisc/variantmap.h b/src/blackmisc/variantmap.h index 0e32bd1d3..435a8be49 100644 --- a/src/blackmisc/variantmap.h +++ b/src/blackmisc/variantmap.h @@ -12,6 +12,7 @@ #define BLACKMISC_VARIANTMAP_H #include "blackmisc/blackmiscexport.h" +#include "blackmisc/mixin/mixinhash.h" #include "blackmisc/dictionary.h" #include "blackmisc/variant.h" diff --git a/src/blackmisc/weather/cloudlayerlist.cpp b/src/blackmisc/weather/cloudlayerlist.cpp index c832033e3..38adad087 100644 --- a/src/blackmisc/weather/cloudlayerlist.cpp +++ b/src/blackmisc/weather/cloudlayerlist.cpp @@ -7,7 +7,7 @@ */ #include "blackmisc/aviation/altitude.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/weather/cloudlayerlist.h" using namespace BlackMisc::Aviation; diff --git a/src/blackmisc/weather/metarlist.h b/src/blackmisc/weather/metarlist.h index eba684838..aeb9faa97 100644 --- a/src/blackmisc/weather/metarlist.h +++ b/src/blackmisc/weather/metarlist.h @@ -14,7 +14,7 @@ #include "blackmisc/aviation/airporticaocode.h" #include "blackmisc/blackmiscexport.h" #include "blackmisc/collection.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/sequence.h" #include "blackmisc/variant.h" #include "blackmisc/weather/metar.h" diff --git a/src/blackmisc/weather/temperaturelayerlist.cpp b/src/blackmisc/weather/temperaturelayerlist.cpp index 142f49a9b..7a1c7cfec 100644 --- a/src/blackmisc/weather/temperaturelayerlist.cpp +++ b/src/blackmisc/weather/temperaturelayerlist.cpp @@ -7,7 +7,7 @@ */ #include "blackmisc/aviation/altitude.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/weather/temperaturelayerlist.h" using namespace BlackMisc::Aviation; diff --git a/src/blackmisc/weather/visibilitylayerlist.cpp b/src/blackmisc/weather/visibilitylayerlist.cpp index a43e42f5c..1a067caf0 100644 --- a/src/blackmisc/weather/visibilitylayerlist.cpp +++ b/src/blackmisc/weather/visibilitylayerlist.cpp @@ -7,7 +7,7 @@ */ #include "blackmisc/aviation/altitude.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/weather/visibilitylayerlist.h" using namespace BlackMisc::Aviation; diff --git a/src/blackmisc/weather/windlayerlist.cpp b/src/blackmisc/weather/windlayerlist.cpp index d3aad0c15..8f1b73012 100644 --- a/src/blackmisc/weather/windlayerlist.cpp +++ b/src/blackmisc/weather/windlayerlist.cpp @@ -7,7 +7,7 @@ */ #include "blackmisc/aviation/altitude.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/weather/windlayerlist.h" using namespace BlackMisc::Aviation; diff --git a/src/plugins/simulator/flightgear/simulatorflightgear.cpp b/src/plugins/simulator/flightgear/simulatorflightgear.cpp index d902e0d7e..a5c4881cf 100644 --- a/src/plugins/simulator/flightgear/simulatorflightgear.cpp +++ b/src/plugins/simulator/flightgear/simulatorflightgear.cpp @@ -46,7 +46,7 @@ #include "blackmisc/pq/speed.h" #include "blackmisc/pq/temperature.h" #include "blackmisc/verify.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/dbusserver.h" #include "blackmisc/iterator.h" #include "blackmisc/logmessage.h" diff --git a/src/plugins/simulator/fs9/directplayerror.h b/src/plugins/simulator/fs9/directplayerror.h index a32681017..a8cea5e1e 100644 --- a/src/plugins/simulator/fs9/directplayerror.h +++ b/src/plugins/simulator/fs9/directplayerror.h @@ -11,6 +11,10 @@ #ifndef BLACKSIMPLUGIN_FS9_DIRECTPLAYERROR_H #define BLACKSIMPLUGIN_FS9_DIRECTPLAYERROR_H +#ifndef NOMINMAX +#define NOMINMAX +#endif + #include namespace BlackSimPlugin diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 2673ea930..868c168e5 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -48,7 +48,7 @@ #include "blackmisc/pq/speed.h" #include "blackmisc/pq/temperature.h" #include "blackmisc/verify.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/dbusserver.h" #include "blackmisc/iterator.h" #include "blackmisc/logmessage.h" diff --git a/src/swiftguistandard/swiftguistdaircraft.cpp b/src/swiftguistandard/swiftguistdaircraft.cpp index a160c7fb3..4e2a1650f 100644 --- a/src/swiftguistandard/swiftguistdaircraft.cpp +++ b/src/swiftguistandard/swiftguistdaircraft.cpp @@ -8,7 +8,7 @@ #include "blackcore/context/contextownaircraft.h" #include "blackgui/guiapplication.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/geo/coordinategeodetic.h" #include "blackmisc/geo/latitude.h" #include "blackmisc/geo/longitude.h" diff --git a/tests/blackmisc/aviation/testaviation/testaviation.cpp b/tests/blackmisc/aviation/testaviation/testaviation.cpp index 9857e4814..258821722 100644 --- a/tests/blackmisc/aviation/testaviation/testaviation.cpp +++ b/tests/blackmisc/aviation/testaviation/testaviation.cpp @@ -22,7 +22,7 @@ #include "blackmisc/aviation/informationmessage.h" #include "blackmisc/aviation/navsystem.h" #include "blackmisc/aviation/transponder.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/geo/coordinategeodetic.h" #include "blackmisc/geo/latitude.h" #include "blackmisc/geo/longitude.h" diff --git a/tests/blackmisc/input/testinput/testinput.cpp b/tests/blackmisc/input/testinput/testinput.cpp index a3a384071..83e5c0ca7 100644 --- a/tests/blackmisc/input/testinput/testinput.cpp +++ b/tests/blackmisc/input/testinput/testinput.cpp @@ -10,7 +10,7 @@ //! \file //! \ingroup testblackmisc -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/identifier.h" #include "blackmisc/input/actionhotkey.h" #include "blackmisc/input/actionhotkeylist.h" diff --git a/tests/blackmisc/simulation/testinterpolatorlinear/testinterpolatorlinear.cpp b/tests/blackmisc/simulation/testinterpolatorlinear/testinterpolatorlinear.cpp index 3e159867b..c53815057 100644 --- a/tests/blackmisc/simulation/testinterpolatorlinear/testinterpolatorlinear.cpp +++ b/tests/blackmisc/simulation/testinterpolatorlinear/testinterpolatorlinear.cpp @@ -29,7 +29,7 @@ #include "blackmisc/pq/physicalquantity.h" #include "blackmisc/pq/speed.h" #include "blackmisc/pq/units.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "test.h" #include diff --git a/tests/blackmisc/testidentifier/testidentifier.cpp b/tests/blackmisc/testidentifier/testidentifier.cpp index e0e3048d8..c500b1424 100644 --- a/tests/blackmisc/testidentifier/testidentifier.cpp +++ b/tests/blackmisc/testidentifier/testidentifier.cpp @@ -10,7 +10,7 @@ //! \file //! \ingroup testblackmisc -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/identifier.h" #include "blackmisc/identifiable.h" #include "test.h" diff --git a/tests/blackmisc/testvariantandmap/testvariantandmap.cpp b/tests/blackmisc/testvariantandmap/testvariantandmap.cpp index 3f871c7e5..8071d50a4 100644 --- a/tests/blackmisc/testvariantandmap/testvariantandmap.cpp +++ b/tests/blackmisc/testvariantandmap/testvariantandmap.cpp @@ -16,7 +16,8 @@ #include "blackmisc/aviation/airlineicaocodelist.h" #include "blackmisc/aviation/atcstation.h" #include "blackmisc/aviation/callsign.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" +#include "blackmisc/mixin/mixinmetatype.h" #include "blackmisc/geo/coordinategeodetic.h" #include "blackmisc/network/user.h" #include "blackmisc/pq/frequency.h" diff --git a/tests/blackmisc/weather/testweather/testweather.cpp b/tests/blackmisc/weather/testweather/testweather.cpp index 7505e4882..91c80f0ec 100644 --- a/tests/blackmisc/weather/testweather/testweather.cpp +++ b/tests/blackmisc/weather/testweather/testweather.cpp @@ -12,7 +12,7 @@ #include "blackmisc/aviation/airporticaocode.h" #include "blackmisc/aviation/altitude.h" -#include "blackmisc/compare.h" +#include "blackmisc/mixin/mixincompare.h" #include "blackmisc/pq/angle.h" #include "blackmisc/pq/length.h" #include "blackmisc/pq/physicalquantity.h"