From 94831a1e9175ca09e697993b43d3f6b4989b8b0b Mon Sep 17 00:00:00 2001 From: Lars Toenning Date: Sun, 24 Aug 2025 22:29:42 +0200 Subject: [PATCH] refactor: Use C++20 ranges --- src/core/vatsim/vatsimdatafilereader.cpp | 21 +++++++++++++------ src/gui/models/statusmessagefilter.cpp | 12 +++++------ src/misc/aviation/atcstationlist.cpp | 6 ++++-- src/misc/aviation/liverylist.cpp | 14 +++++++------ src/misc/identifierlist.cpp | 4 +++- src/misc/logcategorylist.cpp | 5 ++++- src/misc/namevariantpairlist.cpp | 6 ++++-- src/misc/range.h | 11 ---------- .../fscommon/aircraftcfgentrieslist.cpp | 4 +++- src/misc/simulation/simulatedaircraftlist.cpp | 9 +++++--- .../simulation/simulatorplugininfolist.cpp | 4 +++- src/misc/stringutils.h | 6 ++++-- src/misc/variant.h | 9 ++++++-- 13 files changed, 67 insertions(+), 44 deletions(-) diff --git a/src/core/vatsim/vatsimdatafilereader.cpp b/src/core/vatsim/vatsimdatafilereader.cpp index a65ee3381..b907d8bed 100644 --- a/src/core/vatsim/vatsimdatafilereader.cpp +++ b/src/core/vatsim/vatsimdatafilereader.cpp @@ -3,6 +3,8 @@ #include "core/vatsim/vatsimdatafilereader.h" +#include + #include #include #include @@ -81,8 +83,11 @@ namespace swift::core::vatsim CUserList CVatsimDataFileReader::getPilotsForCallsigns(const CCallsignSet &callsigns) const { - return this->getAircraft().findByCallsigns(callsigns).transform( - predicates::MemberTransform(&CSimulatedAircraft::getPilot)); + auto view = this->getAircraft() | std::views::filter([&](const CSimulatedAircraft &aircraft) { + return callsigns.contains(aircraft.getCallsign()); + }) | + std::views::transform([](const CSimulatedAircraft &aircraft) { return aircraft.getPilot(); }); + return { view.begin(), view.end() }; } CUserList CVatsimDataFileReader::getPilotsForCallsign(const CCallsign &callsign) const @@ -130,8 +135,11 @@ namespace swift::core::vatsim CUserList CVatsimDataFileReader::getControllersForCallsigns(const CCallsignSet &callsigns) const { - return this->getAtcStations().findByCallsigns(callsigns).transform( - predicates::MemberTransform(&CAtcStation::getController)); + auto view = + this->getAtcStations() | + std::views::filter([&](const CAtcStation &station) { return callsigns.contains(station.getCallsign()); }) | + std::views::transform([](const CAtcStation &station) { return station.getController(); }); + return { view.begin(), view.end() }; } CUserList CVatsimDataFileReader::getUsersForCallsign(const CCallsign &callsign) const @@ -309,8 +317,9 @@ namespace swift::core::vatsim const CFrequency freq(controller["frequency"].toString().toDouble(), CFrequencyUnit::kHz()); const CLength range(controller["visual_range"].toInt(), CLengthUnit::NM()); const QJsonArray atisLines = controller["text_atis"].toArray(); - const auto atisText = makeRange(atisLines).transform([](auto line) { return line.toString(); }); - const CInformationMessage atis(CInformationMessage::ATIS, atisText.to().join('\n')); + const auto atisText = atisLines | std::views::transform([](const auto &line) { return line.toString(); }); + const CInformationMessage atis(CInformationMessage::ATIS, + QStringList(atisText.begin(), atisText.end()).join('\n')); return CAtcStation(callsign, user, freq, {}, range, true, {}, {}, atis); } diff --git a/src/gui/models/statusmessagefilter.cpp b/src/gui/models/statusmessagefilter.cpp index 0048af5c6..ac8ceec55 100644 --- a/src/gui/models/statusmessagefilter.cpp +++ b/src/gui/models/statusmessagefilter.cpp @@ -66,11 +66,11 @@ namespace swift::gui::models CSequence humanNames = CLogPattern::allHumanReadableNames(); humanNames.removeIf( [this](const QString &name) { return this->stringMatchesFilterExpression(name, this->m_category); }); - auto humanCats = humanNames.transform([](const QString &name) { - const auto strings = CLogPattern::fromHumanReadableName(name).getCategoryStrings(); - return strings.isEmpty() ? QString {} : *strings.begin(); - }); - - return CVariant::from(CLogPattern::anyOf(categories.join(humanCats)).withSeverityAtOrAbove(m_severity)); + const auto view = humanNames | std::views::transform([](const QString &name) { + const auto strings = CLogPattern::fromHumanReadableName(name).getCategoryStrings(); + return strings.isEmpty() ? QString {} : *strings.begin(); + }); + return CVariant::from( + CLogPattern::anyOf(categories.join({ view.begin(), view.end() })).withSeverityAtOrAbove(m_severity)); } } // namespace swift::gui::models diff --git a/src/misc/aviation/atcstationlist.cpp b/src/misc/aviation/atcstationlist.cpp index e335889a9..aeddd88f6 100644 --- a/src/misc/aviation/atcstationlist.cpp +++ b/src/misc/aviation/atcstationlist.cpp @@ -85,8 +85,10 @@ namespace swift::misc::aviation CUserList CAtcStationList::getControllers() const { - return this->findBy(predicates::MemberValid(&CAtcStation::getController)) - .transform(predicates::MemberTransform(&CAtcStation::getController)); + auto view = *this | + std::views::filter([](const CAtcStation &station) { return station.getController().isValid(); }) | + std::views::transform([](const CAtcStation &station) { return station.getController(); }); + return { view.begin(), view.end() }; } int CAtcStationList::removeIfOutsideRange() { return this->removeIf(&CAtcStation::isInRange, false); } diff --git a/src/misc/aviation/liverylist.cpp b/src/misc/aviation/liverylist.cpp index 1305cf047..27486dc38 100644 --- a/src/misc/aviation/liverylist.cpp +++ b/src/misc/aviation/liverylist.cpp @@ -112,24 +112,26 @@ namespace swift::misc::aviation QStringList CLiveryList::getCombinedCodes(bool sort) const { - if (this->isEmpty()) { return QStringList(); } - QStringList codes = this->transform(predicates::MemberTransform(&CLivery::getCombinedCode)); + const auto view = *this | std::views::transform([](const CLivery &livery) { return livery.getCombinedCode(); }); + QStringList codes(view.begin(), view.end()); if (sort) { codes.sort(); } return codes; } QStringList CLiveryList::getCombinedCodesPlusInfo(bool sort) const { - if (this->isEmpty()) { return QStringList(); } - QStringList codes = this->transform(predicates::MemberTransform(&CLivery::getCombinedCodePlusInfo)); + const auto view = + *this | std::views::transform([](const CLivery &livery) { return livery.getCombinedCodePlusInfo(); }); + QStringList codes(view.begin(), view.end()); if (sort) { codes.sort(); } return codes; } QStringList CLiveryList::getCombinedCodesPlusInfoAndId(bool sort) const { - if (this->isEmpty()) { return QStringList(); } - QStringList codes = this->transform(predicates::MemberTransform(&CLivery::getCombinedCodePlusInfoAndId)); + const auto view = + *this | std::views::transform([](const CLivery &livery) { return livery.getCombinedCodePlusInfoAndId(); }); + QStringList codes(view.begin(), view.end()); if (sort) { codes.sort(); } return codes; } diff --git a/src/misc/identifierlist.cpp b/src/misc/identifierlist.cpp index 251ffe211..9f2f670ad 100644 --- a/src/misc/identifierlist.cpp +++ b/src/misc/identifierlist.cpp @@ -34,7 +34,9 @@ namespace swift::misc QStringList CIdentifierList::getMachineNames(bool unique, bool sort) const { - QStringList codes = this->transform(predicates::MemberTransform(&CIdentifier::getMachineName)); + const auto view = + *this | std::views::transform([](const CIdentifier &identifier) { return identifier.getMachineName(); }); + QStringList codes(view.begin(), view.end()); if (sort) { codes.sort(); } if (unique) { codes.removeDuplicates(); } return codes; diff --git a/src/misc/logcategorylist.cpp b/src/misc/logcategorylist.cpp index f0c38ed7e..9ff675d01 100644 --- a/src/misc/logcategorylist.cpp +++ b/src/misc/logcategorylist.cpp @@ -3,6 +3,8 @@ #include "misc/logcategorylist.h" +#include + #include #include #include @@ -24,7 +26,8 @@ namespace swift::misc QStringList CLogCategoryList::toQStringList() const { - return transform([](const CLogCategory &cat) { return cat.toQString(); }); + const auto view = *this | std::views::transform([](const CLogCategory &cat) { return cat.toQString(); }); + return { view.begin(), view.end() }; } QString CLogCategoryList::toQString(bool i18n) const { return convertToQString(i18n); } diff --git a/src/misc/namevariantpairlist.cpp b/src/misc/namevariantpairlist.cpp index 3bacf65ed..b4c871fdc 100644 --- a/src/misc/namevariantpairlist.cpp +++ b/src/misc/namevariantpairlist.cpp @@ -3,6 +3,8 @@ #include "misc/namevariantpairlist.h" +#include + #include "misc/range.h" SWIFT_DEFINE_SEQUENCE_MIXINS(swift::misc, CNameVariantPair, CNameVariantPairList) @@ -22,8 +24,8 @@ namespace swift::misc QStringList CNameVariantPairList::getNames(bool sorted) const { - if (this->isEmpty()) { return QStringList(); } - QStringList codes = this->transform(predicates::MemberTransform(&CNameVariantPair::getName)); + const auto view = *this | std::views::transform([](const CNameVariantPair &pair) { return pair.getName(); }); + QStringList codes(view.begin(), view.end()); if (sorted) { codes.sort(); } return codes; } diff --git a/src/misc/range.h b/src/misc/range.h index ddf717a2a..e4ec7ce11 100644 --- a/src/misc/range.h +++ b/src/misc/range.h @@ -32,10 +32,6 @@ namespace swift::misc class CRangeBase { public: - //! Return a new container generated by applying some transformation function to all elements of this one. - template - inline auto transform(F function) const; - //! Return a copy containing only those elements for which a given predicate returns true. template inline auto findBy(Predicate p) const; @@ -398,13 +394,6 @@ namespace swift::misc /* * Member functions of CRangeBase template defined out of line, because they depend on CRange etc. */ - template - template - auto CRangeBase::transform(F function) const - { - return makeRange(Iterators::makeTransformIterator(derived().cbegin(), function), derived().cend()); - } - template template auto CRangeBase::findBy(Predicate p) const diff --git a/src/misc/simulation/fscommon/aircraftcfgentrieslist.cpp b/src/misc/simulation/fscommon/aircraftcfgentrieslist.cpp index 978286d56..22fecb085 100644 --- a/src/misc/simulation/fscommon/aircraftcfgentrieslist.cpp +++ b/src/misc/simulation/fscommon/aircraftcfgentrieslist.cpp @@ -48,7 +48,9 @@ namespace swift::misc::simulation::fscommon QStringList CAircraftCfgEntriesList::getTitles(bool sorted) const { - QStringList titles = this->transform(predicates::MemberTransform(&CAircraftCfgEntries::getTitle)); + const auto &view = + *this | std::views::transform([](const CAircraftCfgEntries &info) { return info.getTitle(); }); + QStringList titles(view.begin(), view.end()); if (sorted) { titles.sort(Qt::CaseInsensitive); } return titles; } diff --git a/src/misc/simulation/simulatedaircraftlist.cpp b/src/misc/simulation/simulatedaircraftlist.cpp index 0b86bc85c..0b33b19ab 100644 --- a/src/misc/simulation/simulatedaircraftlist.cpp +++ b/src/misc/simulation/simulatedaircraftlist.cpp @@ -33,13 +33,16 @@ namespace swift::misc::simulation CUserList CSimulatedAircraftList::getPilots() const { - return this->findBy(predicates::MemberValid(&CSimulatedAircraft::getPilot)) - .transform(predicates::MemberTransform(&CSimulatedAircraft::getPilot)); + auto view = *this | std::views::filter([](const CSimulatedAircraft &aircraft) { + return aircraft.getPilot().isValid(); + }) | std::views::transform([](const CSimulatedAircraft &aircraft) { return aircraft.getPilot(); }); + return { view.begin(), view.end() }; } CAircraftModelList CSimulatedAircraftList::getModels() const { - return this->transform(predicates::MemberTransform(&CSimulatedAircraft::getModel)); + const auto view = *this | std::views::transform([](const CSimulatedAircraft &info) { return info.getModel(); }); + return { view.begin(), view.end() }; } CSimulatedAircraftList CSimulatedAircraftList::findByEnabled(bool enabled) const diff --git a/src/misc/simulation/simulatorplugininfolist.cpp b/src/misc/simulation/simulatorplugininfolist.cpp index c19afdb9d..755ed70ff 100644 --- a/src/misc/simulation/simulatorplugininfolist.cpp +++ b/src/misc/simulation/simulatorplugininfolist.cpp @@ -23,7 +23,9 @@ namespace swift::misc::simulation QStringList CSimulatorPluginInfoList::toStringList(bool i18n) const { - return this->transform([i18n](const CSimulatorPluginInfo &info) { return info.toQString(i18n); }); + const auto view = + *this | std::views::transform([&](const CSimulatorPluginInfo &info) { return info.toQString(i18n); }); + return { view.begin(), view.end() }; } CSimulatorPluginInfo CSimulatorPluginInfoList::findByIdentifier(const QString &identifier) const diff --git a/src/misc/stringutils.h b/src/misc/stringutils.h index 5cca42ec7..c095ef6ea 100644 --- a/src/misc/stringutils.h +++ b/src/misc/stringutils.h @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -20,7 +21,6 @@ #include #include -#include "misc/range.h" #include "misc/swiftmiscexport.h" #include "misc/typetraits.h" @@ -118,7 +118,9 @@ namespace swift::misc template QStringList splitString(const QString &s, F predicate) { - return makeRange(splitStringRefs(s, predicate)).transform([](QStringView sv) { return sv.toString(); }); + const auto view = + splitStringRefs(s, predicate) | std::views::transform([](QStringView sv) { return sv.toString(); }); + return { view.begin(), view.end() }; } //! Split a string into multiple lines. Blank lines are skipped. diff --git a/src/misc/variant.h b/src/misc/variant.h index b8c1ba511..3cf857d0a 100644 --- a/src/misc/variant.h +++ b/src/misc/variant.h @@ -7,6 +7,7 @@ #define SWIFT_MISC_VARIANT_H #include +#include #include #include @@ -397,10 +398,14 @@ namespace swift::misc::private_ns } QMetaType::registerConverter>([](const T &list) -> QVector { - return list.transform([](const typename T::value_type &v) { return CVariant::from(v); }); + const auto view = + list | std::views::transform([](const typename T::value_type &v) { return CVariant::from(v); }); + return { view.begin(), view.end() }; }); QMetaType::registerConverter, T>([](const QVector &list) -> T { - return makeRange(list).transform([](const CVariant &v) { return v.to(); }); + const auto view = + list | std::views::transform([](const CVariant &v) { return v.to(); }); + return { view.begin(), view.end() }; }); } }