choosegenerators.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #ifndef CHOOSEGENERATORS_H
  2. #define CHOOSEGENERATORS_H
  3. #include "ui_choosegenerators.h"
  4. #include <Mandel.h>
  5. #include <IterationCompiler.h>
  6. #include "Bitmap.h"
  7. #include <QDialog>
  8. #include <QValidator>
  9. #include <QLineEdit>
  10. #include <QComboBox>
  11. #include <QRunnable>
  12. #include <QThread>
  13. #include <QThreadPool>
  14. #include <memory>
  15. #include <map>
  16. class Almond;
  17. namespace Ui
  18. {
  19. class ChooseGenerators;
  20. }
  21. class Benchmarker : public QObject, public QRunnable
  22. {
  23. Q_OBJECT
  24. private:
  25. mnd::MandelContext& mndContext;
  26. mnd::MandelGenerator& generator;
  27. int row;
  28. float percentage;
  29. static const std::vector<mnd::MandelInfo> benches;
  30. public:
  31. inline Benchmarker(mnd::MandelContext& mndContext, mnd::MandelGenerator& generator, int row, float percentage) :
  32. mndContext{ mndContext },
  33. generator{ generator },
  34. row{ row },
  35. percentage{ percentage }
  36. {
  37. }
  38. virtual ~Benchmarker(void) override;
  39. static mnd::MandelViewport benchViewport(void);
  40. std::pair<long long, std::chrono::nanoseconds> measureMips(const std::function<Bitmap<float>*()>& bench) const;
  41. double benchmarkResult(mnd::MandelGenerator& mg) const;
  42. void run(void) override;
  43. signals:
  44. void finished(int row, float percentage, double mips);
  45. };
  46. class ChooseGenerators : public QDialog
  47. {
  48. Q_OBJECT
  49. private:
  50. Almond& owner;
  51. Ui::ChooseGenerators* sadfgsdfg;
  52. std::unique_ptr<Ui::ChooseGenerators> ui;
  53. mnd::MandelContext& mndCtxt;
  54. std::map<QString, mnd::MandelGenerator*> generators;
  55. std::vector<std::pair<QLineEdit*, QComboBox*>> tableContent;
  56. std::unique_ptr<mnd::AdaptiveGenerator> chosenGenerator;
  57. std::vector<mnd::MandelGenerator*> actualGenerators;
  58. mnd::AdaptiveGenerator& generator;
  59. std::vector<mnd::MandelGenerator*> allGenerators;
  60. std::unique_ptr<QValidator> floatValidator;
  61. QThreadPool benchmarker;
  62. public:
  63. /*!
  64. * \brief create a dialog that lets choose from the default mandelbrot generators
  65. */
  66. ChooseGenerators(mnd::MandelContext& mndCtxt, mnd::AdaptiveGenerator& generator, Almond& owner);
  67. /*!
  68. * \brief create a dialog that lets choose from the default mandelbrot generators
  69. */
  70. ChooseGenerators(mnd::MandelContext& mndCtxt, mnd::GeneratorCollection& gc,
  71. mnd::AdaptiveGenerator& generator, Almond& owner);
  72. ~ChooseGenerators();
  73. inline std::unique_ptr<mnd::AdaptiveGenerator> extractChosenGenerator(void) { return std::move(chosenGenerator); }
  74. private:
  75. void initializeTables(void);
  76. QComboBox* createComboBox(void);
  77. QLineEdit* createFloatText(void);
  78. void addRowAt(int index);
  79. public slots:
  80. private slots:
  81. void setBenchmarkResult(int row, float percentage, double mips);
  82. void on_buttonBox_accepted();
  83. void on_run_clicked();
  84. void on_generatorTable_cellDoubleClicked(int row, int column);
  85. void on_addRow_clicked();
  86. void on_removeRow_clicked();
  87. };
  88. #endif // CHOOSEGENERATORS_H