Ref T129, some more utility functions for aviation value objects

* removed static variables from SELCAL
* more finder functions for airline ICAO list
* check for IATA code
* unify callsign now public
This commit is contained in:
Klaus Basan
2017-10-07 02:24:56 +02:00
committed by Mathew Sutcliffe
parent 686cb03170
commit 3fb2f88032
7 changed files with 56 additions and 16 deletions

View File

@@ -317,13 +317,19 @@ namespace BlackMisc
bool CAirlineIcaoCode::isValidAirlineDesignator(const QString &airline) bool CAirlineIcaoCode::isValidAirlineDesignator(const QString &airline)
{ {
// allow 2 chars for IATA // allow 2 chars for special codes like "VV"
if (airline.length() < 2 || airline.length() > 5) { return false; } if (airline.length() < 2 || airline.length() > 5) { return false; }
const auto chars = makeRange(airline.begin(), airline.end()); const auto chars = makeRange(airline.begin(), airline.end());
if (chars.containsBy([](QChar c) { return !c.isUpper() && !c.isDigit(); })) { return false; } if (chars.containsBy([](QChar c) { return !c.isUpper() && !c.isDigit(); })) { return false; }
return true; return true;
} }
bool CAirlineIcaoCode::isValidIataCode(const QString &iataCode)
{
if (iataCode.length() != 2) { return false; }
return isValidAirlineDesignator(iataCode); // allow some chars as in IACO
}
QSet<QString> CAirlineIcaoCode::specialValidDesignators() QSet<QString> CAirlineIcaoCode::specialValidDesignators()
{ {
static const QSet<QString> valid({ "VV", "VM"}); static const QSet<QString> valid({ "VV", "VM"});

View File

@@ -228,6 +228,9 @@ namespace BlackMisc
//! Valid designator? //! Valid designator?
static bool isValidAirlineDesignator(const QString &airline); static bool isValidAirlineDesignator(const QString &airline);
//! Valid IATA code?
static bool isValidIataCode(const QString &iataCode);
//! Some special valid designator which do not fit standard rule (e.g. 3-letter code) //! Some special valid designator which do not fit standard rule (e.g. 3-letter code)
static QSet<QString> specialValidDesignators(); static QSet<QString> specialValidDesignators();

View File

@@ -36,13 +36,19 @@ namespace BlackMisc
CAirlineIcaoCodeList CAirlineIcaoCodeList::findByIataCode(const QString &iata) const CAirlineIcaoCodeList CAirlineIcaoCodeList::findByIataCode(const QString &iata) const
{ {
if (iata.isEmpty()) { return CAirlineIcaoCodeList(); } if (!CAirlineIcaoCode::isValidIataCode(iata)) { return CAirlineIcaoCodeList(); }
return this->findBy([&](const CAirlineIcaoCode & code) return this->findBy([&](const CAirlineIcaoCode & code)
{ {
return code.matchesIataCode(iata); return code.matchesIataCode(iata);
}); });
} }
CAirlineIcaoCode CAirlineIcaoCodeList::findByUniqueIataCodeOrDefault(const QString &iata) const
{
const CAirlineIcaoCodeList codes = this->findByIataCode(iata);
return codes.size() == 1 ? codes.front() : CAirlineIcaoCode();
}
CAirlineIcaoCodeList CAirlineIcaoCodeList::findByDesignatorOrIataCode(const QString &designatorOrIata) const CAirlineIcaoCodeList CAirlineIcaoCodeList::findByDesignatorOrIataCode(const QString &designatorOrIata) const
{ {
if (designatorOrIata.isEmpty()) { return CAirlineIcaoCodeList(); } if (designatorOrIata.isEmpty()) { return CAirlineIcaoCodeList(); }
@@ -61,6 +67,16 @@ namespace BlackMisc
}); });
} }
CAirlineIcaoCode CAirlineIcaoCodeList::findByUniqueVDesignatorOrDefault(const QString &designator, bool preferOperatingAirlines) const
{
CAirlineIcaoCodeList codes = this->findByVDesignator(designator);
if (codes.size() > 1 && preferOperatingAirlines)
{
codes.removeIf(&CAirlineIcaoCode::isOperating, false);
}
return codes.size() == 1 ? codes.front() : CAirlineIcaoCode();
}
CAirlineIcaoCodeList CAirlineIcaoCodeList::findByVDesignatorOrIataCode(const QString &designatorOrIata) const CAirlineIcaoCodeList CAirlineIcaoCodeList::findByVDesignatorOrIataCode(const QString &designatorOrIata) const
{ {
if (designatorOrIata.isEmpty()) { return CAirlineIcaoCodeList(); } if (designatorOrIata.isEmpty()) { return CAirlineIcaoCodeList(); }
@@ -262,5 +278,12 @@ namespace BlackMisc
if (designator.isEmpty()) { return false; } if (designator.isEmpty()) { return false; }
return this->contains(&CAirlineIcaoCode::getDesignator, designator.toUpper()); return this->contains(&CAirlineIcaoCode::getDesignator, designator.toUpper());
} }
bool CAirlineIcaoCodeList::containsVDesignator(const QString &vDesignator) const
{
if (vDesignator.isEmpty()) { return false; }
if (vDesignator.length() < 4) { return this->containsDesignator(vDesignator); }
return this->contains(&CAirlineIcaoCode::getVDesignator, vDesignator.toUpper());
}
} // ns } // ns
} // ns } // ns

