mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-08-12 12:45:40 +08:00
refactor: Use C++20 ranges
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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() };
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user