swift
aircraftcfgentrieslist.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include "misc/predicates.h"
7 #include "misc/range.h"
8 #include "misc/setbuilder.h"
10 #include "misc/statusmessagelist.h"
11 #include "misc/stringutils.h"
12 
13 using namespace swift::misc;
14 using namespace swift::misc::simulation;
15 
16 SWIFT_DEFINE_SEQUENCE_MIXINS(swift::misc::simulation::fscommon, CAircraftCfgEntries, CAircraftCfgEntriesList)
17 
18 namespace swift::misc::simulation::fscommon
19 {
21 
23  {
24  if (title.isEmpty()) { return false; }
25  return this->containsBy([=](const CAircraftCfgEntries &entries) {
26  return title.compare(entries.getTitle(), caseSensitivity) == 0;
27  });
28  }
29 
31  {
32  QStringList titles = this->getTitles(true);
33  QStringList ambiguousTitles;
34  QString last;
35  for (const QString &title : titles)
36  {
37  if (title.isEmpty()) { continue; }
38  if (title.compare(last, Qt::CaseInsensitive) == 0)
39  {
40  if (!ambiguousTitles.contains(title, Qt::CaseInsensitive)) { ambiguousTitles.append(title); }
41  }
42  last = title;
43  }
44  return ambiguousTitles;
45  }
46 
48  {
50  if (sorted) { titles.sort(Qt::CaseInsensitive); }
51  return titles;
52  }
53 
55  {
56  CSetBuilder<QString> titlesUc;
57  for (const CAircraftCfgEntries &entries : *this) { titlesUc.insert(entries.getTitle().toUpper()); }
58  return titlesUc;
59  }
60 
61  QString CAircraftCfgEntriesList::getTitlesAsString(bool sorted, const QString &separator) const
62  {
63  return this->getTitles(sorted).join(separator);
64  }
65 
67  {
68  if (title.isEmpty()) { return false; }
69  return std::any_of(cbegin(), cend(), [&](const CAircraftCfgEntries &entries) {
70  return stringCompare(entries.getTitle(), title, Qt::CaseInsensitive);
71  });
72  }
73 
74  CAircraftModelList CAircraftCfgEntriesList::toAircraftModelList(bool ignoreDuplicatesAndEmptyModelStrings,
75  CStatusMessageList &msgs) const
76  {
78  QSet<QString> keys;
79  for (const CAircraftCfgEntries &entries : (*this))
80  {
81  if (ignoreDuplicatesAndEmptyModelStrings)
82  {
83  const QString key = entries.getTitle().toUpper();
84  if (key.isEmpty()) { continue; }
85  if (keys.contains(key))
86  {
87  CStatusMessage msg(this);
88  msg.warning(u"Duplicate model string %1 in %2 %3")
89  << entries.getTitle() << entries.getFileDirectory() << entries.getFileName();
90  msgs.push_back(msg);
91  continue;
92  }
93  keys.insert(key);
94  }
95  ml.push_back(entries.toAircraftModel());
96  }
97  return ml;
98  }
99 
101  bool ignoreDuplicatesAndEmptyModelStrings,
102  CStatusMessageList &msgs) const
103  {
104  CAircraftModelList ml = this->toAircraftModelList(ignoreDuplicatesAndEmptyModelStrings, msgs);
105  ml.setSimulatorInfo(simInfo);
106  return ml;
107  }
108 
110  Qt::CaseSensitivity caseSensitivity) const
111  {
112  return this->findBy([=](const CAircraftCfgEntries &entries) {
113  return title.compare(entries.getTitle(), caseSensitivity) == 0;
114  });
115  }
116 
117 } // namespace swift::misc::simulation::fscommon
Derived & warning(const char16_t(&format)[N])
Set the severity to warning, providing a format string.
bool containsBy(Predicate p) const
Return true if there is an element for which a given predicate returns true.
Definition: range.h:101
auto transform(F function) const
Return a new container generated by applying some transformation function to all elements of this one...
Definition: range.h:403
CSequence findBy(Predicate p) const
Return a copy containing only those elements for which a given predicate returns true.
Definition: sequence.h:398
void push_back(const T &value)
Appends an element at the end of the sequence.
Definition: sequence.h:305
const_iterator cbegin() const
Returns const iterator at the beginning of the sequence.
Definition: sequence.h:169
const_iterator cend() const
Returns const iterator one past the end of the sequence.
Definition: sequence.h:178
Build a QSet more efficiently when calling insert() in a for loop.
Definition: setbuilder.h:25
void insert(const T &value)
Add an element to the set. Runs in amortized constant time.
Definition: setbuilder.h:29
Streamable status message, e.g.
Status messages, e.g. from Core -> GUI.
Value object encapsulating a list of aircraft models.
int setSimulatorInfo(const CSimulatorInfo &info)
Set simulator for all elements.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
Set of aircraft.cfg entries representing an aircraft (FSX)
bool containsModelWithTitle(const QString &title, Qt::CaseSensitivity caseSensitivity=Qt::CaseInsensitive)
Contains model with title?
QString getTitlesAsString(bool sorted, const QString &separator=", ") const
All titles as string.
QStringList getTitles(bool sorted=false) const
All titles (aka model names)
CAircraftCfgEntriesList findByTitle(const QString &title, Qt::CaseSensitivity caseSensitivity=Qt::CaseInsensitive) const
Find by title.
swift::misc::simulation::CAircraftModelList toAircraftModelList(bool ignoreDuplicatesAndEmptyModelStrings, CStatusMessageList &msgs) const
As aircraft models.
bool containsTitle(const QString &title) const
Can check if a title (model string) is known.
QSet< QString > getTitleSetUpperCase() const
Titles as set in upper case.
auto MemberTransform(T memberFunc)
Returns a function object that returns the value returned by one of it's argument member functions.
Definition: predicates.h:54
Free functions in swift::misc.
SWIFT_MISC_EXPORT bool stringCompare(const QString &c1, const QString &c2, Qt::CaseSensitivity cs)
String compare.
void append(QList< T > &&value)
bool contains(const QSet< T > &other) const const
QSet< T >::iterator insert(QSet< T >::const_iterator it, const T &value)
int compare(QLatin1StringView s1, const QString &s2, Qt::CaseSensitivity cs)
bool isEmpty() const const
QString toUpper() const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
QString join(QChar separator) const const
void sort(Qt::CaseSensitivity cs)
CaseSensitivity
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.
Definition: sequence.h:63