swift
airportlist.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 <QString>
7 
9 #include "misc/setbuilder.h"
10 
11 using namespace swift::misc::physical_quantities;
12 
13 SWIFT_DEFINE_SEQUENCE_MIXINS(swift::misc::aviation, CAirport, CAirportList)
14 
15 namespace swift::misc::aviation
16 {
17  CAirportList::CAirportList(const CSequence<CAirport> &other) : CSequence<CAirport>(other) {}
18 
20  {
21  return this->findBy(&CAirport::getIcao, icao);
22  }
23 
25  {
26  if (icao.isEmpty()) { return false; }
27  return this->contains(&CAirport::getIcao, icao);
28  }
29 
30  void CAirportList::replaceOrAddByIcao(const CAirport &addedOrReplacedAirport)
31  {
32  if (!addedOrReplacedAirport.hasValidIcaoCode()) return; // ignore invalid airport
33  this->replaceOrAdd(&CAirport::getIcao, addedOrReplacedAirport.getIcao(), addedOrReplacedAirport);
34  }
35 
36  void CAirportList::updateMissingParts(const CAirportList &updateFromList)
37  {
38  if (updateFromList.isEmpty()) { return; }
39  for (CAirport &airport : *this)
40  {
41  const CAirport fromAirport = updateFromList.findFirstByIcao(airport.getIcao());
42  if (fromAirport.hasValidIcaoCode()) { airport.updateMissingParts(fromAirport); }
43  }
44  }
45 
47  {
48  return this->findFirstByOrDefault(&CAirport::getIcao, icao, CAirport());
49  }
50 
51  CAirport CAirportList::findFirstByNameOrLocation(const QString &nameOrLocation) const
52  {
53  if (this->isEmpty() || nameOrLocation.isEmpty()) { return CAirport(); }
54  CAirportList airports =
55  this->findBy([&](const CAirport &airport) { return airport.matchesDescriptiveName(nameOrLocation); });
56  if (!airports.isEmpty()) { return airports.frontOrDefault(); }
57 
58  airports = this->findBy([&](const CAirport &airport) { return airport.matchesLocation(nameOrLocation); });
59  if (!airports.isEmpty()) { return airports.frontOrDefault(); }
60  return CAirport();
61  }
62 
63  QStringList CAirportList::allIcaoCodes(bool sorted) const
64  {
65  QStringList icaos;
66  for (const CAirport &airport : *this)
67  {
68  if (airport.getIcaoAsString().isEmpty()) { continue; }
69  icaos.push_back(airport.getIcaoAsString());
70  }
71  if (sorted) { icaos.sort(); }
72  return icaos;
73  }
74 
75  QStringList CAirportList::allDescriptivesNames(bool sorted) const
76  {
77  QStringList names;
78  for (const CAirport &airport : *this)
79  {
80  if (airport.getDescriptiveName().isEmpty()) { continue; }
81  names.push_back(airport.getDescriptiveName());
82  }
83  if (sorted) { names.sort(); }
84  return names;
85  }
86 
87  QStringList CAirportList::allLocations() const
88  {
89  CSetBuilder<QString> locations;
90  for (const CAirport &airport : *this)
91  {
92  if (airport.getLocation().isEmpty()) { continue; }
93  locations.insert(airport.getLocation());
94  }
95 
96  return locations;
97  }
98 
100  {
101  QStringList locations;
102  for (const CAirport &airport : *this)
103  {
104  const QString l = airport.getLocationPlusOptionalName();
105  if (l.isEmpty()) { continue; }
106  locations.push_back(l);
107  }
108  if (sorted) { locations.sort(); }
109  return locations;
110  }
111 
112  CAirportList CAirportList::fromDatabaseJson(const QJsonArray &array, CAirportList *inconsistent)
113  {
114  CAirportList airports;
115  Q_UNUSED(inconsistent); // not yet implemented, but signature already prepared
116  for (const QJsonValue &value : array)
117  {
118  const CAirport airport(CAirport::fromDatabaseJson(value.toObject()));
119  airports.push_back(airport);
120  }
121  return airports;
122  }
123 } // namespace swift::misc::aviation
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...
Definition: range.h:70
bool contains(const T &object) const
Return true if there is an element equal to given object. Uses the most efficient implementation avai...
Definition: range.h:109
const_reference frontOrDefault() const
Access the first element, or a default-initialized value if the sequence is empty.
Definition: sequence.h:239
CSequence findBy(Predicate p) const
Return a copy containing only those elements for which a given predicate returns true.
Definition: sequence.h:398
void replaceOrAdd(const CAirport &original, const CAirport &replacement)
Replace elements matching the given element. If there is no match, push the new element on the end.
Definition: sequence.h:521
Q_REQUIRED_RESULT CSequence sorted(Predicate p) const
Return a copy sorted by a given comparator predicate.
Definition: sequence.h:583
void push_back(const T &value)
Appends an element at the end of the sequence.
Definition: sequence.h:305
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
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
Value object encapsulating information about an airpot.
Definition: airport.h:36
bool matchesLocation(const QString &location) const
Matches location?
Definition: airport.cpp:42
QString getLocationPlusOptionalName() const
Location plus optional name (if available and different from location)
Definition: airport.cpp:34
bool matchesDescriptiveName(const QString &name) const
Matches name?
Definition: airport.cpp:48
static CAirport fromDatabaseJson(const QJsonObject &json, const QString &prefix=QString())
Object from JSON.
Definition: airport.cpp:75
const QString & getLocation() const
Get location (e.g. "London")
Definition: airport.h:73
bool hasValidIcaoCode() const
Valid ICAO code.
Definition: airport.h:132
void updateMissingParts(const CAirport &airport)
Update the missing parts in airport.
Definition: airport.cpp:54
const QString & getDescriptiveName() const
Get descriptive name.
Definition: airport.h:85
const CAirportIcaoCode & getIcao() const
Get ICAO code.
Definition: airport.h:64
const QString & getIcaoAsString() const
Get ICAO code as string.
Definition: airport.h:67
Value object encapsulating information of airport ICAO data.
Value object for a list of airports.
Definition: airportlist.h:29
QStringList allIcaoCodes(bool sorted) const
All ICAO codes.
Definition: airportlist.cpp:63
QStringList allDescriptivesNames(bool sorted) const
All names.
Definition: airportlist.cpp:75
static CAirportList fromDatabaseJson(const QJsonArray &array, CAirportList *inconsistent=nullptr)
From our DB JSON.
bool containsAirportWithIcaoCode(const CAirportIcaoCode &icao) const
Containing an airport with given ICAO code?
Definition: airportlist.cpp:24
void updateMissingParts(const CAirportList &updateFromList)
Update this list from the other list.
Definition: airportlist.cpp:36
CAirport findFirstByIcao(const CAirportIcaoCode &icao) const
Find first station by callsign, if not return default.
Definition: airportlist.cpp:46
CAirport findFirstByNameOrLocation(const QString &nameOrLocation) const
Find first by name or location, if not return default.
Definition: airportlist.cpp:51
CAirportList findByIcao(const CAirportIcaoCode &icao) const
Find 0..n airports by ICAO code.
Definition: airportlist.cpp:19
QStringList allLocationsPlusOptionalDescription(bool sorted) const
All locations plus optional description.
Definition: airportlist.cpp:99
QStringList allLocations() const
All locations.
Definition: airportlist.cpp:87
void replaceOrAddByIcao(const CAirport &addedOrReplacedAirport)
Replace or add based on same ICAO code.
Definition: airportlist.cpp:30
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.
Definition: sequence.h:63