From 64f037d5844cfa536b242f545623870573b3465d Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 15 Dec 2014 17:27:41 +0100 Subject: [PATCH] refs #358, adjusted samples for model matching --- samples/blackmiscdbus/main.cpp | 2 + .../blackmiscdbus/sample_blackmisc_dbus.pro | 6 +- samples/blackmiscdbus/servicetool.cpp | 73 +++++++++++++------ samples/blackmiscdbus/servicetool.h | 25 ++++++- samples/blackmiscdbus/testservice.cpp | 18 +++-- samples/blackmiscdbus/testservice.h | 8 +- samples/blackmiscdbus/testservice_interface.h | 8 ++ samples/blacksim/main.cpp | 3 +- samples/blacksim/samplesfscommon.cpp | 73 ++++++++++--------- samples/blacksim/samplesmodelmapping.cpp | 42 +++++++++-- samples/blacksim/samplesmodelmapping.h | 2 +- src/blackmisc/sampleutils.cpp | 45 ++++++++++++ src/blackmisc/sampleutils.h | 33 +++++++++ 13 files changed, 259 insertions(+), 79 deletions(-) create mode 100644 src/blackmisc/sampleutils.cpp create mode 100644 src/blackmisc/sampleutils.h diff --git a/samples/blackmiscdbus/main.cpp b/samples/blackmiscdbus/main.cpp index e494f9789..865a6b705 100644 --- a/samples/blackmiscdbus/main.cpp +++ b/samples/blackmiscdbus/main.cpp @@ -8,6 +8,7 @@ */ #include "blackmisc/blackmiscfreefunctions.h" +#include "blacksim/blacksimfreefunctions.h" #include "servicetool.h" #include "blackcore/dbus_server.h" #include @@ -26,6 +27,7 @@ int main(int argc, char *argv[]) // is just for testing, I did not split it up BlackMisc::registerMetadata(); + BlackSim::registerMetadata(); QCoreApplication a(argc, argv); // trying to get the arguments into a list diff --git a/samples/blackmiscdbus/sample_blackmisc_dbus.pro b/samples/blackmiscdbus/sample_blackmisc_dbus.pro index 08f704d1e..595b68241 100644 --- a/samples/blackmiscdbus/sample_blackmisc_dbus.pro +++ b/samples/blackmiscdbus/sample_blackmisc_dbus.pro @@ -8,14 +8,16 @@ TEMPLATE = app CONFIG += console CONFIG -= app_bundle -CONFIG += blackmisc blackcore +CONFIG += blackmisc blackcore blacksim -DEPENDPATH += . ../../src/blackmisc ../../src/blackcore +DEPENDPATH += . ../../src/blackmisc ../../src/blackcore ../../src/blacksim INCLUDEPATH += . ../../src win32:!win32-g++*: PRE_TARGETDEPS += ../../lib/blackmisc.lib \ + ../../lib/blacksim.lib \ ../../lib/blackcore.lib else: PRE_TARGETDEPS += ../../lib/libblackmisc.a \ + ../../lib/libblacksim.a \ ../../lib/libblackcore.a DESTDIR = ../../bin diff --git a/samples/blackmiscdbus/servicetool.cpp b/samples/blackmiscdbus/servicetool.cpp index 7a6a87e7a..30e43601e 100644 --- a/samples/blackmiscdbus/servicetool.cpp +++ b/samples/blackmiscdbus/servicetool.cpp @@ -24,6 +24,7 @@ using namespace BlackMisc::Aviation; using namespace BlackMisc::Math; using namespace BlackMisc::Geo; using namespace BlackMisc::Network; +using namespace BlackSim::FsCommon; using namespace BlackMiscTest; namespace BlackMiscTest @@ -125,7 +126,7 @@ namespace BlackMiscTest /* * Stations */ - CAtcStationList ServiceTool::getStations(qint32 number) + CAtcStationList ServiceTool::getStations(int number) { QElapsedTimer timer; timer.start(); @@ -146,10 +147,35 @@ namespace BlackMiscTest return list; } + /* + * Aircraft cfg entries + */ + CAircraftCfgEntriesList ServiceTool::getAircraftCfgEntries(int number) + { + QElapsedTimer timer; + timer.start(); + + CAircraftCfgEntriesList list; + for (int i = 0; i < number; i++) + { + CAircraftCfgEntries e; + e.setAtcModel("atc model"); + e.setAtcParkingCode(QString::number(i)); + e.setIndex(i); + e.setFileName("this will be the file path and pretty long"); + e.setTitle("i am the aircraft title foobar"); + e.setAtcType("B737"); + list.push_back(e); + } + + qDebug() << number << "aircraft entries in" << timer.nsecsElapsed() / 1000000; // ms + return list; + } + /* * Airports */ - CAirportList ServiceTool::getAirports(qint32 number) + CAirportList ServiceTool::getAirports(int number) { BlackMisc::Aviation::CAirportList list; for (int i = 0; i < number; i++) @@ -163,7 +189,7 @@ namespace BlackMiscTest return list; } - CClientList ServiceTool::getClients(qint32 number) + CClientList ServiceTool::getClients(int number) { BlackMisc::Network::CClientList list; for (int i = 0; i < number; i++) @@ -176,7 +202,7 @@ namespace BlackMiscTest client.setCapability(true, CClient::FsdWithInterimPositions); client.setCapability(true, CClient::FsdWithModelDescription); QString myFooModel = QString("fooModel %1").arg(i); - client.setAircraftModel(CAircraftModel(myFooModel, "nope")); + client.setAircraftModel(CAircraftModel(myFooModel, CAircraftModel::TypeQueriedFromNetwork)); list.push_back(client); } return list; @@ -246,10 +272,7 @@ namespace BlackMiscTest // We send this as a non-replying message. This is used for sending errors, replys, signals, // and method calls (slots) that don't return - if (connection.send(m)) - { - qDebug() << "Send via low level method" << m; - } + if (connection.send(m)) { qDebug() << "Send via low level method" << m; } // same as interface message // but call the slot @@ -334,14 +357,14 @@ namespace BlackMiscTest qDebug() << "Send geo position" << geoPos; qDebug() << "----------------- pings ----------------"; - CPropertyIndex pi({ 1, 2, 3, 4, 5}); + CPropertyIndex pi({ 1000, 2000, 3000, 4000, 5000}); // numbers >= global index pi = testserviceInterface.pingPropertyIndex(pi); - qDebug() << "Pinged properties via interface" << pi; + qDebug() << "Pinged property index via interface" << pi; CPropertyIndexVariantMap ivm; - ivm.addValue(1, "one"); - ivm.addValue(2, "two"); - ivm.addValue(3, "three"); + ivm.addValue(1000, "one"); + ivm.addValue(2000, "two"); + ivm.addValue(3000, "three"); ivm = testserviceInterface.pingIndexVariantMap(ivm); qDebug() << "Pinged variant map via interface" << ivm; @@ -400,14 +423,14 @@ namespace BlackMiscTest qDebug() << "----------------- index variant map ----------------"; CPropertyIndexVariantMap valueMap; - valueMap.addValue(1, 111.222); - valueMap.addValue(2, callsign); - valueMap.addValue(3, alt); - valueMap.addValue(4, track); - valueMap.addValue(5, QDateTime::currentDateTime().addDays(1)); - valueMap.addValue(6, QString("foobar")); + valueMap.addValue(1000, 111.222); + valueMap.addValue(2000, callsign); + valueMap.addValue(3000, alt); + valueMap.addValue(4000, track); + valueMap.addValue(5000, QDateTime::currentDateTime().addDays(1)); + valueMap.addValue(6000, QString("foobar")); testserviceInterface.receiveValueMap(valueMap); - qDebug() << "Send value map" << valueMap; + qDebug() << "Send index variant map" << valueMap; // Performance tools QThread::msleep(2500); @@ -477,10 +500,16 @@ namespace BlackMiscTest atcStationList = testserviceInterface.getAtcStationList(1000); if (atcStationList.size() != 1000) qDebug() << "wrong list size" << atcStationList.size(); t1000 = timer.nsecsElapsed() / 1000000; // ms - qDebug() << "Reading station list 10/100/1000 in ms:" << t10 << t100 << t1000; - timer.invalidate(); + // test reading model entries with a realistic size + timer.restart(); + CAircraftCfgEntriesList entriesList = testserviceInterface.getAircraftCfgEntriesList(5000); + if (entriesList.size() != 5000) qDebug() << "wrong list size" << entriesList.size(); + int t5000 = timer.nsecsElapsed() / 1000000; // ms + qDebug() << "Reading aircraft cfg entries in ms:" << t5000; + + // object paths timer.restart(); QList objectPaths = testserviceInterface.getObjectPaths(10); if (objectPaths.size() != 10) qDebug() << "wrong list size" << objectPaths.size(); diff --git a/samples/blackmiscdbus/servicetool.h b/samples/blackmiscdbus/servicetool.h index 561a34113..267d1acb6 100644 --- a/samples/blackmiscdbus/servicetool.h +++ b/samples/blackmiscdbus/servicetool.h @@ -1,3 +1,14 @@ +/* Copyright (C) 2013 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of Swift Project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + #ifndef BLACKMISCTEST_SERVICETOOL_H #define BLACKMISCTEST_SERVICETOOL_H @@ -5,6 +16,7 @@ #include "blackmisc/avatcstationlist.h" #include "blackmisc/avairportlist.h" #include "blackmisc/nwclientlist.h" +#include "blacksim/fscommon/aircraftcfgentrieslist.h" #include #include #include @@ -82,21 +94,28 @@ namespace BlackMiscTest * \param number * \return */ - static BlackMisc::Aviation::CAtcStationList getStations(qint32 number); + static BlackMisc::Aviation::CAtcStationList getStations(int number); + + /*! + * \brief Get aircraft cfg entries + * \param number + * \return + */ + static BlackSim::FsCommon::CAircraftCfgEntriesList getAircraftCfgEntries(int number); /*! * \brief Get airports * \param number * \return */ - static BlackMisc::Aviation::CAirportList getAirports(qint32 number); + static BlackMisc::Aviation::CAirportList getAirports(int number); /*! * \brief Get clients * \param number * \return */ - static BlackMisc::Network::CClientList getClients(qint32 number); + static BlackMisc::Network::CClientList getClients(int number); }; diff --git a/samples/blackmiscdbus/testservice.cpp b/samples/blackmiscdbus/testservice.cpp index b3b99c6fb..5d851c27a 100644 --- a/samples/blackmiscdbus/testservice.cpp +++ b/samples/blackmiscdbus/testservice.cpp @@ -15,6 +15,7 @@ using namespace BlackMisc::Aviation; using namespace BlackMisc::Geo; using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Network; +using namespace BlackSim::FsCommon; namespace BlackMiscTest { @@ -209,7 +210,7 @@ namespace BlackMiscTest /* * Object paths */ - const QList Testservice::getObjectPaths(const qint32 number) const + QList Testservice::getObjectPaths(int number) const { QList paths; for (int i = 0; i < number; i++) @@ -220,11 +221,19 @@ namespace BlackMiscTest } /* - * Ping ATC station list + * Get ATC station list */ - const BlackMisc::Aviation::CAtcStationList Testservice::getAtcStationList(const qint32 number) const + CAtcStationList Testservice::getAtcStationList(int number) const { - return BlackMisc::Aviation::CAtcStationList(ServiceTool::getStations(number)); + return CAtcStationList(ServiceTool::getStations(number)); + } + + /* + * Get aircraft entries + */ + CAircraftCfgEntriesList Testservice::getAircraftCfgEntriesList(int number) const + { + return CAircraftCfgEntriesList(ServiceTool::getAircraftCfgEntries(number)); } /* @@ -327,5 +336,4 @@ namespace BlackMiscTest return BlackMisc::CVariant::fromValue(client); } - } // namespace diff --git a/samples/blackmiscdbus/testservice.h b/samples/blackmiscdbus/testservice.h index 5c7125458..e40b718c1 100644 --- a/samples/blackmiscdbus/testservice.h +++ b/samples/blackmiscdbus/testservice.h @@ -20,6 +20,7 @@ #include "blackmisc/networkallclasses.h" #include "blackmisc/pqallquantities.h" #include "blackmisc/mathallclasses.h" +#include "blacksim/fscommon/aircraftcfgentrieslist.h" #include "servicetool.h" #include #include @@ -147,10 +148,13 @@ namespace BlackMiscTest BlackMisc::Aviation::CAtcStation getAtcStation() const; //! return n ATC stations - const BlackMisc::Aviation::CAtcStationList getAtcStationList(const qint32 number) const; + BlackMisc::Aviation::CAtcStationList getAtcStationList(int number) const; + + //! return n aircraft cfg entries + BlackSim::FsCommon::CAircraftCfgEntriesList getAircraftCfgEntriesList(int number) const; //! Get object paths - const QList getObjectPaths(const qint32 number) const; + QList getObjectPaths(int number) const; public: static const QString ServiceName; diff --git a/samples/blackmiscdbus/testservice_interface.h b/samples/blackmiscdbus/testservice_interface.h index f55e864a6..46bf27480 100644 --- a/samples/blackmiscdbus/testservice_interface.h +++ b/samples/blackmiscdbus/testservice_interface.h @@ -14,6 +14,7 @@ #include "blackmisc/blackmiscfreefunctions.h" #include "blackmisc/blackmiscallvalueclasses.h" +#include "blacksim/fscommon/aircraftcfgentrieslist.h" #include #include #include @@ -53,6 +54,13 @@ namespace BlackMiscTest return asyncCallWithArgumentList(QLatin1String("getAtcStation"), argumentList); } + inline QDBusPendingReply getAircraftCfgEntriesList(int number) + { + QList argumentList; + argumentList << QVariant::fromValue(number); + return asyncCallWithArgumentList(QLatin1String("getAircraftCfgEntriesList"), argumentList); + } + inline QDBusPendingReply getAtcStationList(int number) { QList argumentList; diff --git a/samples/blacksim/main.cpp b/samples/blacksim/main.cpp index a0dbe5810..c8c7d88f4 100644 --- a/samples/blacksim/main.cpp +++ b/samples/blacksim/main.cpp @@ -50,13 +50,14 @@ int main(int argc, char *argv[]) } else if (i.startsWith("3")) { - BlackSimTest::CSamplesModelMapping::samples(streamOut); + BlackSimTest::CSamplesModelMapping::samples(streamOut, streamIn); } else if (i.startsWith("x")) { return 0; } + streamOut << endl; streamOut << "time elapsed: " << t.elapsed() << "ms" << endl; streamOut << "press key to exit" << endl; streamIn.readLine(); diff --git a/samples/blacksim/samplesfscommon.cpp b/samples/blacksim/samplesfscommon.cpp index c4be423b1..c74cc8172 100644 --- a/samples/blacksim/samplesfscommon.cpp +++ b/samples/blacksim/samplesfscommon.cpp @@ -8,8 +8,9 @@ */ #include "samplesfscommon.h" +#include "blackmisc/sampleutils.h" #include "blacksim/fscommon/aircraftcfgentrieslist.h" -#include "blacksim/fscommon/aircraftindexer.h" +#include "blacksim/fscommon/aircraftmapper.h" #include #include @@ -17,6 +18,7 @@ #include #include +using namespace BlackMisc; using namespace BlackSim::FsCommon; namespace BlackSimTest @@ -27,51 +29,50 @@ namespace BlackSimTest */ int CSamplesFsCommon::samples(QTextStream &streamOut, QTextStream &streamIn) { - // QString fsxDir = "P:/FlightSimulatorX (MSI)/SimObjects"; - QString fsxDir = "P:/Temp/SimObjects"; - streamOut << "Enter FSX directory:" << endl; - streamOut << fsxDir << '\r'; - streamOut.flush(); - QString input = streamIn.readLine(); - if (!input.isEmpty()) fsxDir = input; + QString fsxDir = CSampleUtils::selectDirectory({"P:/FlightSimulatorX (MSI)/SimObjects", "P:/Temp/SimObjects"}, streamOut, streamIn); + CAircraftMapper mapper; + if (!mapper.changeCAircraftCfgEntriesDirectory(fsxDir)) + { + streamOut << "Wrong or empty directoy " << fsxDir << endl; + return 0; + } + streamOut << "d .. direct, b .. background" << endl; - input = streamIn.readLine(); + QString input = streamIn.readLine(); + if (!input.startsWith("b")) { streamOut << "reading directly" << endl; - CAircraftCfgEntriesList entriesList(fsxDir); - if (entriesList.existsDir()) - { - QTime time; - time.start(); - streamOut << "reading " << entriesList.getRootDirectory() << endl; - entriesList.read(); - streamOut << "read entries: " << entriesList.size() << " in " << time.restart() << "ms" << endl; + QTime time; + time.start(); + streamOut << "reading " << mapper.getAircraftCfgEntriesList().getRootDirectory() << endl; + mapper.readSimObjects(); + streamOut << "read entries: " << mapper.getAircraftCfgEntriesList().size() << " in " << time.restart() << "ms" << endl; - QJsonDocument doc(entriesList.toJson()); - QByteArray jsonArray(doc.toJson()); - streamOut << "write JSON array with size " << jsonArray.size() << endl; - QTemporaryFile tempFile; - tempFile.open(); - tempFile.write(jsonArray); - tempFile.close(); - streamOut << "written to " << tempFile.fileName() << " in " << time.restart() << "ms" << endl; + CAircraftCfgEntriesList entriesList = mapper.getAircraftCfgEntriesList(); + QJsonDocument doc(entriesList.toJson()); + QByteArray jsonArray(doc.toJson()); + streamOut << "write JSON array with size " << jsonArray.size() << endl; + QTemporaryFile tempFile; + tempFile.open(); + tempFile.write(jsonArray); + tempFile.close(); + streamOut << "written to " << tempFile.fileName() << " in " << time.restart() << "ms" << endl; - // re-read - tempFile.open(); - jsonArray = tempFile.readAll(); - doc = QJsonDocument::fromJson(jsonArray); - entriesList.clear(); - entriesList.convertFromJson(doc.object()); - streamOut << "read JSON array with size " << jsonArray.size() << endl; - streamOut << "read entries from disk: " << entriesList.size() << " in " << time.restart() << "ms" << endl; - tempFile.close(); - } + // re-read + tempFile.open(); + jsonArray = tempFile.readAll(); + doc = QJsonDocument::fromJson(jsonArray); + entriesList.clear(); + entriesList.convertFromJson(doc.object()); + streamOut << "read JSON array with size " << jsonArray.size() << endl; + streamOut << "read entries from disk: " << entriesList.size() << " in " << time.restart() << "ms" << endl; + tempFile.close(); } else { streamOut << "reading in background" << endl; - QFuture f = BlackSim::FsCommon::CAircraftIndexer::readInBackground(fsxDir); + QFuture f = mapper.readInBackground(); int i = 0; do { diff --git a/samples/blacksim/samplesmodelmapping.cpp b/samples/blacksim/samplesmodelmapping.cpp index a6c5e1a88..a1088d91e 100644 --- a/samples/blacksim/samplesmodelmapping.cpp +++ b/samples/blacksim/samplesmodelmapping.cpp @@ -9,12 +9,19 @@ #include "samplesmodelmapping.h" #include "blackmisc/blackmiscfreefunctions.h" +#include "blackmisc/sampleutils.h" #include "blacksim/blacksimfreefunctions.h" #include "blacksim/fscommon/vpilotmodelmappings.h" +#include "blacksim/fscommon/aircraftmapper.h" #include +#include +#include +using namespace BlackMisc; +using namespace BlackSim; using namespace BlackSim::FsCommon; +using namespace BlackMisc::Aviation; namespace BlackSimTest { @@ -22,18 +29,39 @@ namespace BlackSimTest /* * Samples */ - int CSamplesModelMapping::samples(QTextStream &streamOut) + int CSamplesModelMapping::samples(QTextStream &streamOut, QTextStream &streamIn) { BlackMisc::registerMetadata(); BlackSim::registerMetadata(); - CVPilotModelMappings cvm; - cvm.addDirectory(CVPilotModelMappings::standardMappingsDirectory()); - bool s = cvm.load(); - streamOut << "loaded:" << s << "size:" << cvm.size() << endl; + std::unique_ptr cvm(new CVPilotModelMappings(true)); + bool s = cvm->read(); + streamOut << "directory: " << CVPilotModelMappings::standardMappingsDirectory() << endl; + streamOut << "loaded: " << (s ? "yes" : "no") << " size: " << cvm->size() << endl; - BlackMisc::Aviation::CAircraftIcao icao("C172"); - streamOut << cvm.findByIcaoWildcard(icao) << endl; + // mapper with rule set, handing over ownership + CAircraftMapper mapper(std::move(cvm)); + QString fsxDir = CSampleUtils::selectDirectory({"P:/FlightSimulatorX (MSI)/SimObjects", "P:/Temp/SimObjects"}, streamOut, streamIn); + if (!mapper.changeCAircraftCfgEntriesDirectory(fsxDir)) + { + streamOut << "Wrong or empty directoy " << fsxDir << endl; + return 0; + } + + streamOut << "Start reading models" << endl; + mapper.changeCAircraftCfgEntriesDirectory(fsxDir); + mapper.readSimObjects(); + streamOut << "Read models: " << mapper.countAircraftCfgEntries() << endl; + streamOut << "Ambigious models: " << mapper.getAircraftCfgEntriesList().detectAmbiguousTitles().join(", ") << endl; + + // sync definitions, remove redundant ones + streamOut << "Now synchronizing defintions: " << mapper.countMappingRules() << endl; + int afterSync = mapper.synchronize(); + streamOut << "After synchronizing definitions: " << afterSync << endl; + + CAircraftIcao icao("C172"); + streamOut << "Searching for " << icao << endl; + streamOut << mapper.getAircraftMappingList().findByIcaoCodeExact(icao) << endl; return 0; } diff --git a/samples/blacksim/samplesmodelmapping.h b/samples/blacksim/samplesmodelmapping.h index f7d0784fd..6d3f8e1fb 100644 --- a/samples/blacksim/samplesmodelmapping.h +++ b/samples/blacksim/samplesmodelmapping.h @@ -21,7 +21,7 @@ namespace BlackSimTest { public: //! Run the samples - static int samples(QTextStream &streamOut); + static int samples(QTextStream &streamOut, QTextStream &streamIn); }; } // namespace diff --git a/src/blackmisc/sampleutils.cpp b/src/blackmisc/sampleutils.cpp new file mode 100644 index 000000000..484d39232 --- /dev/null +++ b/src/blackmisc/sampleutils.cpp @@ -0,0 +1,45 @@ +/* Copyright (C) 2013 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "sampleutils.h" + +namespace BlackMisc +{ + + QString CSampleUtils::selectDirectory(const QStringList &directoryOptions, QTextStream &streamOut, QTextStream &streamIn) + { + Q_ASSERT(!directoryOptions.isEmpty()); + if (directoryOptions.isEmpty()) { return ""; } + if (directoryOptions.size() < 2) { return directoryOptions.first(); } + + QString selectedDir; + do + { + for (int i = 0; i < directoryOptions.size(); i++) + { + if (i > 0) { streamOut << " "; } + streamOut << (i + 1) << ") " << directoryOptions.at(i) ; + } + streamOut << endl; + streamOut << "Select [1-" << directoryOptions.size() << "]: "; + streamOut.flush(); + + QString input = streamIn.readLine(); + bool ok; + int s = input.trimmed().toInt(&ok); + if (ok && s > 0 && s <= directoryOptions.size()) + { + selectedDir = directoryOptions.at(s - 1); + break; + } + } + while (true); + return selectedDir; + } +} diff --git a/src/blackmisc/sampleutils.h b/src/blackmisc/sampleutils.h new file mode 100644 index 000000000..7504b7cc7 --- /dev/null +++ b/src/blackmisc/sampleutils.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2013 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKMISC_SAMPLEUTILS_H +#define BLACKMISC_SAMPLEUTILS_H + +#include +#include + +namespace BlackMisc +{ + //! Utils for sample programms + class CSampleUtils + { + + public: + //! Select directory among given ones + static QString selectDirectory(const QStringList &directoryOptions, QTextStream &streamOut, QTextStream &streamIn); + + private: + CSampleUtils() = delete; + }; +} + +#endif // guard