swift
entityflags.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <bitset>
7 
8 #include <QStringList>
9 #include <QtGlobal>
10 
11 #include "misc/setbuilder.h"
12 #include "misc/verify.h"
13 
14 namespace swift::misc::network
15 {
17  {
18  switch (flag)
19  {
20  case AircraftIcaoEntity: return QStringLiteral("Aircraft ICAO");
21  case AircraftCategoryEntity: return QStringLiteral("Aircraft category");
22  case AirlineIcaoEntity: return QStringLiteral("Airline ICAO");
23  case AirportEntity: return QStringLiteral("Airport");
24  case AllEntities: return QStringLiteral("All");
25  case AllIcaoAndCountries: return QStringLiteral("All ICAO + country");
26  case AllIcaoEntities: return QStringLiteral("All ICAO");
27  case CountryEntity: return QStringLiteral("Country");
28  case DistributorEntity: return QStringLiteral("Distributor");
29  case DbInfoObjectEntity: return QStringLiteral("Info objects (DB)");
30  case SharedInfoObjectEntity: return QStringLiteral("Info objects (shared)");
31  case LiveryEntity: return QStringLiteral("Livery");
32  case ModelEntity: return QStringLiteral("Model");
33  case NoEntity: return QStringLiteral("no data");
34  case VatsimDataFile: return QStringLiteral("VATSIM data file");
35  case VatsimStatusFile: return QStringLiteral("VATSIM status file");
36  default: SWIFT_VERIFY_X(false, Q_FUNC_INFO, "wrong flags"); return "wrong flags";
37  }
38  }
39 
40  QStringList CEntityFlags::entitiesToStringList(CEntityFlags::Entity entities)
41  {
42  QStringList list;
43  if (entities.testFlag(AircraftIcaoEntity)) list << QStringLiteral("Aircraft ICAO");
44  if (entities.testFlag(AircraftCategoryEntity)) list << QStringLiteral("Aircraft category");
45  if (entities.testFlag(AirlineIcaoEntity)) list << QStringLiteral("Airline ICAO");
46  if (entities.testFlag(AirportEntity)) list << QStringLiteral("Airport");
47  if (entities.testFlag(CountryEntity)) list << QStringLiteral("Country");
48  if (entities.testFlag(DistributorEntity)) list << QStringLiteral("Distributor");
49  if (entities.testFlag(DbInfoObjectEntity)) list << QStringLiteral("Info objects (DB)");
50  if (entities.testFlag(SharedInfoObjectEntity)) list << QStringLiteral("Info objects (shared)");
51  if (entities.testFlag(LiveryEntity)) list << QStringLiteral("Livery");
52  if (entities.testFlag(ModelEntity)) list << QStringLiteral("Model");
53  if (entities.testFlag(NoEntity)) list << QStringLiteral("no data");
54  if (entities.testFlag(VatsimDataFile)) list << QStringLiteral("VATSIM data file");
55  if (entities.testFlag(VatsimStatusFile)) list << QStringLiteral("VATSIM status file");
56  return list;
57  }
58 
59  QString CEntityFlags::entitiesToString(CEntityFlags::Entity entities, const QString &separator)
60  {
61  return entitiesToStringList(entities).join(separator);
62  }
63 
64  bool CEntityFlags::isSingleEntity(swift::misc::network::CEntityFlags::Entity flag)
65  {
66  return numberOfEntities(flag) == 1;
67  }
68 
70  {
71  return state == ReadFinished || state == ReadFinishedRestricted;
72  }
73 
75  {
76  if (isFinishedReadState(state)) { return true; }
77  return state == ReadFailed || state == ReadSkipped;
78  }
79 
80  int CEntityFlags::numberOfEntities(CEntityFlags::Entity entities)
81  {
82  const int c = static_cast<int>(std::bitset<(sizeof(entities) * 8)>(entities).count());
83  return c;
84  }
85 
87  {
88  static const QString f("finished");
89  static const QString fr("finished (restricted)");
90  static const QString p("parsing");
91  static const QString fa("failed");
92  static const QString s("skipped");
93  static const QString st("read started");
94  static const QString x("wrong flags");
95 
96  switch (flag)
97  {
98  case ReadFinishedRestricted: return fr;
99  case ReadFinished: return f;
100  case ReadParsing: return p;
101  case ReadFailed: return fa;
102  case ReadSkipped: return s;
103  case ReadStarted: return st;
104  default: SWIFT_VERIFY_X(false, Q_FUNC_INFO, "wrong flags"); return x;
105  }
106  }
107 
109  {
110  switch (state)
111  {
112  case ReadFinished:
114  case ReadParsing:
118  default: Q_ASSERT_X(false, Q_FUNC_INFO, "Missing state"); return CStatusMessage::SeverityInfo;
119  }
120  }
121 
123  {
124  return static_cast<Entity>(static_cast<int>(entityFlag));
125  }
126 
128  {
129  return static_cast<EntityFlag>(static_cast<int>(entity));
130  }
131 
132  CEntityFlags::Entity CEntityFlags::iterateDbEntities(Entity &entities)
133  {
134  if (entities == NoEntity || entities == DbInfoObjectEntity) { return NoEntity; }
135  if (entities.testFlag(AircraftIcaoEntity))
136  {
137  entities &= ~AircraftIcaoEntity;
138  return AircraftIcaoEntity;
139  }
140  if (entities.testFlag(AirlineIcaoEntity))
141  {
142  entities &= ~AirlineIcaoEntity;
143  return AirlineIcaoEntity;
144  }
145  if (entities.testFlag(AirportEntity))
146  {
147  entities &= ~AirportEntity;
148  return AirportEntity;
149  }
150  if (entities.testFlag(LiveryEntity))
151  {
152  entities &= ~LiveryEntity;
153  return LiveryEntity;
154  }
155  if (entities.testFlag(CountryEntity))
156  {
157  entities &= ~CountryEntity;
158  return CountryEntity;
159  }
160  if (entities.testFlag(ModelEntity))
161  {
162  entities &= ~ModelEntity;
163  return ModelEntity;
164  }
165  if (entities.testFlag(DistributorEntity))
166  {
167  entities &= ~DistributorEntity;
168  return DistributorEntity;
169  }
170  if (entities.testFlag(AircraftCategoryEntity))
171  {
172  entities &= ~AircraftCategoryEntity;
173  return AircraftCategoryEntity;
174  }
175  return NoEntity;
176  }
177 
179  {
181  switch (s)
182  {
184  case CStatusMessage::SeverityWarning: return true;
185  default: return false;
186  }
187  }
188 
189  bool CEntityFlags::anySwiftDbEntity(Entity entities)
190  {
191  const Entity dbEntities = entities & AllDbEntitiesNoInfoObjects;
192  return dbEntities != CEntityFlags::NoEntity;
193  }
194 
195  CEntityFlags::Entity CEntityFlags::singleEntityByName(const QString &name)
196  {
197  // order here is crucial
198  if (name.contains("model", Qt::CaseInsensitive)) { return ModelEntity; }
199  if (name.contains("category", Qt::CaseInsensitive)) { return AircraftCategoryEntity; }
200  if (name.contains("aircraft", Qt::CaseInsensitive)) { return AircraftIcaoEntity; }
201  if (name.contains("airline", Qt::CaseInsensitive)) { return AirlineIcaoEntity; }
202  if (name.contains("airport", Qt::CaseInsensitive)) { return AirportEntity; }
203  if (name.contains("distributor", Qt::CaseInsensitive)) { return DistributorEntity; }
204  if (name.contains("countr", Qt::CaseInsensitive)) { return CountryEntity; } // singular/plural
205  if (name.contains("liver", Qt::CaseInsensitive)) { return LiveryEntity; } // singular/plural
206  return NoEntity;
207  }
208 
209  CEntityFlags::Entity CEntityFlags::multipleEntitiesByNames(const QStringList &names)
210  {
211  CEntityFlags::Entity entities = NoEntity;
212  for (const QString &name : names)
213  {
214  const CEntityFlags::Entity singleEntity = CEntityFlags::singleEntityByName(name);
215  if (singleEntity == NoEntity) { continue; }
216  entities |= singleEntity;
217  }
218  return entities;
219  }
220 
222  {
224  CEntityFlags::Entity currentEntity = iterateDbEntities(entities);
225  while (currentEntity != NoEntity)
226  {
227  s.insert(currentEntity);
228  currentEntity = iterateDbEntities(entities);
229  }
230  return s;
231  }
232 
234  {
235  // this is no value class and I register enums here,
236  // that's why I do not use the Mixins
237  qRegisterMetaType<CEntityFlags::Entity>();
238  qRegisterMetaType<CEntityFlags::EntityFlag>();
239  qRegisterMetaType<CEntityFlags::ReadState>();
240  }
241 } // namespace swift::misc::network
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
constexpr static auto SeverityError
Status severities.
constexpr static auto SeverityInfo
Status severities.
constexpr static auto SeverityWarning
Status severities.
static bool isFinishedReadState(ReadState state)
Any finished state.
Definition: entityflags.cpp:69
static bool isSingleEntity(CEntityFlags::Entity flag)
Representing single entity?
Definition: entityflags.cpp:64
static QStringList entitiesToStringList(CEntityFlags::Entity entities)
Entities to string list.
Definition: entityflags.cpp:40
QSet< CEntityFlags::Entity > EntitySet
Set of CEntityFlags::Entity.
Definition: entityflags.h:57
static EntityFlag entityToEntityFlag(Entity entity)
To flag (when explicit conversion is needed)
static int numberOfEntities(CEntityFlags::Entity entities)
Represented number of entities.
Definition: entityflags.cpp:80
static EntitySet asSingleEntities(Entity entities)
As set of single entities.
static void registerMetadata()
Register metadata.
static Entity entityFlagToEntity(EntityFlag entityFlag)
To entity (when explicit conversion is needed)
static Entity singleEntityByName(const QString &name)
Get by name.
static Entity multipleEntitiesByNames(const QStringList &names)
Get by multiple names.
EntityFlag
Which data to read, requires corresponding readers.
Definition: entityflags.h:26
@ AircraftCategoryEntity
aircraft category entities
Definition: entityflags.h:40
@ VatsimStatusFile
the VATSIM status file (URLs for data files etc.)
Definition: entityflags.h:38
@ AllDbEntitiesNoInfoObjects
all DB entities, no info objects
Definition: entityflags.h:48
@ AllIcaoAndCountries
all ICAO codes and countries
Definition: entityflags.h:43
@ DbInfoObjectEntity
info about DB data (kind of metadata)
Definition: entityflags.h:28
@ AirlineIcaoEntity
ICAO codes for airlines.
Definition: entityflags.h:31
@ SharedInfoObjectEntity
info about shared DB data (metadata)
Definition: entityflags.h:29
@ AircraftIcaoEntity
ICAO codes for aircraft.
Definition: entityflags.h:30
@ VatsimDataFile
the VATSIM data file (multiple data entities)
Definition: entityflags.h:37
static bool isWarningOrAbove(ReadState state)
Read state representing warning or above?
static CStatusMessage::StatusSeverity flagToSeverity(ReadState state)
Flag to severity.
@ ReadFinishedRestricted
finished a timestamp restricted read
Definition: entityflags.h:65
@ ReadStarted
reading has been started
Definition: entityflags.h:62
@ ReadSkipped
read skipped, e.g.
Definition: entityflags.h:67
static const QString & stateToString(ReadState flag)
Convert to string.
Definition: entityflags.cpp:86
static Entity iterateDbEntities(Entity &entities)
Return single entity and remove it from entities.
static bool anySwiftDbEntity(Entity entities)
Representing at least one DB entity.
static bool isFinishedReadStateOrFailure(ReadState state)
Any finished state.
Definition: entityflags.cpp:74
static QString entitiesToString(CEntityFlags::Entity entities, const QString &separator=", ")
Entities to string list.
Definition: entityflags.cpp:59
static QString flagToString(CEntityFlags::EntityFlag flag)
Convert to string.
Definition: entityflags.cpp:16
StatusSeverity
Status severities.
Definition: statusmessage.h:35
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.
Definition: verify.h:26