From a4b317b100a985075c0862b9f6ebd12acc0fcd90 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Fri, 4 Jul 2014 23:32:38 +0100 Subject: [PATCH] refs #290 using a CRange of iterator adaptors in implementating the tertiary predicate-based methods of the derived containers, but preserving the return-by-copy for API stability --- samples/blacksim/samplesmodelmapping.cpp | 2 +- src/blackcore/vatsimdatafilereader.cpp | 16 ++------------- src/blackmisc/audiodevicelist.cpp | 16 ++------------- src/blackmisc/avaircraftlist.cpp | 20 +++++++++---------- src/blackmisc/avaircraftlist.h | 4 ++++ src/blackmisc/avairportlist.cpp | 4 +--- src/blackmisc/avatcstationlist.cpp | 20 +++++++++---------- src/blackmisc/avatcstationlist.h | 4 ++++ src/blackmisc/hwkeyboardkeylist.cpp | 6 +----- src/blackmisc/nwaircraftmapping.h | 3 +++ src/blackmisc/nwaircraftmappinglist.cpp | 25 ++++++++++++------------ src/blackmisc/nwaircraftmappinglist.h | 7 +++++-- src/blackmisc/nwtextmessagelist.cpp | 2 +- src/blackmisc/statusmessagelist.cpp | 20 ++----------------- src/blacksim/simulatorinfolist.cpp | 8 +------- src/blacksim/simulatormodelmappings.cpp | 9 +++++++-- src/blacksim/simulatormodelmappings.h | 7 +++++-- 17 files changed, 71 insertions(+), 102 deletions(-) diff --git a/samples/blacksim/samplesmodelmapping.cpp b/samples/blacksim/samplesmodelmapping.cpp index b028d3046..6009f62af 100644 --- a/samples/blacksim/samplesmodelmapping.cpp +++ b/samples/blacksim/samplesmodelmapping.cpp @@ -29,7 +29,7 @@ namespace BlackSimTest qDebug() << "loaded:" << s << "size:" << cvm.size(); BlackMisc::Aviation::CAircraftIcao icao("C172"); - qDebug() << cvm.findByIcao(icao); + qDebug() << cvm.findByIcaoWildcard(icao); return 0; } diff --git a/src/blackcore/vatsimdatafilereader.cpp b/src/blackcore/vatsimdatafilereader.cpp index cabbe5b6d..315be9661 100644 --- a/src/blackcore/vatsimdatafilereader.cpp +++ b/src/blackcore/vatsimdatafilereader.cpp @@ -62,13 +62,7 @@ namespace BlackCore CUserList CVatsimDataFileReader::getPilotsForCallsigns(const CCallsignList &callsigns) { - CUserList users; - if (callsigns.isEmpty()) return users; - foreach(CCallsign callsign, callsigns) - { - users.push_back(this->getAircrafts().findByCallsign(callsign).getPilots()); - } - return users; + return this->m_aircrafts.findByCallsigns(callsigns).transform(Predicates::MemberTransform(&CAircraft::getPilot)); } CUserList CVatsimDataFileReader::getPilotsForCallsign(const CCallsign &callsign) @@ -100,13 +94,7 @@ namespace BlackCore CUserList CVatsimDataFileReader::getControllersForCallsigns(const CCallsignList &callsigns) { - CUserList users; - if (callsigns.isEmpty()) return users; - foreach(CCallsign callsign, callsigns) - { - users.push_back(this->getAtcStations().findByCallsign(callsign).getControllers()); - } - return users; + return this->m_atcStations.findByCallsigns(callsigns).transform(Predicates::MemberTransform(&CAtcStation::getController)); } CUserList CVatsimDataFileReader::getUsersForCallsigns(const CCallsignList &callsigns) diff --git a/src/blackmisc/audiodevicelist.cpp b/src/blackmisc/audiodevicelist.cpp index b1ccaa7cc..98ef22b72 100644 --- a/src/blackmisc/audiodevicelist.cpp +++ b/src/blackmisc/audiodevicelist.cpp @@ -27,13 +27,7 @@ namespace BlackMisc */ CAudioDeviceList CAudioDeviceList::getOutputDevices() const { - CAudioDeviceList outList; - if (this->isEmpty()) return outList; - foreach(CAudioDevice device, *this) - { - if (device.getType() == CAudioDevice::OutputDevice) outList.push_back(device); - } - return outList; + return this->findBy(&CAudioDevice::getType, CAudioDevice::OutputDevice); } /* @@ -41,13 +35,7 @@ namespace BlackMisc */ CAudioDeviceList CAudioDeviceList::getInputDevices() const { - CAudioDeviceList inList; - if (this->isEmpty()) return inList; - foreach(CAudioDevice device, *this) - { - if (device.getType() == CAudioDevice::InputDevice) inList.push_back(device); - } - return inList; + return this->findBy(&CAudioDevice::getType, CAudioDevice::InputDevice); } /* diff --git a/src/blackmisc/avaircraftlist.cpp b/src/blackmisc/avaircraftlist.cpp index 10b466190..909b1e708 100644 --- a/src/blackmisc/avaircraftlist.cpp +++ b/src/blackmisc/avaircraftlist.cpp @@ -47,14 +47,20 @@ namespace BlackMisc return this->findBy(&CAircraft::getCallsign, callsign); } + /* + * Find by callsigns + */ + CAircraftList CAircraftList::findByCallsigns(const CCallsignList &callsigns) const + { + return this->findBy(Predicates::MemberIsAnyOf(&CAircraft::getCallsign, callsigns)); + } + /* * Find by callsign */ CAircraft CAircraftList::findFirstByCallsign(const CCallsign &callsign, const CAircraft &ifNotFound) const { - CAircraftList aircrafts = this->findByCallsign(callsign); - if (aircrafts.isEmpty()) return ifNotFound; - return aircrafts.front(); + return this->findByCallsign(callsign).frontOrDefault(ifNotFound); } /* @@ -62,13 +68,7 @@ namespace BlackMisc */ CUserList CAircraftList::getPilots() const { - CUserList users; - for (auto i = this->begin(); i != this->end(); ++i) - { - CAircraft aircraft = *i; - if (aircraft.getPilot().isValid()) users.push_back(aircraft.getPilot()); - } - return users; + return this->findBy(Predicates::MemberValid(&CAircraft::getPilot)).transform(Predicates::MemberTransform(&CAircraft::getPilot)); } /* diff --git a/src/blackmisc/avaircraftlist.h b/src/blackmisc/avaircraftlist.h index f81a0728a..33d318d52 100644 --- a/src/blackmisc/avaircraftlist.h +++ b/src/blackmisc/avaircraftlist.h @@ -11,6 +11,7 @@ #define BLACKMISC_AIRCRAFTLIST_H #include "avaircraft.h" +#include "avcallsignlist.h" #include "nwuserlist.h" #include "collection.h" #include "sequence.h" @@ -40,6 +41,9 @@ namespace BlackMisc //! Find 0..n stations by callsign CAircraftList findByCallsign(const CCallsign &callsign) const; + //! Find 0..n aircraft matching any of a set of callsigns + CAircraftList findByCallsigns(const CCallsignList &callsigns) const; + //! Find the first aircraft by callsign, if none return given one CAircraft findFirstByCallsign(const CCallsign &callsign, const CAircraft &ifNotFound = CAircraft()) const; diff --git a/src/blackmisc/avairportlist.cpp b/src/blackmisc/avairportlist.cpp index bfd9c3328..8dbb02c89 100644 --- a/src/blackmisc/avairportlist.cpp +++ b/src/blackmisc/avairportlist.cpp @@ -56,9 +56,7 @@ namespace BlackMisc */ CAirport CAirportList::findFirstByIcao(const CAirportIcao &icao, const CAirport &ifNotFound) const { - CAirportList airports = this->findByIcao(icao); - if (!airports.isEmpty()) return airports[0]; - return ifNotFound; + return this->findByIcao(icao).frontOrDefault(ifNotFound); } /* diff --git a/src/blackmisc/avatcstationlist.cpp b/src/blackmisc/avatcstationlist.cpp index 6e1debc96..a726e9e48 100644 --- a/src/blackmisc/avatcstationlist.cpp +++ b/src/blackmisc/avatcstationlist.cpp @@ -46,14 +46,20 @@ namespace BlackMisc return this->findBy(&CAtcStation::getCallsign, callsign); } + /* + * Find by callsigns + */ + CAtcStationList CAtcStationList::findByCallsigns(const CCallsignList &callsigns) const + { + return this->findBy(Predicates::MemberIsAnyOf(&CAtcStation::getCallsign, callsigns)); + } + /* * Find first by callsign */ CAtcStation CAtcStationList::findFirstByCallsign(const CCallsign &callsign, const CAtcStation &ifNotFound) const { - CAtcStationList stations = findByCallsign(callsign); - if (!stations.isEmpty()) return stations[0]; - return ifNotFound; + return this->findByCallsign(callsign).frontOrDefault(ifNotFound); } /* @@ -94,13 +100,7 @@ namespace BlackMisc */ CUserList CAtcStationList::getControllers() const { - CUserList users; - for (auto i = this->begin(); i != this->end(); ++i) - { - CAtcStation station = *i; - if (station.getController().isValid()) users.push_back(station.getController()); - } - return users; + return this->findBy(Predicates::MemberValid(&CAtcStation::getController)).transform(Predicates::MemberTransform(&CAtcStation::getController)); } /* diff --git a/src/blackmisc/avatcstationlist.h b/src/blackmisc/avatcstationlist.h index c4da4a7e5..4fd128857 100644 --- a/src/blackmisc/avatcstationlist.h +++ b/src/blackmisc/avatcstationlist.h @@ -10,6 +10,7 @@ #include "nwuserlist.h" #include "avatcstation.h" +#include "avcallsignlist.h" #include "collection.h" #include "sequence.h" #include @@ -38,6 +39,9 @@ namespace BlackMisc //! Find 0..n stations by callsign CAtcStationList findByCallsign(const CCallsign &callsign) const; + //! Find 0..n stations matching any of a set of callsigns + CAtcStationList findByCallsigns(const CCallsignList &callsigns) const; + //! Find first station by callsign, if not return given value / default CAtcStation findFirstByCallsign(const CCallsign &callsign, const CAtcStation &ifNotFound = CAtcStation()) const; diff --git a/src/blackmisc/hwkeyboardkeylist.cpp b/src/blackmisc/hwkeyboardkeylist.cpp index 7f8485728..fa9d969d7 100644 --- a/src/blackmisc/hwkeyboardkeylist.cpp +++ b/src/blackmisc/hwkeyboardkeylist.cpp @@ -35,11 +35,7 @@ namespace BlackMisc */ CKeyboardKey CKeyboardKeyList::keyForFunction(CKeyboardKey::HotkeyFunction function) const { - CKeyboardKeyList keys = this->findBy(&CKeyboardKey::getFunction, function); - if (keys.isEmpty()) - return CKeyboardKey(CKeyboardKey::HotkeyNone); - else - return keys[0]; + return this->findBy(&CKeyboardKey::getFunction, function).frontOrDefault({ CKeyboardKey::HotkeyNone }); } /* diff --git a/src/blackmisc/nwaircraftmapping.h b/src/blackmisc/nwaircraftmapping.h index 16bfb1b96..3cbcbdc79 100644 --- a/src/blackmisc/nwaircraftmapping.h +++ b/src/blackmisc/nwaircraftmapping.h @@ -93,6 +93,9 @@ namespace BlackMisc //! Matches model string? bool matchesModelString(const QString &modelString, Qt::CaseSensitivity sensitivity) const; + //! Matches wildcard icao object + bool matchesWildcardIcao(const BlackMisc::Aviation::CAircraftIcao &otherIcao) const { return m_icao.matchesWildcardIcao(otherIcao); } + //! Register the metatypes static void registerMetadata(); diff --git a/src/blackmisc/nwaircraftmappinglist.cpp b/src/blackmisc/nwaircraftmappinglist.cpp index f1309414f..61031a863 100644 --- a/src/blackmisc/nwaircraftmappinglist.cpp +++ b/src/blackmisc/nwaircraftmappinglist.cpp @@ -25,26 +25,25 @@ namespace BlackMisc CSequence(other) { } - CAircraftMappingList CAircraftMappingList::findByIcaoCode(const CAircraftIcao &searchIcao, bool emptyMeansWildcard) const + CAircraftMappingList CAircraftMappingList::findByIcaoCodeWildcard(const CAircraftIcao &searchIcao) const { - if (!emptyMeansWildcard) return this->findBy(&CAircraftMapping::getIcao, searchIcao); - - CAircraftMappingList result; - for (auto it = this->begin() ; it != this->end(); ++it) + return this->findBy([ = ](const CAircraftMapping &mapping) { - if (it->getIcao().matchesWildcardIcao(searchIcao)) result.push_back(*it); - } - return result; + return mapping.matchesWildcardIcao(searchIcao); + }); + } + + CAircraftMappingList CAircraftMappingList::findByIcaoCodeExact(const CAircraftIcao &searchIcao) const + { + return this->findBy(&CAircraftMapping::getIcao, searchIcao); } CAircraftMappingList CAircraftMappingList::findByModelString(const QString modelString, Qt::CaseSensitivity sensitivity) const { - CAircraftMappingList result; - for (auto it = this->begin() ; it != this->end(); ++it) + return this->findBy([ = ](const CAircraftMapping &mapping) { - if (it->matchesModelString(modelString, sensitivity)) result.push_back(*it); - } - return result; + return mapping.matchesModelString(modelString, sensitivity); + }); } /* diff --git a/src/blackmisc/nwaircraftmappinglist.h b/src/blackmisc/nwaircraftmappinglist.h index 8dc53f9f7..7ecc72ed2 100644 --- a/src/blackmisc/nwaircraftmappinglist.h +++ b/src/blackmisc/nwaircraftmappinglist.h @@ -36,8 +36,11 @@ namespace BlackMisc //! QVariant, required for DBus QVariant lists virtual QVariant toQVariant() const override { return QVariant::fromValue(*this); } - //! Find by frequency - CAircraftMappingList findByIcaoCode(const BlackMisc::Aviation::CAircraftIcao &searchIcao, bool emptyMeansWildcard = true) const; + //! Find by ICAO code, empty fields treated as wildcards + CAircraftMappingList findByIcaoCodeWildcard(const BlackMisc::Aviation::CAircraftIcao &searchIcao) const; + + //! Find by ICAO code, empty fields treated literally + CAircraftMappingList findByIcaoCodeExact(const BlackMisc::Aviation::CAircraftIcao &searchIcao) const; //! Find by model string CAircraftMappingList findByModelString(const QString modelString, Qt::CaseSensitivity sensitivity) const; diff --git a/src/blackmisc/nwtextmessagelist.cpp b/src/blackmisc/nwtextmessagelist.cpp index 7e219eed4..7dbaeb3b4 100644 --- a/src/blackmisc/nwtextmessagelist.cpp +++ b/src/blackmisc/nwtextmessagelist.cpp @@ -123,7 +123,7 @@ namespace BlackMisc */ CTextMessageList CTextMessageList::findByFrequency(const CFrequency &frequency) const { - return CTextMessageList(this->findBy(&CTextMessage::getFrequency, frequency)); + return this->findBy(&CTextMessage::getFrequency, frequency); } /* diff --git a/src/blackmisc/statusmessagelist.cpp b/src/blackmisc/statusmessagelist.cpp index bae98dd86..c9f95e75c 100644 --- a/src/blackmisc/statusmessagelist.cpp +++ b/src/blackmisc/statusmessagelist.cpp @@ -20,15 +20,7 @@ namespace BlackMisc */ CStatusMessageList CStatusMessageList::findByType(CStatusMessage::StatusType type) const { - CStatusMessageList sm; - foreach(CStatusMessage message, *this) - { - if (message.getType() == type) - { - sm.push_back(message); - } - } - return sm; + return this->findBy(&CStatusMessage::getType, type); } /* @@ -36,15 +28,7 @@ namespace BlackMisc */ CStatusMessageList CStatusMessageList::findBySeverity(CStatusMessage::StatusSeverity severity) const { - CStatusMessageList sm; - foreach(CStatusMessage message, *this) - { - if (message.getSeverity() == severity) - { - sm.push_back(message); - } - } - return sm; + return this->findBy(&CStatusMessage::getSeverity, severity); } /* diff --git a/src/blacksim/simulatorinfolist.cpp b/src/blacksim/simulatorinfolist.cpp index dc432f23b..6e0947374 100644 --- a/src/blacksim/simulatorinfolist.cpp +++ b/src/blacksim/simulatorinfolist.cpp @@ -17,13 +17,7 @@ namespace BlackSim QStringList CSimulatorInfoList::toStringList(bool i18n) const { - QStringList infoList; - foreach(CSimulatorInfo info, (*this)) - { - QString i = info.toQString(i18n); - infoList.append(i); - } - return infoList; + return this->transform([i18n](const CSimulatorInfo &info) { return info.toQString(i18n); }); } void CSimulatorInfoList::registerMetadata() diff --git a/src/blacksim/simulatormodelmappings.cpp b/src/blacksim/simulatormodelmappings.cpp index 69541022f..356f2f4d0 100644 --- a/src/blacksim/simulatormodelmappings.cpp +++ b/src/blacksim/simulatormodelmappings.cpp @@ -20,9 +20,14 @@ namespace BlackSim return this->m_mappings; } - BlackMisc::Network::CAircraftMappingList ISimulatorModelMappings::findByIcao(const BlackMisc::Aviation::CAircraftIcao &icao, bool emptyMeansWildCard) const + BlackMisc::Network::CAircraftMappingList ISimulatorModelMappings::findByIcaoWildcard(const BlackMisc::Aviation::CAircraftIcao &icao) const { - return this->m_mappings.findByIcaoCode(icao, emptyMeansWildCard); + return this->m_mappings.findByIcaoCodeWildcard(icao); + } + + BlackMisc::Network::CAircraftMappingList ISimulatorModelMappings::findByIcaoExact(const BlackMisc::Aviation::CAircraftIcao &icao) const + { + return this->m_mappings.findByIcaoCodeExact(icao); } } // namespace diff --git a/src/blacksim/simulatormodelmappings.h b/src/blacksim/simulatormodelmappings.h index fe7f913ae..b352454d2 100644 --- a/src/blacksim/simulatormodelmappings.h +++ b/src/blacksim/simulatormodelmappings.h @@ -37,8 +37,11 @@ namespace BlackSim //! Get list const BlackMisc::Network::CAircraftMappingList &getMappingList() const; - //! Find by ICAO code - BlackMisc::Network::CAircraftMappingList findByIcao(const BlackMisc::Aviation::CAircraftIcao &icao, bool emptyMeansWildCard = true) const; + //! Find by ICAO code, empty fields are treated as wildcards + BlackMisc::Network::CAircraftMappingList findByIcaoWildcard(const BlackMisc::Aviation::CAircraftIcao &icao) const; + + //! Find by ICAO code, empty fields are treated literally + BlackMisc::Network::CAircraftMappingList findByIcaoExact(const BlackMisc::Aviation::CAircraftIcao &icao) const; protected: BlackMisc::Network::CAircraftMappingList m_mappings; //!< Mappings