refactor: Use C++20 ranges

This commit is contained in:
Lars Toenning
2025-08-24 22:29:42 +02:00
parent b7f8cb6f43
commit 94831a1e91
13 changed files with 67 additions and 44 deletions

View File

@@ -3,6 +3,8 @@
#include "core/vatsim/vatsimdatafilereader.h"
#include <ranges>
#include <QByteArray>
#include <QDateTime>
#include <QMetaObject>
@@ -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<QStringList>().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);
}

View File

@@ -66,11 +66,11 @@ namespace swift::gui::models
CSequence<QString> 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

View File

@@ -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); }

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -3,6 +3,8 @@
#include "misc/logcategorylist.h"
#include <ranges>
#include <QDBusMetaType>
#include <QList>
#include <QMetaObject>
@@ -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); }

View File

@@ -3,6 +3,8 @@
#include "misc/namevariantpairlist.h"
#include <ranges>
#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;
}

View File

@@ -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 <class F>
inline auto transform(F function) const;
//! Return a copy containing only those elements for which a given predicate returns true.
template <class Predicate>
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 <class Derived>
template <class F>
auto CRangeBase<Derived>::transform(F function) const
{
return makeRange(Iterators::makeTransformIterator(derived().cbegin(), function), derived().cend());
}
template <class Derived>
template <class Predicate>
auto CRangeBase<Derived>::findBy(Predicate p) const

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -8,6 +8,7 @@
#include <algorithm>
#include <atomic>
#include <ranges>
#include <QByteArray>
#include <QDateTime>
@@ -20,7 +21,6 @@
#include <QStringView>
#include <QtGlobal>
#include "misc/range.h"
#include "misc/swiftmiscexport.h"
#include "misc/typetraits.h"
@@ -118,7 +118,9 @@ namespace swift::misc
template <class F>
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.

View File

@@ -7,6 +7,7 @@
#define SWIFT_MISC_VARIANT_H
#include <algorithm>
#include <ranges>
#include <type_traits>
#include <QDBusArgument>
@@ -397,10 +398,14 @@ namespace swift::misc::private_ns
}
QMetaType::registerConverter<T, QVector<CVariant>>([](const T &list) -> QVector<CVariant> {
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<QVector<CVariant>, T>([](const QVector<CVariant> &list) -> T {
return makeRange(list).transform([](const CVariant &v) { return v.to<typename T::value_type>(); });
const auto view =
list | std::views::transform([](const CVariant &v) { return v.to<typename T::value_type>(); });
return { view.begin(), view.end() };
});
}
}