View File

@@ -52,10 +52,16 @@ namespace BlackMisc
//! Find by v-designator, this should be unique //! Find by v-designator, this should be unique
CAirlineIcaoCodeList findByVDesignator(const QString &designator) const; CAirlineIcaoCodeList findByVDesignator(const QString &designator) const;
//! Find by ICAO code if this is unique, otherwise return default object
CAirlineIcaoCode findByUniqueVDesignatorOrDefault(const QString &designator, bool preferOperatingAirlines) const;
//! Find by IATA code //! Find by IATA code
//! Not unique because of virtual airlines //! Not unique because of virtual airlines and ceased airlines
CAirlineIcaoCodeList findByIataCode(const QString &iata) const; CAirlineIcaoCodeList findByIataCode(const QString &iata) const;
//! Find by IATA code if this is unique, otherwise return default object
CAirlineIcaoCode findByUniqueIataCodeOrDefault(const QString &iata) const;
//! Find by designator or IATA code //! Find by designator or IATA code
CAirlineIcaoCodeList findByDesignatorOrIataCode(const QString &designatorOrIata) const; CAirlineIcaoCodeList findByDesignatorOrIataCode(const QString &designatorOrIata) const;
@@ -98,6 +104,9 @@ namespace BlackMisc
//! Contains given designator? //! Contains given designator?
bool containsDesignator(const QString &designator) const; bool containsDesignator(const QString &designator) const;
//! Contains given designator?
bool containsVDesignator(const QString &vDesignator) const;
//! From our DB JSON //! From our DB JSON
static CAirlineIcaoCodeList fromDatabaseJson(const QJsonArray &array, bool ignoreIncomplete = true, CAirlineIcaoCodeList *inconsistent = nullptr); static CAirlineIcaoCodeList fromDatabaseJson(const QJsonArray &array, bool ignoreIncomplete = true, CAirlineIcaoCodeList *inconsistent = nullptr);
}; };

View File

@@ -134,6 +134,9 @@ namespace BlackMisc
//! Valid callsign? //! Valid callsign?
static bool isValidAtcCallsign(const CCallsign &callsign); static bool isValidAtcCallsign(const CCallsign &callsign);
//! Unify the callsign by removing illegal characters
static QString unifyCallsign(const QString &callsign);
//! List of real ATC suffixes (e.g. TWR); //! List of real ATC suffixes (e.g. TWR);
static const QStringList &atcCallsignSuffixes(); static const QStringList &atcCallsignSuffixes();
@@ -161,10 +164,6 @@ namespace BlackMisc
//! \copydoc BlackMisc::Mixin::String::toQString() //! \copydoc BlackMisc::Mixin::String::toQString()
QString convertToQString(bool i18n = false) const; QString convertToQString(bool i18n = false) const;
protected:
//! Unify the callsign
static QString unifyCallsign(const QString &callsign);
private: private:
QString m_callsignAsSet; QString m_callsignAsSet;
QString m_callsign; QString m_callsign;

View File

@@ -33,7 +33,7 @@ namespace BlackMisc
{ {
if (CSelcal::isValidCharacter(c)) { s += c;} if (CSelcal::isValidCharacter(c)) { s += c;}
} }
return s.length() == 4 ? s : QString(""); return CSelcal::isValidCode(s) ? s : QString("");
} }
bool CSelcal::equalsString(const QString &code) const bool CSelcal::equalsString(const QString &code) const
@@ -83,8 +83,8 @@ namespace BlackMisc
{ {
int pos = CSelcal::validCharacters().indexOf(c); int pos = CSelcal::validCharacters().indexOf(c);
Q_ASSERT(pos >= 0); Q_ASSERT(pos >= 0);
Q_ASSERT(CSelcal::frequencyEquivalents.size() > pos); Q_ASSERT(CSelcal::audioFrequencyEquivalents().size() > pos);
return CSelcal::frequencyEquivalents[pos]; return CSelcal::audioFrequencyEquivalents()[pos];
} }
const QList<CFrequency> &CSelcal::audioFrequencyEquivalents() const QList<CFrequency> &CSelcal::audioFrequencyEquivalents()

View File

@@ -70,12 +70,6 @@ namespace BlackMisc
//! Valid SELCAL code? //! Valid SELCAL code?
static bool isValidCode(const QString &code); static bool isValidCode(const QString &code);
//! Audio frequency for character
static const PhysicalQuantities::CFrequency &audioFrequencyEquivalent(QChar c);
//! All audio frequencies
static const QList<PhysicalQuantities::CFrequency> &audioFrequencyEquivalents();
//! All valid code pairs: AB, AC, AD ... //! All valid code pairs: AB, AC, AD ...
static const QStringList &codePairs(); static const QStringList &codePairs();
@@ -83,6 +77,12 @@ namespace BlackMisc
static QString unifyCode(const QString &selcalCandidate); static QString unifyCode(const QString &selcalCandidate);
private: private:
//! Audio frequency for character
static const PhysicalQuantities::CFrequency &audioFrequencyEquivalent(QChar c);
//! All audio frequencies
static const QList<PhysicalQuantities::CFrequency> &audioFrequencyEquivalents();
QString m_code; QString m_code;
BLACK_METACLASS( BLACK_METACLASS(