13 #include <QStringBuilder>
29 using namespace swift::config;
30 using namespace swift::misc::network;
31 using namespace swift::misc::math;
32 using namespace swift::misc::aviation;
33 using namespace swift::misc::physical_quantities;
37 namespace swift::misc::simulation
39 CAircraftModelList::CAircraftModelList() {}
47 if (model.matchesModelString(modelString, sensitivity)) {
return true; }
53 Qt::CaseSensitivity sensitivity)
const
57 if (m.hasValidDbKey() && m.getDbKey() == model.
getDbKey()) {
return true; }
58 if (m.matchesModelString(model.
getModelString(), sensitivity)) {
return true; }
70 if (combinedType.isEmpty()) {
return false; }
71 const QString ct(combinedType.toUpper().trimmed());
82 const QString &airlineDesignator)
const
95 Qt::CaseSensitivity sensitivity)
const
107 Qt::CaseSensitivity sensitivity)
const
115 Qt::CaseSensitivity sensitivity)
const
134 if (airline.isEmpty())
139 if (aircraft.isEmpty())
159 const QString &combinedCode)
const
177 if (
id < 0)
return {};
182 const QString &telephony,
183 bool onlyIfExistInModel)
const
188 if (!name.isEmpty() && (icao.hasName() || !onlyIfExistInModel))
190 if (!icao.getName().contains(name, Qt::CaseInsensitive)) { return false; }
193 if (!telephony.isEmpty() && (icao.hasTelephonyDesignator() || !onlyIfExistInModel))
195 if (!icao.getTelephonyDesignator().contains(name, Qt::CaseInsensitive)) { return false; }
201 CAircraftModelList CAircraftModelList::findByAirlineNamesOrTelephonyDesignator(
const QString &name)
const
235 CAircraftModelList CAircraftModelList::findWithAircraftDesignator(
const QSet<QString> &designators)
const
250 const QString m(manufacturer.toUpper().trimmed());
258 const QString f(family.toUpper().trimmed());
269 const QString f(family.toUpper().trimmed());
273 if (!icao.hasFamily()) { return false; }
283 if (modelIcao.getDesignator() == icao.
getDesignator()) { return true; }
289 CAircraftModelList::findByDesignatorsOrFamilyWithColorLivery(
const QStringList &designators)
const
294 if (designators.contains(modelIcao.getDesignator())) { return true; }
295 return modelIcao.
hasFamily() && designators.contains(modelIcao.getFamily());
301 const QString cc(combinedType.trimmed().toUpper());
310 const QString &wtc)
const
313 if (ml.
isEmpty()) {
return ml; }
318 return icao.
getWtc() == wtcUc;
322 CAircraftModelList CAircraftModelList::findByCombinedTypeWithColorLivery(
const QString &combinedType)
const
327 CAircraftModelList CAircraftModelList::findByCombinedTypeAndWtcWithColorLivery(
const QString &combinedType,
328 const QString &wtc)
const
339 const QString &manufacturer)
const
341 if (manufacturer.isEmpty()) {
return this->findByCombinedType(combinedType); }
342 if (combinedType.isEmpty()) {
return this->findByManufacturer(manufacturer); }
344 return model.
getAircraftIcaoCode().matchesCombinedTypeAndManufacturer(combinedType, manufacturer);
351 double distance = 2.0;
355 const CLivery &l = m.getLivery();
358 if (qFuzzyCompare(d, distance)) { models.
push_back(m); }
359 else if (distance > d)
371 return this->findClosestColorDistance(color, color);
461 CAircraftModelList CAircraftModelList::findNonDbModelsForModelString(
const QString &modelString)
const
500 if (count > 1) { duplicates.
push_back(this->findByModelString(
string, Qt::CaseInsensitive)); }
555 if (ac.isEmpty()) {
return {}; }
556 if (ac.size() == 1) {
return ac.firstKey(); }
557 const QList<int> values = ac.values();
558 const int max = *std::max_element(values.begin(), values.end());
589 bool CAircraftModelList::containsMatchingSimulator(
const CSimulatorInfo &simulators)
const
594 bool CAircraftModelList::containsNotMatchingSimulator(
const CSimulatorInfo &simulators)
const
599 bool CAircraftModelList::containsMilitary()
const
604 bool CAircraftModelList::containsCivilian()
const
609 bool CAircraftModelList::containsCivilianAndMilitary()
const
611 return this->containsMilitary() && this->containsCivilian();
614 bool CAircraftModelList::containsVtol()
const
619 bool CAircraftModelList::containsCategory()
const
624 bool CAircraftModelList::containsCategory(
int firstLevel)
const
626 if (firstLevel < 0) {
return false; }
641 const CSimulatorInfo::Simulator s = info.
getSimulator();
644 if (model.getSimulator().getSimulator() == s) {
continue; }
645 model.setSimulator(info);
653 CSimulatorInfo::Simulator s = CSimulatorInfo::None;
657 if (s == CSimulatorInfo::All) {
break; }
664 bool isLikelyImpl(
double count,
double total)
666 if (total < 1) {
return false; }
667 const double fsRatio = count / total;
668 return fsRatio > 0.95;
672 bool CAircraftModelList::isLikelyFsFamilyModelList()
const
674 if (this->isEmpty()) {
return false; }
675 return private_ns::isLikelyImpl(this->countPerSimulator().getCountForFsFamilySimulators(), this->size());
678 bool CAircraftModelList::isLikelyFsxFamilyModelList()
const
680 if (this->isEmpty()) {
return false; }
681 return private_ns::isLikelyImpl(this->countPerSimulator().getCountForFsxFamilySimulators(), this->size());
684 bool CAircraftModelList::isLikelyXPlaneModelList()
const
686 if (this->isEmpty()) {
return false; }
687 return private_ns::isLikelyImpl(this->countPerSimulator().getCount(CSimulatorInfo::xplane()), this->size());
695 if (model.getModelMode() == mode) {
continue; }
696 model.setModelMode(mode);
707 if (model.getModelType() == type) {
continue; }
708 model.setModelType(type);
714 int CAircraftModelList::setCG(
const CLength &cg)
719 if (model.getCG() == cg) {
continue; }
726 int CAircraftModelList::keepModelsWithString(
const QStringList &modelStrings, Qt::CaseSensitivity sensitivity)
728 const int cs = this->size();
729 (*this) = (findByModelStrings(modelStrings, sensitivity));
730 const int d = cs - this->size();
734 bool CAircraftModelList::removeModelWithString(
const QString &modelString, Qt::CaseSensitivity sensitivity)
736 if (modelString.isEmpty()) {
return false; }
737 if (this->isEmpty()) {
return false; }
738 const int r = this->removeIf(
743 int CAircraftModelList::removeModelsWithString(
const CAircraftModelList &models, Qt::CaseSensitivity sensitivity)
745 if (models.
isEmpty()) {
return 0; }
749 int CAircraftModelList::removeModelsWithString(
const QStringList &modelStrings, Qt::CaseSensitivity sensitivity)
751 if (modelStrings.isEmpty()) {
return 0; }
752 const int cs = this->size();
753 (*this) = (this->findByNotInModelStrings(modelStrings, sensitivity));
754 const int d = cs - this->size();
758 int CAircraftModelList::removeIfNotMatchingSimulator(
const CSimulatorInfo &needToMatch)
760 if (this->isEmpty()) {
return 0; }
761 const int oldSize = this->size();
767 const int diff = models.
size() - oldSize;
768 if (diff > 0) { *
this = models; }
772 int CAircraftModelList::removeAllWithoutModelString()
774 if (this->isEmpty()) {
return 0; }
775 const int s = this->size();
782 const int diff = s - withModelStr.
size();
783 if (diff < 1) {
return 0; }
784 *
this = withModelStr;
788 int CAircraftModelList::removeIfExcluded()
790 if (this->isEmpty()) {
return 0; }
791 const int s = this->size();
795 if (model.
getModelMode() == CAircraftModel::Exclude) {
continue; }
798 const int diff = s - onlyIncluded.
size();
799 if (diff < 1) {
return 0; }
800 *
this = onlyIncluded;
804 int CAircraftModelList::removeXPlaneFlyablePlanes() {
return this->removeIfExcluded(); }
806 int CAircraftModelList::removeByDistributor(
const CDistributor &distributor)
808 return this->removeIf(&CAircraftModel::getDistributor, distributor);
813 return this->removeIf(&CAircraftModel::getAircraftIcaoCode, aircraftIcao, &CAircraftModel::getLivery, livery);
819 return this->removeIf(&CAircraftModel::getAircraftIcaoCode, aircraftIcao, &CAircraftModel::getAirlineIcaoCode,
823 int CAircraftModelList::removeIfNotFsFamily()
825 if (this->isEmpty()) {
return 0; }
827 if (fsOnly.
size() == this->size()) {
return 0; }
828 const int delta = this->size() - fsOnly.
size();
834 const QSet<QString> &modelStrings)
848 bool CAircraftModelList::replaceOrAddModelWithString(
const CAircraftModel &addOrReplaceModel,
849 Qt::CaseSensitivity sensitivity)
852 if (!this->isEmpty()) { r = this->removeModelWithString(addOrReplaceModel.
getModelString(), sensitivity); }
853 this->push_back(addOrReplaceModel);
858 Qt::CaseSensitivity sensitivity)
860 if (addOrReplaceList.
isEmpty()) {
return 0; }
863 *
this = addOrReplaceList;
864 return addOrReplaceList.
size();
869 int removed = newModels.
size();
872 return this->size() - removed;
876 Qt::CaseSensitivity sensitivity)
const
883 Qt::CaseSensitivity sensitivity)
const
890 Qt::CaseSensitivity sensitivity)
const
893 const bool c = modelStrings.contains(model.
getModelString(), sensitivity);
898 QStringList CAircraftModelList::getModelStringList(
bool sort)
const
906 if (sort) { ms.
sort(Qt::CaseInsensitive); }
910 QSet<QString> CAircraftModelList::getModelStringSet()
const
936 const int count = cps.lastKey();
937 const QList<CSimulatorInfo> infoWithMaxValues = cps.values(count);
942 int CAircraftModelList::countModelsWithColorLivery()
const
952 int CAircraftModelList::countModelsWithAirlineLivery()
const
962 int CAircraftModelList::countVtolAircraft()
const
967 if (model.
isVtol()) { count++; }
982 int CAircraftModelList::countMilitaryAircraft()
const
992 int CAircraftModelList::countCivilianAircraft()
const
997 if (model.isCivilian()) { count++; }
1002 int CAircraftModelList::countDifferentAirlines()
const {
return this->getAirlineVDesignators().size(); }
1004 int CAircraftModelList::countCombinedTypes()
const {
return this->getCombinedTypes().size(); }
1006 int CAircraftModelList::countAliases()
const
1011 if (model.hasModelStringAlias()) { count++; }
1016 void CAircraftModelList::sortByFileName()
1018 if (CFileUtils::isFileNameCaseSensitive()) { this->sortBy(&CAircraftModel::getFileName); }
1019 else { this->sortBy(&CAircraftModel::getFileNameLowerCase); }
1022 void CAircraftModelList::updateDistributor(
const CDistributor &distributor)
1035 if (distributors.
contains(d)) {
continue; }
1038 return distributors;
1052 if (keys.contains(key)) {
continue; }
1059 QSet<QString> CAircraftModelList::getAircraftDesignators()
const
1070 QSet<QString> CAircraftModelList::getAircraftDesignatorsForAirline(
const CAirlineIcaoCode &airlineCode)
const
1105 if (keys.contains(key)) {
continue; }
1112 QSet<QString> CAircraftModelList::getAirlineDesignators()
const
1123 QSet<QString> CAircraftModelList::getAirlineVDesignators()
const
1136 if (groupId < 0) {
return {}; }
1145 QSet<QString> CAircraftModelList::getAirlineDesignatorsForGroup(
int groupId)
const
1147 return this->getAirlineIcaoCodesForGroup(groupId).
allDesignators();
1150 QSet<QString> CAircraftModelList::getAirlineVDesignatorsForGroup(
int groupId)
const
1152 return this->getAirlineIcaoCodesForGroup(groupId).allVDesignators();
1155 QSet<QString> CAircraftModelList::getCombinedTypes()
const
1161 if (ct.isEmpty()) {
continue; }
1162 combinedCodes.
insert(ct);
1164 return combinedCodes;
1167 QSet<QString> CAircraftModelList::getAllFileNames()
const
1169 const bool cs = CFileUtils::isFileNameCaseSensitive();
1179 QSet<QString> CAircraftModelList::getAllUNCFileNames()
const
1181 const bool cs = CFileUtils::isFileNameCaseSensitive();
1187 if (CFileUtils::isWindowsUncPath(fn)) { files.
insert(fn); }
1192 QString CAircraftModelList::getCombinedTypesAsString(
const QString &separator)
const
1194 if (this->isEmpty()) {
return {}; }
1198 QSet<QString> CAircraftModelList::getAicraftAndAirlineDesignators(
bool withDbId)
const
1216 QString CAircraftModelList::getAicraftAndAirlineDesignatorsAsString(
bool withDbId,
const QString &separator)
const
1218 if (this->isEmpty()) {
return {}; }
1219 return joinStringSet(this->getAicraftAndAirlineDesignators(withDbId), separator);
1227 void CAircraftModelList::updateLivery(
const CLivery &livery)
1234 if (distributors.
isEmpty()) {
return 0; }
1243 void CAircraftModelList::normalizeFileNamesForDb()
1254 CCallsign::addLogDetailsToList(
1256 QStringLiteral(
"Prefer color liveries: '%1', airline: '%2', ignore zero scores: '%3'")
1258 boolToYesNo(ignoreZeroScores)));
1259 CCallsign::addLogDetailsToList(log, remoteModel.
getCallsign(),
1260 QStringLiteral(
"--- Start scoring in list with %1 models").arg(this->size()));
1261 CCallsign::addLogDetailsToList(log, remoteModel.
getCallsign(), this->coverageSummaryForModel(remoteModel));
1267 const int score = model.
calculateScore(remoteModel, preferColorLiveries, log ? &subMsgs :
nullptr);
1268 if (ignoreZeroScores && score < 1) {
continue; }
1270 CCallsign::addLogDetailsToList(
1274 CCallsign::addLogDetailsToList(log, remoteModel.
getCallsign(),
1275 QStringLiteral(
"--- End calculating #%1 ---").arg(c));
1277 scoreMap.insert(score, model);
1279 CCallsign::addLogDetailsToList(log, remoteModel.
getCallsign(), QStringLiteral(
"--- End scoring ---"));
1283 QStringList CAircraftModelList::toCompleterStrings(
bool sorted,
const CSimulatorInfo &simulator)
const
1290 if (sorted) { c.sort(); }
1298 return this->validateForPublishing(validModels, invalidModels);
1311 QStringList subMsgs;
1321 const CStatusMessage msgDb(CStatusMessage::SeverityError, subMsgs.join(
", "));
1325 CAircraftModelList::addAsValidOrInvalidModel(model,
true, validModels, invalidModels);
1330 CAircraftModelList::addAsValidOrInvalidModel(model,
false, validModels, invalidModels);
1344 if (distributorsFromDb.
isEmpty())
1348 CAircraftModelList::addAsValidOrInvalidModels(*
this,
false, validModels, invalidModels);
1355 CAircraftModelList::addAsValidOrInvalidModel(model, valid, validModels, invalidModels);
1369 int stopAtFailedFiles, std::atomic_bool &wasStopped,
1370 const QString &simRootDirectory,
bool alreadySortedByFn)
const
1375 QSet<QString> failedFiles;
1376 QSet<QString> workingFiles;
1377 int failedFilesCount = 0;
1384 if (CBuildConfig::isRunningOnWindowsNtPlatform())
1390 const bool caseSensitive = CFileUtils::isFileNameCaseSensitive();
1391 const QString simRootDir = CFileUtils::normalizeFilePathToQtStandard(
1392 CFileUtils::stripLeadingSlashOrDriveLetter(caseSensitive ? simRootDirectory : simRootDirectory.toLower()));
1396 if (wasStopped) {
break; }
1399 if (!model.hasModelString())
1405 if (!model.hasFileName())
1407 if (ignoreEmptyFileNames) {
continue; }
1409 << model.getModelStringAndDbKey());
1413 const QString fn(caseSensitive ? model.getFileName() : model.getFileNameLowerCase());
1414 if (failedFiles.contains(fn))
1417 << model.getModelStringAndDbKey() << model.getFileName());
1421 if (workingFiles.contains(fn) || model.hasExistingCorrespondingFile())
1423 if (!simRootDirectory.isEmpty() && !fn.contains(simRootDir))
1427 CStatusMessage(
this).validationError(u
"'%1', not in root directory '%2', '%3' skipped")
1428 << model.getModelStringAndDbKey() << simRootDir << model.getFileName());
1429 failedFiles.insert(fn);
1436 workingFiles.insert(fn);
1443 failedFiles.insert(fn);
1446 << model.getModelStringAndDbKey() << model.getFileName());
1450 CAircraftModelList::addAsValidOrInvalidModel(model, ok, validModels, invalidModels);
1451 if (stopAtFailedFiles > 0 && failedFilesCount >= stopAtFailedFiles)
1455 << failedFilesCount);
1464 << validModels.
size());
1469 << invalidModels.
size());
1476 CStatusMessageList CAircraftModelList::validateUncFiles(
const QSet<QString> &uncFiles)
const
1480 if (!CBuildConfig::isRunningOnWindowsNtPlatform()) {
return msgs; }
1481 if (uncFiles.isEmpty()) {
return msgs; }
1483 const QSet<QString> uncMachines = CFileUtils::windowsUncMachines(uncFiles);
1484 if (uncMachines.isEmpty())
1486 msgs.
push_back(CStatusMessage(
this).validationInfo(u
"Found NO UNC machines for %1 files, odd...?")
1487 << uncFiles.size());
1492 msgs.
push_back(CStatusMessage(
this).validationInfo(u
"Found %1 UNC files on machines: %2")
1493 << uncFiles.size() << machines);
1496 for (
const QString &m : uncMachines)
1498 const bool ping = canPing(m);
1501 msgs.
push_back(CStatusMessage(
this).validationError(u
"Cannot ping UNC machine(s): %1. UNC files: %2")
1502 << m << uncFiles.size());
1508 QJsonObject CAircraftModelList::toMemoizedJson()
const
1512 for (
auto it = cbegin(); it != cend(); ++it) { array << it->toMemoizedJson(helper); }
1514 json.insert(
"containerbase", array);
1521 void CAircraftModelList::convertFromMemoizedJson(
const QJsonObject &json,
bool fallbackToConvertToJson)
1524 QJsonValue value = json.value(
"containerbase");
1525 if (value.isUndefined()) {
throw CJsonException(
"Missing 'containerbase'"); }
1526 QJsonArray array = value.toArray();
1529 const QJsonValue aircraftIcaos = json.value(
"aircraftIcaos");
1530 const QJsonValue liveries = json.value(
"liveries");
1531 const QJsonValue distributors = json.value(
"distributors");
1533 const bool undefAc = aircraftIcaos.isUndefined();
1534 const bool undefLiv = liveries.isUndefined();
1535 const bool undefDist = distributors.isUndefined();
1536 const bool undefAll = undefAc && undefDist && undefLiv;
1538 if (fallbackToConvertToJson && undefAll)
1540 this->convertFromJson(json);
1545 if (undefAc) {
throw CJsonException(
"Missing 'aircraftIcaos'"); }
1547 if (undefDist) {
throw CJsonException(
"Missing 'distributors'"); }
1568 for (
auto i = array.begin(); i != array.end(); ++i)
1574 this->push_back(value);
1578 QJsonArray CAircraftModelList::toDatabaseJson()
const
1591 QString CAircraftModelList::toDatabaseJsonString(QJsonDocument::JsonFormat format)
const
1593 return QJsonDocument(toDatabaseJson()).toJson(format);
1596 QString CAircraftModelList::asHtmlSummary()
const
1598 if (this->isEmpty()) {
return {}; }
1607 QString CAircraftModelList::coverageSummary(
const QString &separator)
const
1609 if (this->isEmpty()) {
return "no models"; }
1611 const int dbEntries = this->countWithValidDbKey();
1612 const double dbRatio = CMathUtils::round(
static_cast<double>(100 * dbEntries) / this->size(), 1);
1613 return u
"Entries: " % QString::number(this->size()) % u
" | valid DB keys: " % QString::number(dbEntries) %
1614 u
" (" % QString::number(dbRatio) % u
"%)" % separator % u
"color liveries: " %
1615 QString::number(this->countModelsWithColorLivery()) % u
" | airline liveries: " %
1616 QString::number(this->countModelsWithAirlineLivery()) % separator % u
"VTOL: " %
1617 QString::number(this->countVtolAircraft()) % u
" | military: " %
1618 QString::number(this->countMilitaryAircraft()) % u
" | civilian: " %
1619 QString::number(this->countCivilianAircraft()) % separator % u
"Different airlines: " %
1620 QString::number(this->countDifferentAirlines()) % separator % u
"Combined types: '" %
1621 this->getCombinedTypesAsString() % u
'\'' % separator %
1622 (this->size() <= 25 ?
1623 (u
"Aircraft/airlines: " % this->getAicraftAndAirlineDesignatorsAsString(
true) % separator) :
1625 u
"Simulators: " % this->countPerSimulator().toQString();
1628 QString CAircraftModelList::coverageSummaryForModel(
const CAircraftModel &checkModel,
1629 const QString &separator)
const
1631 const bool combinedCodeForModel =
1633 const bool airlineForModel =
1635 return coverageSummary(separator) % separator % u
"Data for input model, has combined: " %
1636 boolToYesNo(combinedCodeForModel) %
1642 QString CAircraftModelList::htmlStatistics(
bool aircraftStats,
bool airlineStats)
const
1644 static const QString sep(
"<br>");
1645 const bool notOnlyDb = this->containsAnyObjectWithoutKey();
1646 QString stats = this->coverageSummary(sep);
1652 stats += sep % sep % u
"Aircraft ICAOs from DB: " % sep % designators.join(
", ");
1659 stats += sep % sep % u
"Airline ICAOs from DB: " % sep % designators.join(
", ");
1665 stats += sep % sep % u
"DB objects:<br>---------" % sep % dbModels.
htmlStatistics(
false,
false);
1673 const QString json = this->toJsonString();
1674 const bool s = CFileUtils::writeStringToFile(json, invalidModelFileAndPath());
1678 << this->size() << invalidModelFileAndPath();
1680 return CStatusMessage(
this).
info(u
"Saved %1 entries to '%2'") << this->size() << invalidModelFileAndPath();
1685 const QString json = CFileUtils::readFileToString(invalidModelFileAndPath());
1688 return CStatusMessage(
this).
error(u
"Unable to read from '%1'") << invalidModelFileAndPath();
1690 *
this = CAircraftModelList::fromJson(json,
true);
1691 return CStatusMessage(
this).
info(u
"Loaded %1 entries from '%2'") << this->size() << invalidModelFileAndPath();
1706 for (
const QJsonValue &value : array)
1708 models.
push_back(CAircraftModel::fromDatabaseJsonCaching(value.toObject(), aircraftIcaosMap, categoriesMap,
1709 liveriesMap, distributorsMap));
1714 const QString &CAircraftModelList::invalidModelFileAndPath()
1716 static const QString f =
1717 CFileUtils::appendFilePathsAndFixUnc(CSwiftDirectories::logDirectory(),
"invalidmodels.json");
1721 bool CAircraftModelList::hasInvalidModelFile()
1723 const QFileInfo fi(invalidModelFileAndPath());
1727 void CAircraftModelList::addAsValidOrInvalidModel(
const CAircraftModel &model,
bool valid,
1749 CAircraftModelList::addAsValidOrInvalidModel(model, valid, validModels, invalidModels);
QMultiMap< int, CAircraftModel > ScoredModels
Individual (matching) score for each model.
Thrown when a convertFromJson method encounters an unrecoverable error in JSON data.
Pseudo-RAII pattern that tracks the current JSON value being converted.
Memoizer for Ts. Other types are passed through.
const CSequence< T > & getTable() const
Return the values in the T table as a flat list.
Unmemoizer for Ts. Other types are passed through.
CSequence< T > & getTable()
Return reference to the flat list T table.
Derived & validationError(const char16_t(&format)[N])
Set the severity to error, providing a format string, and adding the validation category.
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
auto findFirstByOrDefault(Predicate p, const Value &def) const
Return a copy of the first element for which a given predicate returns true, or a default value if th...
bool containsBy(Predicate p) const
Return true if there is an element for which a given predicate returns true.
bool contains(const T &object) const
Return true if there is an element equal to given object. Uses the most efficient implementation avai...
size_type size() const
Returns number of elements in the sequence.
CSequence findBy(Predicate p) const
Return a copy containing only those elements for which a given predicate returns true.
void truncate(size_type maxSize)
Changes the size of the sequence, if it is bigger than the given size.
void push_back(const T &value)
Appends an element at the end of the sequence.
void clear()
Removes all elements in the sequence.
bool isEmpty() const
Synonym for empty.
void sort(Predicate p)
In-place sort by a given comparator predicate.
Build a QSet more efficiently when calling insert() in a for loop.
void insert(const T &value)
Add an element to the set. Runs in amortized constant time.
Streamable status message, e.g.
bool isWarningOrAbove() const
Warning or above.
void prependMessage(const QString &msg)
Prepend message.
Status messages, e.g. from Core -> GUI.
CStatusMessage toSingleMessage() const
Merge into a single message.
bool hasErrorMessages() const
Error messages.
Value object for aircraft categories.
bool isNull() const
Null category?
int getFirstLevel() const
First level.
Value object encapsulating a list of ICAO codes.
Value object for ICAO classification.
CWakeTurbulenceCategory getWtc() const
Get WTC.
bool hasFamily() const
Has family?
const QString & getFamily() const
Family (e.g. A350)
bool matchesDesignator(const QString &designator, int fuzzyMatch=-1, int *result=nullptr) const
Matches designator string?
const QString & getDesignator() const
Get ICAO designator, e.g. "B737".
QString getDesignatorDbKey() const
Designator and DB key.
bool matchesCombinedType(const QString &combinedType) const
Matches given combined code.
const QString & getCombinedType() const
Get type, e.g. "L2J".
const CAircraftCategory & getCategory() const
Get category.
const QString & getManufacturer() const
Get manufacturer, e.g. "Airbus".
Value object encapsulating a list of ICAO codes.
QSet< QString > allDesignators(bool noUnspecified=true) const
All ICAO codes, no duplicates.
Value object for ICAO classification.
QString getDesignatorDbKey() const
Designator and DB key.
const QString & getDesignator() const
Get airline, e.g. "DLH".
bool hasValidDesignator() const
Airline designator available?
bool matchesNamesOrTelephonyDesignator(const QString &candidate) const
Relaxed check by name or telephony designator (aka callsign, not to be confused with CCallsign)
int getGroupId() const
Group id.
Value object encapsulating a list of ICAO codes.
QStringList toIcaoDesignatorCompleterStrings(bool combinedString=true, bool sort=true) const
String list for completion by ICAO designator.
QSet< QString > allDesignators() const
All designators.
Value object encapsulating information of a callsign.
bool isEmpty() const
Is empty?
Value object encapsulating information about an airpot.
double getColorDistance(const CLivery &otherLivery) const
Color distance 0..1 (0 is best)
bool matchesCombinedCode(const QString &candidate) const
Matches combined code.
const CAirlineIcaoCode & getAirlineIcaoCode() const
Corresponding airline, if any.
bool hasColorTail() const
Tail color set?
bool hasColorFuselage() const
Fuselage color set?
const QString & getCombinedCode() const
Combined code.
bool isAirlineLivery() const
Livery representing airline.
bool hasCombinedCode() const
Livery combined code available?
bool isColorLivery() const
Color livery?
Value object for a list of airports.
ICAO wake turbulence category.
QMap< KEYTYPE, OBJ > toDbKeyValueMap() const
As map with DB key/object.
int getDbKey() const
Get DB key.
bool hasValidDbKey() const
Has valid DB key.
bool hasValidDbKey() const
Has valid DB key.
const QString & getDbKey() const
Get DB key.
Physical unit length (length)
Aircraft model (used by another pilot, my models on disk)
const aviation::CCallsign & getCallsign() const
Corresponding callsign if applicable.
void convertFromMemoizedJson(const QJsonObject &json, const MemoHelper::CUnmemoizer &)
From JSON with memoized members (used by CAircraftModelList)
bool setDistributorOrder(int order)
Set the distributor order.
bool matchesModelString(const QString &modelString, Qt::CaseSensitivity sensitivity) const
Matches model string?
ModelMode getModelMode() const
Model mode.
const aviation::CAirlineIcaoCode & getAirlineIcaoCode() const
Airline ICAO code.
bool hasKnownAircraftDesignator() const
Has known aircraft designator?
bool hasCategory() const
Assigned a category?
bool hasAirlineDesignator() const
Airline designator?
bool hasExistingCorrespondingFile() const
Does the corresponding file exist?
const aviation::CLivery & getLivery() const
Get livery.
ModelMode
Mode, decides if a model is supposed to be used in the model set for model matching or not....
int calculateScore(const CAircraftModel &compareModel, bool preferColorLiveries, CStatusMessageList *log=nullptr) const
Calculate score.
const QString & getAircraftIcaoCodeDesignator() const
Aircraft ICAO code designator.
CSimulatorInfo getSimulator() const
Simulator info.
void normalizeFileNameForDb()
File path for DB (absolute paths make no sense in DB)
const QString & getModelString() const
Model key, either queried or loaded from simulator model.
bool isVtol() const
VTOL aircraft?
bool hasDistributor() const
Distributor, but not necessarily loaded from DB.
bool hasFileName() const
File name?
bool isCivilian() const
Civilian model?
const QString & getModelModeAsString() const
Model mode as string.
bool hasAircraftDesignator() const
Has aircraft designator?
QJsonObject toDatabaseJson() const
To database JSON.
bool matchesModelStringOrAlias(const QString &modelString, Qt::CaseSensitivity sensitivity) const
Matches model string or alias?
CStatusMessageList validate(bool withNestedObjects) const
Validate.
bool matchesMode(simulation::CAircraftModel::ModelModeFilter mode) const
Matches given mode?
const CDistributor & getDistributor() const
Get distributor.
const aviation::CAircraftIcaoCode & getAircraftIcaoCode() const
Aircraft ICAO code.
bool matchesFileName(const QString &fileName) const
Matching file name?
bool hasDbDistributor() const
Distributor loaded from DB.
QString getModelStringAndDbKey() const
Model string and DB key (if available)
const QString getAirlineIcaoCodeVDesignator() const
Airline ICAO code designator.
QString getFileNameLowerCase() const
File name as lower case.
bool matchesAnyDbDistributor(const CDistributorList &distributors) const
By distributor.
QString asHtmlSummary(const QString &separator="<br>") const
As a brief HTML summary (e.g. used in tooltips)
const QString & getAirlineIcaoCodeDesignator() const
Airline ICAO code designator.
bool isMilitary() const
Military model?
bool hasModelString() const
Non empty model string?
void setLivery(const aviation::CLivery &livery)
Livery.
void setDistributor(const CDistributor &distributor)
Set distributor.
bool setAircraftIcaoCode(const aviation::CAircraftIcaoCode &aircraftIcaoCode)
Set aircraft ICAO code.
const QString & getFileName() const
File name (corresponding data for simulator, only available if representing simulator model.
bool matchesSimulator(const CSimulatorInfo &simulator) const
Matches given simulator?
Value object encapsulating a list of aircraft models.
bool containsModelStringOrDbKey(const simulation::CAircraftModel &model, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Contains model with model string or id?
bool containsAirlineLivery(const aviation::CAirlineIcaoCode &airline) const
Contains airline livery for given airline.
QStringList getModelStringList(bool sort=true) const
Model strings.
CAircraftModel findFirstByModelStringAliasOrDefault(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Find first by model string.
QSet< QString > getAllUNCFileNames() const
All UNC file names.
CAircraftModelList findEmptyModelStrings() const
Find empty model strings.
CAircraftModel findFirstByModelStringOrDefault(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Find first by model string.
CAircraftModelList findByAircraftAndAirline(const aviation::CAircraftIcaoCode &aircraftIcaoCode, const aviation::CAirlineIcaoCode &airlineIcaoCode) const
Find by ICAO of aircraft and airline.
CAircraftModelList findByAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const
Find by designator and livery code.
bool containsCallsign(const aviation::CCallsign &callsign) const
Contains model for callsign?
CAircraftModelList findByAirlineGroup(const swift::misc::aviation::CAirlineIcaoCode &airline) const
Find by the corresponding airline group.
CAircraftModelList findColorLiveries() const
Find color liveries.
CAircraftModelList findByIcaoDesignators(const aviation::CAircraftIcaoCode &aircraftIcaoCode, const aviation::CAirlineIcaoCode &airlineIcaoCode) const
Find by ICAO designators.
CAircraftModelList findByAircraftAndLivery(const aviation::CAircraftIcaoCode &aircraftIcaoCode, const aviation::CLivery &livery) const
Find by aircraft and livery.
int removeModelsWithString(const CAircraftModelList &models, Qt::CaseSensitivity sensitivity)
Remove those models with given model strings.
QString htmlStatistics(bool aircraftStats, bool airlineStats) const
A HTML summary of the data in the list.
CAircraftModelList findByModelString(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Find by model string.
CAircraftModel findFirstByCallsignOrDefault(const aviation::CCallsign &callsign) const
Find first by callsign.
bool removeModelWithString(const QString &modelString, Qt::CaseSensitivity sensitivity)
Remove those models with given model strings.
CAircraftModelList findByAirlineNameAndTelephonyDesignator(const QString &name, const QString &telephony, bool onlyIfExistInModel=true) const
Find by airline name and telephony.
bool containsCombinedType(const QString &combinedType) const
Contains given combined type?
bool containsModelString(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Contains model string?
bool containsModelsWithAircraftAndAirlineIcaoDesignator(const QString &aircraftDesignator, const QString &airlineDesignator) const
Contains any model with aircraft and airline ICAO designator?
bool containsModelsWithAircraftIcaoDesignator(const QString &aircraftDesignator) const
Contains any model with aircraft ICAO designator?
CAircraftModelList()
Empty constructor.
void sortByFileName()
Sort by file path.
Count per simulator, small utility class allows to retrieve values as per simulator.
void increaseSimulatorCounts(const CSimulatorInfo &simulator)
Increase all simulators given here.
int simulatorsRepresented() const
Number of simulators with count > 0.
QMultiMap< int, CSimulatorInfo > countPerSimulator() const
Sorted (ascending) per simulator.
Value object encapsulating information of software distributor.
Value object encapsulating a list of distributors.
int removeIfNotLoadedFromDb()
Remove distributors not from DB.
Simple hardcoded info about the corresponding simulator.
void addSimulator(Simulator s)
Add simulator flags.
bool matchesAny(const CSimulatorInfo &otherInfo) const
Matches any simulator.
Simulator getSimulator() const
Simulator.
auto removeIfIn(I begin1, I end1, J begin2, J end2)
Removes those elements in range 1 that appear also in range 2 leaving only those that do not appear i...
SWIFT_MISC_EXPORT QString joinStringSet(const QSet< QString > &set, const QString &separator)
Convert string to bool.
auto makePairsRange(const T &container)
Returns a const CRange for iterating over the keys and values of a Qt associative container.
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.