Advertisement
Guest User

mappedReduced Example

a guest
Apr 14th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <QApplication>
  2. #include <QList>
  3. #include <Map>
  4. #include <QGridLayout>
  5. #include <QStandardItemModel>
  6. #include <QLineEdit>
  7. #include <QPushButton>
  8. #include <QListView>
  9. #include <QFutureWatcher>
  10. #include <QtConcurrent>
  11. #include <functional>
  12.  
  13. struct Result
  14. {
  15.   QString text;
  16.   QString site;
  17. };
  18.  
  19. class ISearchable
  20. {
  21. public:
  22.     virtual QList<Result> search(const QString &query) = 0;
  23. };
  24.  
  25. class SiteA : public ISearchable
  26. {
  27. public:
  28.     QList<Result> search(const QString &query) Q_DECL_OVERRIDE
  29.     {
  30.         QList<Result> results;
  31.         QThread::sleep(1);
  32.         Result example;
  33.         example.text = "This is an example of search from SiteA";
  34.         example.site = "sitea";
  35.  
  36.         results << example;
  37.         return results;
  38.     }
  39. };
  40.  
  41. class SiteB : public ISearchable
  42. {
  43. public:
  44.     QList<Result> search(const QString &query) Q_DECL_OVERRIDE
  45.     {
  46.         QList<Result> results;
  47.         QThread::sleep(1);
  48.         Result example;
  49.         example.text = "This is an example of search from SiteB";
  50.         example.site = "siteb";
  51.         results << example;
  52.         return results;
  53.     }
  54. };
  55. QList<Result> runSearch(const QString &query, ISearchable* site){return site->search(query);}
  56. int main(int argc, char *argv[])
  57. {
  58.     QApplication application(argc, argv);
  59.  
  60.     QMap<QString, ISearchable *> container;
  61.  
  62.     container.insert("sitea", new SiteA);
  63.     container.insert("siteb", new SiteB);
  64.     QWidget mainWid;
  65.     QGridLayout* mainLay= new QGridLayout(&mainWid);
  66.     QStandardItemModel* baseModel = new QStandardItemModel(&mainWid);
  67.     baseModel->insertColumn(0);
  68.     QListView* resultList =new QListView(&mainWid);
  69.     QLineEdit* queryEdit= new QLineEdit(&mainWid);
  70.     QPushButton* searchBtn = new QPushButton(QStringLiteral("Search"),&mainWid);
  71.     resultList->setModel(baseModel);
  72.     mainLay->addWidget(queryEdit,0,0);
  73.     mainLay->addWidget(searchBtn ,0,1);
  74.     mainLay->addWidget(resultList ,1,0,1,2);
  75.     using FutureTemplateArg = QList<Result>;
  76.     QObject::connect(searchBtn ,&QPushButton::clicked,&mainWid,[baseModel,searchBtn ,queryEdit,&container]()->void{
  77.         baseModel->removeRows(0,baseModel->rowCount());
  78.         searchBtn->setEnabled(false);
  79.         queryEdit->setEnabled(false);
  80.         auto futWatch = new QFutureWatcher<FutureTemplateArg>(baseModel);
  81.         QObject::connect(futWatch,&QFutureWatcher<FutureTemplateArg>::finished,searchBtn,[searchBtn ,queryEdit](){
  82.             searchBtn->setEnabled(true);
  83.             queryEdit->setEnabled(true);
  84.         });
  85.         QObject::connect(futWatch,&QFutureWatcher<FutureTemplateArg>::finished,baseModel,[futWatch,baseModel](){
  86.             const FutureTemplateArg singleRes = futWatch->result();
  87.             const int resSize = singleRes.size();
  88.             if(resSize==0)
  89.                 return;
  90.             const int startRow = baseModel->rowCount();
  91.             baseModel->insertRows(startRow,resSize);
  92.             for(int i=0;i<resSize;++i )
  93.                 baseModel->setData(baseModel->index(i+startRow,0),singleRes.at(i).site + " - " + singleRes.at(i).text);
  94.         });
  95.         QObject::connect(futWatch,&QFutureWatcher<FutureTemplateArg>::finished,futWatch,&QObject::deleteLater);
  96.         QFuture<FutureTemplateArg> calcResult = QtConcurrent::mappedReduced<FutureTemplateArg>(
  97.             container
  98.             , std::bind(runSearch,queryEdit->text(),std::placeholders::_1)
  99.             , [](FutureTemplateArg& collection,const FutureTemplateArg& newRes){collection<<newRes;}
  100.         );
  101.         futWatch->setFuture(calcResult);
  102.     });
  103.     mainWid.show();
  104.     return application.exec();
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement