|
@@ -1,22 +1,133 @@
|
|
|
#include "choosegenerators.h"
|
|
|
#include "ui_choosegenerators.h"
|
|
|
|
|
|
+#include "Hardware.h"
|
|
|
+
|
|
|
#include <QComboBox>
|
|
|
+#include <QRegExp>
|
|
|
+#include <QRegExpValidator>
|
|
|
|
|
|
-ChooseGenerators::ChooseGenerators(QWidget *parent) :
|
|
|
+ChooseGenerators::ChooseGenerators(mnd::MandelContext& mndCtxt, QWidget *parent) :
|
|
|
QDialog{ parent },
|
|
|
- ui{ std::make_unique<Ui::ChooseGenerators>() }
|
|
|
+ ui{ std::make_unique<Ui::ChooseGenerators>() },
|
|
|
+ mndCtxt{ mndCtxt },
|
|
|
+ tableContent{}
|
|
|
{
|
|
|
ui->setupUi(this);
|
|
|
|
|
|
- ui->table->insertRow(0);
|
|
|
- auto* cb = new QComboBox(ui->table);
|
|
|
- cb->addItem("a");
|
|
|
- cb->addItem("b");
|
|
|
- ui->table->setCellWidget(0, 1, cb);
|
|
|
+ QRegExp floatingpoint{ "^[-+]?(\\d*\\.?\\d+|\\d+\\.?\\d*)([eE][-+]\\d+)?$" };
|
|
|
+ floatValidator = std::make_unique<QRegExpValidator>(floatingpoint, this);
|
|
|
+
|
|
|
+ generators = std::map<QString, mnd::Generator*> {
|
|
|
+ { "float", mndCtxt.getCpuGenerator(mnd::GeneratorType::FLOAT) },
|
|
|
+ { "double", mndCtxt.getCpuGenerator(mnd::GeneratorType::DOUBLE) },
|
|
|
+ { "double double", mndCtxt.getCpuGenerator(mnd::GeneratorType::DOUBLE_DOUBLE) },
|
|
|
+ { "quad double", mndCtxt.getCpuGenerator(mnd::GeneratorType::QUAD_DOUBLE) },
|
|
|
+ { "float256", mndCtxt.getCpuGenerator(mnd::GeneratorType::FLOAT256) },
|
|
|
+ };
|
|
|
+
|
|
|
+ if (mndCtxt.getCpuInfo().hasSse2()) {
|
|
|
+ generators.insert({ "float SSE2", mndCtxt.getCpuGenerator(mnd::GeneratorType::FLOAT_SSE2) });
|
|
|
+ generators.insert({ "double SSE2", mndCtxt.getCpuGenerator(mnd::GeneratorType::DOUBLE_SSE2) });
|
|
|
+ }
|
|
|
+ if (mndCtxt.getCpuInfo().hasAvx()) {
|
|
|
+ generators.insert({ "float AVX", mndCtxt.getCpuGenerator(mnd::GeneratorType::FLOAT_AVX) });
|
|
|
+ generators.insert({ "double AVX", mndCtxt.getCpuGenerator(mnd::GeneratorType::DOUBLE_AVX) });
|
|
|
+ }
|
|
|
+ if (mndCtxt.getCpuInfo().hasNeon()) {
|
|
|
+ generators.insert({ "float Neon", mndCtxt.getCpuGenerator(mnd::GeneratorType::FLOAT_NEON) });
|
|
|
+ generators.insert({ "double Neon", mndCtxt.getCpuGenerator(mnd::GeneratorType::DOUBLE_NEON) });
|
|
|
+ }
|
|
|
+ for (auto& device : mndCtxt.getDevices()) {
|
|
|
+ if (mnd::Generator* gen; (gen = device.getGenerator(mnd::GeneratorType::FLOAT))) {
|
|
|
+ generators.insert({ QString("float ") + QString::fromStdString(device.getName()),
|
|
|
+ gen });
|
|
|
+ }
|
|
|
+ if (mnd::Generator* gen; (gen = device.getGenerator(mnd::GeneratorType::DOUBLE))) {
|
|
|
+ generators.insert({ QString("double ") + QString::fromStdString(device.getName()),
|
|
|
+ gen });
|
|
|
+ }
|
|
|
+ if (mnd::Generator* gen; (gen = device.getGenerator(mnd::GeneratorType::DOUBLE_DOUBLE))) {
|
|
|
+ generators.insert({ QString("double double ") + QString::fromStdString(device.getName()),
|
|
|
+ gen });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ auto& defGen = mndCtxt.getDefaultGenerator();
|
|
|
+ for (auto it = defGen.getGenerators().rbegin(); it != defGen.getGenerators().rend(); it++) {
|
|
|
+ auto& [prec, gen] = *it;
|
|
|
+ ui->table->insertRow(0);
|
|
|
+ QLineEdit* le = createFloatText();
|
|
|
+ QComboBox* comboBox = createComboBox();
|
|
|
+ le->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Preferred);
|
|
|
+ comboBox->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Preferred);
|
|
|
+ ui->table->setCellWidget(0, 0, le);
|
|
|
+ ui->table->setCellWidget(0, 1, comboBox);
|
|
|
+ tableContent.push_back({ le, comboBox });
|
|
|
+ for (auto [n, g] : generators) {
|
|
|
+ if (gen == g) {
|
|
|
+ comboBox->setCurrentText(n);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ le->setText(QString::number(static_cast<double>(prec)));
|
|
|
+ comboBox->adjustSize();
|
|
|
+ le->adjustSize();
|
|
|
+ }
|
|
|
+ ui->table->resizeColumnsToContents();
|
|
|
+
|
|
|
+
|
|
|
+ //ui->addRow->setIcon(ui->addRow->style()->standardIcon(QStyle::SP_));
|
|
|
+ //ui->moveRowUp->setIcon(ui->moveRowUp->style()->standardIcon(QStyle::SP_ArrowUp));
|
|
|
+ //ui->moveRowDown->setIcon(ui->moveRowDown->style()->standardIcon(QStyle::SP_ArrowDown));
|
|
|
}
|
|
|
|
|
|
|
|
|
ChooseGenerators::~ChooseGenerators()
|
|
|
{
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+QComboBox* ChooseGenerators::createComboBox(void)
|
|
|
+{
|
|
|
+ QComboBox* qcb = new QComboBox(ui->table);
|
|
|
+
|
|
|
+ for (auto [name, type] : generators) {
|
|
|
+ qcb->addItem(name);
|
|
|
+ }
|
|
|
+
|
|
|
+ return qcb;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+QLineEdit* ChooseGenerators::createFloatText(void)
|
|
|
+{
|
|
|
+ QLineEdit* le = new QLineEdit(ui->table);
|
|
|
+ le->setValidator(floatValidator.get());
|
|
|
+ return le;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void ChooseGenerators::on_buttonBox_accepted()
|
|
|
+{
|
|
|
+ if (!createdGenerator)
|
|
|
+ createdGenerator = std::make_unique<mnd::AdaptiveGenerator>();
|
|
|
+ createdGenerator->clear();
|
|
|
+ try {
|
|
|
+ for (size_t i = 0; i < tableContent.size(); i++) {
|
|
|
+ //std::cout << tableContent.at(i).first << std::endl;
|
|
|
+ //std::cout << tableContent.at(i).second << std::endl;
|
|
|
+ QString precString = tableContent.at(i).first->text();
|
|
|
+ QString genString = tableContent.at(i).second->currentText();
|
|
|
+
|
|
|
+ mnd::Real precision = mnd::Real(precString.toStdString().c_str());
|
|
|
+ mnd::Generator* generator = generators.at(genString);
|
|
|
+ if (generator)
|
|
|
+ createdGenerator->addGenerator(precision, *generator);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch(...) {
|
|
|
+ // TODO
|
|
|
+ createdGenerator = nullptr;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|