Ref T26, Ref T27, utility functions in "value object" classes

This commit is contained in:
Klaus Basan
2017-06-24 23:39:41 +02:00
parent 28a2ca6ad6
commit 0c336952d2
10 changed files with 97 additions and 9 deletions

View File

@@ -252,6 +252,23 @@ namespace BlackMisc
return combined.join(", ");
}
bool CAircraftIcaoCode::matchesAnyDescription(const QString &candidate) const
{
if (this->hasModelDescription())
{
if (this->getModelDescription().contains(candidate, Qt::CaseInsensitive)) { return true; }
}
if (this->hasModelIataDescription())
{
if (this->getModelIataDescription().contains(candidate, Qt::CaseInsensitive)) { return true; }
}
if (this->hasModelSwiftDescription())
{
if (this->getModelSwiftDescription().contains(candidate, Qt::CaseInsensitive)) { return true; }
}
return false;
}
bool CAircraftIcaoCode::matchesCombinedType(const QString &combinedType) const
{
const QString cc(combinedType.toUpper().trimmed().replace(' ', '*').replace('-', '*'));

View File

@@ -152,6 +152,9 @@ namespace BlackMisc
//! Combined description
QString getCombinedModelDescription() const;
//! Matches any of the (unempty) descriptions
bool matchesAnyDescription(const QString &candidate) const;
//! Matches given combined code
//! \remark * can be used as wildcard, e.g. L*J, L**
bool matchesCombinedType(const QString &combinedType) const;

View File

@@ -124,6 +124,14 @@ namespace BlackMisc
});
}
CAircraftIcaoCodeList CAircraftIcaoCodeList::findMatchingByAnyDescription(const QString &description) const
{
return this->findBy([&](const CAircraftIcaoCode & code)
{
return code.matchesAnyDescription(description);
});
}
CAircraftIcaoCodeList CAircraftIcaoCodeList::findWithIataCode(bool removeWhenSameAsDesignator) const
{
return this->findBy([&](const CAircraftIcaoCode & code)
@@ -142,6 +150,14 @@ namespace BlackMisc
});
}
CAircraftIcaoCodeList CAircraftIcaoCodeList::findByMilitaryFlag(bool military) const
{
return this->findBy([&](const CAircraftIcaoCode & code)
{
return (code.isMilitary() == military);
});
}
CAircraftIcaoCode CAircraftIcaoCodeList::findFirstByDesignatorAndRank(const QString &designator) const
{
if (!CAircraftIcaoCode::isValidDesignator(designator)) { return CAircraftIcaoCode(); }
@@ -269,35 +285,40 @@ namespace BlackMisc
if (icaoPattern.hasValidDbKey())
{
const int k = icaoPattern.getDbKey();
CAircraftIcaoCode c(this->findByKey(k));
const CAircraftIcaoCode c(this->findByKey(k));
if (c.hasCompleteData()) { return c; }
}
// get an initial set of data we can choose from
const QString d(icaoPattern.getDesignator());
if (d.isEmpty()) { return CAircraftIcaoCode(); }
const QString designator(icaoPattern.getDesignator());
if (designator.isEmpty()) { return CAircraftIcaoCode(); }
CAircraftIcaoCodeList codes;
do
{
codes = this->findByDesignator(d);
codes = this->findByDesignator(designator);
if (!codes.isEmpty()) break;
// now we search if the ICAO designator is actually an IATA code
codes = this->findByIataCode(d);
codes = this->findByIataCode(designator);
if (!codes.isEmpty()) break;
if (d.length() > 4)
// search by reduced length
if (designator.length() >= 4)
{
codes = this->findByDesignator(d.left(4));
codes = this->findByDesignator(designator.left(4));
if (!codes.isEmpty()) break;
}
// still empty, try to find by family
codes = this->findByFamily(d);
codes = this->findByFamily(designator);
if (!codes.isEmpty()) break;
// now try to find as ending
codes = this->findEndingWith(d);
codes = this->findEndingWith(designator);
if (!codes.isEmpty()) break;
// by any descriptionS
codes = this->findMatchingByAnyDescription(designator);
}
while (false);

View File

@@ -76,12 +76,18 @@ namespace BlackMisc
//! Find by model description
CAircraftIcaoCodeList findByDescription(const QString &description) const;
//! Find matching by any model description
CAircraftIcaoCodeList findMatchingByAnyDescription(const QString &description) const;
//! Those with IATA code
CAircraftIcaoCodeList findWithIataCode(bool removeWhenSameAsDesignator) const;
//! Those with family
CAircraftIcaoCodeList findWithFamily(bool removeWhenSameAsDesignator) const;
//! By military flag
CAircraftIcaoCodeList findByMilitaryFlag(bool military) const;
//! Find by designator, then best match by rank
CAircraftIcaoCode findFirstByDesignatorAndRank(const QString &designator) const;

View File

@@ -61,6 +61,12 @@ namespace BlackMisc
return cs;
}
template<class OBJ, class CONTAINER>
QStringList ICallsignObjectList<OBJ, CONTAINER>::getCallsignStrings() const
{
return this->getCallsigns().getCallsignStrings();
}
template <class OBJ, class CONTAINER>
CONTAINER ICallsignObjectList<OBJ, CONTAINER>::findByCallsign(const CCallsign &callsign) const
{

View File

@@ -57,6 +57,9 @@ namespace BlackMisc
//! All callsigns
BlackMisc::Aviation::CCallsignSet getCallsigns() const;
//! Get callsign string list
QStringList getCallsignStrings() const;
//! Find 0..n stations by callsign
CONTAINER findByCallsign(const CCallsign &callsign) const;

View File

@@ -26,6 +26,16 @@ namespace BlackMisc
CCollection<CCallsign>(other)
{ }
QStringList CCallsignSet::getCallsignStrings() const
{
QStringList callsigns;
for (const CCallsign &cs : *this)
{
callsigns.push_back(cs.asString());
}
return callsigns;
}
void CCallsignSet::registerMetadata()
{
qRegisterMetaType<BlackMisc::CSequence<CCallsign>>();

View File

@@ -39,6 +39,9 @@ namespace BlackMisc
//! Construct from a base class object.
CCallsignSet(const CCollection<CCallsign> &other);
//! The callsign strings
QStringList getCallsignStrings() const;
//! Register metadata
static void registerMetadata();
};

View File

@@ -219,6 +219,19 @@ namespace BlackMisc
});
}
CAircraftModelList CAircraftModelList::findByCombinedTypeWithColorLivery(const QString &combinedType) const
{
return this->findByCombinedType(combinedType).findColorLiveries();
}
CAircraftModelList CAircraftModelList::findColorLiveries() const
{
return this->findBy([ = ](const CAircraftModel & model)
{
return model.getLivery().isColorLivery();
});
}
CAircraftModelList CAircraftModelList::findByMilitaryFlag(bool military) const
{
return this->findBy([ = ](const CAircraftModel & model)

View File

@@ -138,6 +138,12 @@ namespace BlackMisc
//! Find by combined code, wildcards possible e.g. L*P, *2J
CAircraftModelList findByCombinedType(const QString &combinedType) const;
//! Find aircraft with color livery by combined code, wildcards possible e.g. L*P, *2J
CAircraftModelList findByCombinedTypeWithColorLivery(const QString &combinedType) const;
//! Find models with color liveries
CAircraftModelList findColorLiveries() const;
//! Find by military flag
CAircraftModelList findByMilitaryFlag(bool military) const;