From 61d3f342bd71342f4dffca4cd476b3b910be24b8 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Mon, 28 Aug 2017 17:13:20 +0200 Subject: [PATCH] adapt gui to use abstraction --- agui2/ALIB.pro | 7 +-- agui2/converter.cpp | 70 +++++++++++++++++++------- agui2/converter.h | 19 +++---- agui2/graphics/dialogs/inputdialog.cpp | 34 ++++++++----- agui2/graphics/dialogs/inputdialog.h | 10 ++-- agui2/graphics/graphicsbox.cpp | 8 +-- agui2/graphics/graphicsconnection.h | 1 + agui2/graphics/inputgraphicsbox.cpp | 8 +-- agui2/mainwindow.cpp | 5 +- agui2/mainwindow.h | 7 ++- agui2/models/doublemodelbox.cpp | 24 +++++---- agui2/models/doublemodelbox.h | 8 ++- agui2/models/inputmodelbox.cpp | 16 ++---- agui2/models/inputmodelbox.h | 8 +-- agui2/models/modelbox.h | 9 ++-- agui2/models/outputmodelbox.cpp | 47 ++++++++--------- agui2/models/outputmodelbox.h | 24 ++++----- agui2/models/singlemodelbox.cpp | 15 ++++-- agui2/models/singlemodelbox.h | 8 ++- agui2/wrapperfactory.cpp | 61 ++++++++-------------- 20 files changed, 203 insertions(+), 186 deletions(-) diff --git a/agui2/ALIB.pro b/agui2/ALIB.pro index 69806aaf5a..a6d9b5845e 100644 --- a/agui2/ALIB.pro +++ b/agui2/ALIB.pro @@ -125,12 +125,7 @@ else:unix: LIBS += -L$$PWD/$${ALIB_PATH}/bin-debug/ -lalib2algo INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2std/src/ INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2common/src/ -INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2data/src/ -INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2str/src/ -INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2raw/src/ -INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2aux/src/ -INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2algo/src/ -INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2elgo/src/ +INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2cli/src/ INCLUDEPATH += /usr/include/libxml2 unix:!macx: LIBS += -L/usr/lib/ -lgvc -lcgraph -lcdt diff --git a/agui2/converter.cpp b/agui2/converter.cpp index 5ac671f487..a5266c8380 100644 --- a/agui2/converter.cpp +++ b/agui2/converter.cpp @@ -1,34 +1,60 @@ #include "converter.h" #include "graphvizintegrator.h" +#include <abstraction/common/AlgorithmHelper.h> +#include <abstraction/ValueProvider.hpp> +#include <factory/XmlDataFactory.hpp> +#include <abstraction/ImmediateValueAbstraction.hpp> #include <QDomComment> -#include <factory/XmlDataFactory.hpp> -#include <factory/StringDataFactory.hpp> -QString Converter::automatonToDOT(const automaton::Automaton &automaton) +QString Converter::automatonToDOT(const std::shared_ptr < abstraction::OperationAbstraction > &automaton) { std::stringbuf sb; std::ostream os(&sb); - convert::DotConverter::convert( os , automaton ); - return QString::fromStdString(sb.str()); + ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params; + params.push_back ( automaton ); + + std::vector < bool > moves; + moves.push_back ( true ); + + std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::AlgorithmHelper::eval ( "convert::DotConverter", params, moves ); + + abstraction::ValueProvider < std::string > & value = dynamic_cast < abstraction::ValueProvider < std::string > & > ( * res ); + + return QString::fromStdString(value.getValue(true)); } -QString Converter::automatonToTXT(const automaton::Automaton &automaton) +QString Converter::automatonToTXT(const std::shared_ptr < abstraction::OperationAbstraction > &automaton) { QString text; try { - text = QString::fromStdString(alib::StringDataFactory::toString( automaton ) ); + ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params; + params.push_back ( automaton ); + + std::vector < bool > moves; + moves.push_back ( true ); + + std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::AlgorithmHelper::eval ( "automaton::AutomatonToStringComposer", params, moves ); + + abstraction::ValueProvider < std::string > & value = dynamic_cast < abstraction::ValueProvider < std::string > & > ( * res ); + + return QString::fromStdString(value.getValue(true)); } catch (exception::CommonException e ) { text = QString::fromStdString( e.getCause() ); } return text.trimmed(); } -QString Converter::automatonToXML(const automaton::Automaton &automaton) +QString Converter::automatonToXML(const std::shared_ptr < abstraction::OperationAbstraction > &automaton) { QString text; try { - text = QString::fromStdString(alib::XmlDataFactory::toString( automaton ) ); + std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getXmlComposerAbstraction ( automaton->getReturnType ( ) ); + res->attachInput ( automaton, 0, true ); + res->eval ( ); + abstraction::ValueProvider < std::string > & value = dynamic_cast < abstraction::ValueProvider < std::string > & > ( * res ); + + text = QString::fromStdString(value.getValue(true)); text = indentXML( text ); } catch (exception::CommonException e ) { text = QString::fromStdString( e.getCause() ); @@ -36,12 +62,12 @@ QString Converter::automatonToXML(const automaton::Automaton &automaton) return text; } -QImage Converter::automatonToPNG(const automaton::Automaton &automaton) +QImage Converter::automatonToPNG(const std::shared_ptr < abstraction::OperationAbstraction > &automaton) { return GraphvizIntegrator::getInstance().createImage( automatonToDOT(automaton), GraphvizIntegrator::PNG ); } -QImage Converter::automatonToSVG(const automaton::Automaton &automaton) +QImage Converter::automatonToSVG(const std::shared_ptr < abstraction::OperationAbstraction > &automaton) { return GraphvizIntegrator::getInstance().createImage( automatonToDOT(automaton), GraphvizIntegrator::SVG ); } @@ -54,16 +80,26 @@ QString Converter::indentXML(const QString &text) return text; } -automaton::Automaton *Converter::XMLToAutomaton(const QString &xml) +std::shared_ptr < abstraction::OperationAbstraction > Converter::XMLToAutomaton(const QString &xml) { - automaton::Automaton automaton = alib::XmlDataFactory::fromString( xml.toStdString() ); - return new automaton::Automaton( automaton ); + ext::deque < sax::Token > tokens; + sax::SaxParseInterface::parseMemory ( xml.toStdString(), tokens ); + std::string type = tokens [ 0 ].getData ( ); + std::shared_ptr < abstraction::OperationAbstraction > automaton = abstraction::Registry::getXmlParserAbstraction ( type, tokens ); + return automaton; } -automaton::Automaton *Converter::TXTToAutomaton(const QString &txt) +std::shared_ptr < abstraction::OperationAbstraction > Converter::TXTToAutomaton(const QString &txt) { - automaton::Automaton automaton = alib::StringDataFactory::fromString( txt.toStdString() ); - return new automaton::Automaton( automaton ); + ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params; + params.push_back ( std::make_shared < abstraction::ImmediateValueAbstraction < std::string > > ( txt.toStdString() ) ); + + std::vector < bool > moves; + moves.push_back ( true ); + + std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::AlgorithmHelper::eval ( "automaton::AutomatonFromStringParser", params, moves ); + + return res; } Converter::Converter() diff --git a/agui2/converter.h b/agui2/converter.h index eec50ee012..9e1cd02fbd 100644 --- a/agui2/converter.h +++ b/agui2/converter.h @@ -1,24 +1,21 @@ #ifndef CONVERTOR_H #define CONVERTOR_H -#include <automaton/Automaton.h> -#include <automaton/FSM/NFA.h> -#include <automaton/determinize/Determinize.h> -#include <convert/DotConverter.h> +#include <abstraction/OperationAbstraction.hpp> #include <QString> #include <QImage> class Converter { public: - static QString automatonToDOT(const automaton::Automaton & automaton ); - static QString automatonToTXT(const automaton::Automaton & automaton ); - static QString automatonToXML(const automaton::Automaton & automaton ); - static QImage automatonToPNG(const automaton::Automaton & automaton ); - static QImage automatonToSVG(const automaton::Automaton & automaton ); + static QString automatonToDOT(const std::shared_ptr < abstraction::OperationAbstraction > & automaton ); + static QString automatonToTXT(const std::shared_ptr < abstraction::OperationAbstraction > & automaton ); + static QString automatonToXML(const std::shared_ptr < abstraction::OperationAbstraction > & automaton ); + static QImage automatonToPNG(const std::shared_ptr < abstraction::OperationAbstraction > & automaton ); + static QImage automatonToSVG(const std::shared_ptr < abstraction::OperationAbstraction > & automaton ); static QString indentXML(const QString & text ); - static automaton::Automaton * XMLToAutomaton( const QString & xml ); - static automaton::Automaton * TXTToAutomaton( const QString & txt ); + static std::shared_ptr < abstraction::OperationAbstraction > XMLToAutomaton( const QString & xml ); + static std::shared_ptr < abstraction::OperationAbstraction > TXTToAutomaton( const QString & txt ); private: Converter(); }; diff --git a/agui2/graphics/dialogs/inputdialog.cpp b/agui2/graphics/dialogs/inputdialog.cpp index fb96c88820..0a9044c60b 100644 --- a/agui2/graphics/dialogs/inputdialog.cpp +++ b/agui2/graphics/dialogs/inputdialog.cpp @@ -2,10 +2,9 @@ #include "inputdialog.h" #include "ui_inputdialog.h" #include "graphvizintegrator.h" +#include <abstraction/common/AlgorithmHelper.h> +#include <abstraction/ImmediateValueAbstraction.hpp> -#include <factory/XmlDataFactory.hpp> -#include <automaton/generate/RandomAutomatonFactory.h> -#include <convert/DotConverter.h> #include <gvc.h> #include <QImage> #include <QFileDialog> @@ -21,16 +20,16 @@ InputDialog::InputDialog(QWidget *parent) : setWindowTitle("Input settings"); } -automaton::Automaton *InputDialog::getAutomaton() +std::shared_ptr < abstraction::OperationAbstraction > InputDialog::getAutomaton() { return m_automaton; } -void InputDialog::setAutomaton(const automaton::Automaton *automaton) +void InputDialog::setAutomaton(const std::shared_ptr < abstraction::OperationAbstraction > automaton) { if( automaton != NULL ) { - ui->plainTextEdit_5->document()->setPlainText( Converter::automatonToXML( *automaton ) ); + ui->plainTextEdit_5->document()->setPlainText( Converter::automatonToXML( automaton ) ); } else m_automaton = NULL; @@ -61,15 +60,24 @@ void InputDialog::setSettings(const InputSettings &settings) InputDialog::~InputDialog() { - if( m_automaton ) - delete m_automaton; delete ui; } void InputDialog::on_pushButton_clicked() { - automaton::NFA < > res = automaton::generate::RandomAutomatonFactory::generateNFA ( 5, 3, false, 10.0 ); - automaton::Automaton automaton( res ); + ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params; + params.push_back ( std::make_shared < abstraction::ImmediateValueAbstraction < size_t > > ( 5 ) ); + params.push_back ( std::make_shared < abstraction::ImmediateValueAbstraction < size_t > > ( 3 ) ); + params.push_back ( std::make_shared < abstraction::ImmediateValueAbstraction < bool > > ( 5 ) ); + params.push_back ( std::make_shared < abstraction::ImmediateValueAbstraction < double > > ( 10 ) ); + + std::vector < bool > moves; + moves.push_back ( true ); + moves.push_back ( true ); + moves.push_back ( true ); + moves.push_back ( true ); + + std::shared_ptr < abstraction::OperationAbstraction > automaton = abstraction::AlgorithmHelper::eval ( "automaton::generate::RandomAutomatonFactory", params, moves ); ui->plainTextEdit_5->document()->setPlainText( Converter::automatonToXML( automaton ) ); ui->XMLRadioBtn->click(); } @@ -87,7 +95,7 @@ void InputDialog::on_buttonBox_6_rejected() void InputDialog::on_plainTextEdit_5_textChanged() { - automaton::Automaton * automaton; + std::shared_ptr < abstraction::OperationAbstraction > automaton; m_settings.m_inputString = ui->plainTextEdit_5->document()->toPlainText(); automaton = convertTextField( m_settings.m_format ); if( !automaton ) @@ -95,11 +103,11 @@ void InputDialog::on_plainTextEdit_5_textChanged() ui->label_5->setText("<span style=\" font-size:16pt; font-weight:600; color:#ff0000;\">Input is not a valid automaton!</span>"); return; } - QPixmap pixmap = QPixmap::fromImage( Converter::automatonToSVG(*automaton) ); + QPixmap pixmap = QPixmap::fromImage( Converter::automatonToSVG( automaton) ); ui->label_5->setPixmap( pixmap ); } -automaton::Automaton *InputDialog::convertTextField( InputSettings::format formatSettings ) +std::shared_ptr < abstraction::OperationAbstraction > InputDialog::convertTextField( InputSettings::format formatSettings ) { try { diff --git a/agui2/graphics/dialogs/inputdialog.h b/agui2/graphics/dialogs/inputdialog.h index 3469a37440..33e6aab7e2 100644 --- a/agui2/graphics/dialogs/inputdialog.h +++ b/agui2/graphics/dialogs/inputdialog.h @@ -2,9 +2,9 @@ #define INPUTDIALOG_H #include "models/inputmodelbox.h" +#include <abstraction/OperationAbstraction.hpp> #include <QDialog> -#include <automaton/Automaton.h> namespace Ui { class InputDialog; @@ -16,8 +16,8 @@ class InputDialog : public QDialog public: explicit InputDialog(QWidget *parent = 0); - automaton::Automaton *getAutomaton(); - void setAutomaton(const automaton::Automaton *automaton); + std::shared_ptr < abstraction::OperationAbstraction > getAutomaton(); + void setAutomaton(const std::shared_ptr < abstraction::OperationAbstraction > automaton); InputSettings getSettings(); void setSettings(const InputSettings & settings); ~InputDialog(); @@ -35,10 +35,10 @@ private slots: void on_PathLineEdit_textChanged(const QString &arg1); private: - automaton::Automaton *convertTextField(InputSettings::format formatSettings); + std::shared_ptr < abstraction::OperationAbstraction > convertTextField(InputSettings::format formatSettings); Ui::InputDialog *ui; - automaton::Automaton *m_automaton = NULL; + std::shared_ptr < abstraction::OperationAbstraction > m_automaton = NULL; InputSettings m_settings; }; diff --git a/agui2/graphics/graphicsbox.cpp b/agui2/graphics/graphicsbox.cpp index b423b7e1c1..dacaa1228a 100644 --- a/agui2/graphics/graphicsbox.cpp +++ b/agui2/graphics/graphicsbox.cpp @@ -1,13 +1,13 @@ -#include <QGraphicsSceneContextMenuEvent> -#include <QDialog> -#include <QGraphicsScene> - #include "graphicsbox.h" #include "graphicsconnection.h" #include "graphicsscene.h" #include "connectionhelper.h" #include "dialogs/inputdialog.h" +#include <QGraphicsSceneContextMenuEvent> +#include <QDialog> +#include <QGraphicsScene> + GraphicsBox::GraphicsBox(QString text, qreal x, qreal y) : QGraphicsObject( NULL ) { diff --git a/agui2/graphics/graphicsconnection.h b/agui2/graphics/graphicsconnection.h index c5fc914eb6..441fa996e5 100644 --- a/agui2/graphics/graphicsconnection.h +++ b/agui2/graphics/graphicsconnection.h @@ -1,6 +1,7 @@ #ifndef GRAPHICSCONNECTION_H #define GRAPHICSCONNECTION_H +#include <tuple> #include "graphicsbox.h" #include <QGraphicsItem> diff --git a/agui2/graphics/inputgraphicsbox.cpp b/agui2/graphics/inputgraphicsbox.cpp index aa48301979..525fa0da3d 100644 --- a/agui2/graphics/inputgraphicsbox.cpp +++ b/agui2/graphics/inputgraphicsbox.cpp @@ -1,12 +1,12 @@ -#include <QMenu> -#include <QAction> -#include <QObject> - #include "inputgraphicsbox.h" #include "connectionhelper.h" #include "dialogs/inputdialog.h" #include "models/inputmodelbox.h" +#include <QMenu> +#include <QAction> +#include <QObject> + class InputModelBox; class ModelBox; diff --git a/agui2/mainwindow.cpp b/agui2/mainwindow.cpp index 02c38e8c33..d0eb4bd2fb 100644 --- a/agui2/mainwindow.cpp +++ b/agui2/mainwindow.cpp @@ -1,5 +1,3 @@ -#include <QFileDialog> -#include <QGraphicsItem> #include <iostream> #include "mainwindow.h" @@ -10,6 +8,9 @@ #include "wrapperfactory.h" #include "connectionhelper.h" +#include <QFileDialog> +#include <QGraphicsItem> + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) diff --git a/agui2/mainwindow.h b/agui2/mainwindow.h index 1b2afb91cb..fb86cfd066 100644 --- a/agui2/mainwindow.h +++ b/agui2/mainwindow.h @@ -1,15 +1,14 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H +#include "wrapperbox.h" +#include "graphics/graphicsscene.h" + #include <QMainWindow> -#include <automaton/Automaton.h> #include <QGraphicsView> #include <QGraphicsScene> #include <QGraphicsItem> -#include "wrapperbox.h" -#include "graphics/graphicsscene.h" - namespace Ui { class MainWindow; } diff --git a/agui2/models/doublemodelbox.cpp b/agui2/models/doublemodelbox.cpp index afcece373d..192d832af1 100644 --- a/agui2/models/doublemodelbox.cpp +++ b/agui2/models/doublemodelbox.cpp @@ -1,7 +1,7 @@ #include "doublemodelbox.h" +#include <abstraction/common/AlgorithmHelper.h> - -DoubleModelBox::DoubleModelBox(functwo func) +DoubleModelBox::DoubleModelBox(std::string func) { m_func = func; } @@ -44,11 +44,11 @@ bool DoubleModelBox::isInputAvailable() return (m_InConnectionOne == NULL || m_InConnectionTwo == NULL ); } -automaton::Automaton *DoubleModelBox::run() +std::shared_ptr < abstraction::OperationAbstraction > DoubleModelBox::run() { - automaton::Automaton * inOne = NULL; - automaton::Automaton * inTwo = NULL; - automaton::Automaton * res = NULL; + std::shared_ptr < abstraction::OperationAbstraction > inOne = NULL; + std::shared_ptr < abstraction::OperationAbstraction > inTwo = NULL; + std::shared_ptr < abstraction::OperationAbstraction > res = NULL; if( m_InConnectionOne && m_InConnectionTwo ) { inOne = m_InConnectionOne->run(); @@ -58,7 +58,15 @@ automaton::Automaton *DoubleModelBox::run() { try { - res = new automaton::Automaton( m_func( *inOne, *inTwo ) ); + ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params; + params.push_back ( inOne ); + params.push_back ( inTwo ); + + std::vector < bool > moves; + moves.push_back ( true ); + moves.push_back ( true ); + + res = abstraction::AlgorithmHelper::eval ( m_func, params, moves ); } catch (exception::CommonException e) { @@ -66,8 +74,6 @@ automaton::Automaton *DoubleModelBox::run() AlibExceptionHandler::getInstance().setMessage( mes ); res = NULL; } - delete inOne; - delete inTwo; } return res; } diff --git a/agui2/models/doublemodelbox.h b/agui2/models/doublemodelbox.h index 273fa21e3a..e4a519c0aa 100644 --- a/agui2/models/doublemodelbox.h +++ b/agui2/models/doublemodelbox.h @@ -3,12 +3,10 @@ #include "modelbox.h" -typedef automaton::Automaton(*functwo)(const automaton::Automaton&, const automaton::Automaton&); - class DoubleModelBox : public ModelBox { public: - DoubleModelBox(functwo func); + DoubleModelBox(std::string func); // Inherited virtual bool addInput( ModelBox * origin ); virtual bool addOutput( ModelBox * target ); @@ -18,12 +16,12 @@ public: virtual bool isOutputAvailable() { return m_OutConnection == NULL; } virtual bool acceptInput() { return true; } virtual bool isOutputSet() { return m_OutConnection != NULL; } - virtual automaton::Automaton * run(); + virtual std::shared_ptr < abstraction::OperationAbstraction > run(); private: ModelBox * m_OutConnection = NULL; ModelBox * m_InConnectionOne = NULL; ModelBox * m_InConnectionTwo = NULL; - functwo m_func; + std::string m_func; }; #endif // DOUBLEMODELBOX_H diff --git a/agui2/models/inputmodelbox.cpp b/agui2/models/inputmodelbox.cpp index f5d2898237..ceba4c7ac2 100644 --- a/agui2/models/inputmodelbox.cpp +++ b/agui2/models/inputmodelbox.cpp @@ -7,17 +7,12 @@ InputModelBox::InputModelBox() m_settings.m_inputString = ""; } -void InputModelBox::setAutomaton(automaton::Automaton *automaton) +void InputModelBox::setAutomaton(std::shared_ptr < abstraction::OperationAbstraction > automaton) { - if( m_automaton ) - delete m_automaton; - if( automaton ) - m_automaton = new automaton::Automaton( *automaton ); - else - m_automaton = NULL; + m_automaton = automaton; } -const automaton::Automaton *InputModelBox::getAutomaton() +const std::shared_ptr < abstraction::OperationAbstraction > InputModelBox::getAutomaton() { return m_automaton; } @@ -31,10 +26,9 @@ bool InputModelBox::addOutput(ModelBox *target) return true; } -automaton::Automaton *InputModelBox::run() +std::shared_ptr < abstraction::OperationAbstraction > InputModelBox::run() { - automaton::Automaton * res = m_automaton ? new automaton::Automaton( *m_automaton ) : NULL; - return res; + return m_automaton; } void InputModelBox::setSettings(const InputSettings &settings) diff --git a/agui2/models/inputmodelbox.h b/agui2/models/inputmodelbox.h index 89ad3b7714..0626e822f9 100644 --- a/agui2/models/inputmodelbox.h +++ b/agui2/models/inputmodelbox.h @@ -18,8 +18,8 @@ class InputModelBox : public ModelBox { public: InputModelBox(); - void setAutomaton( automaton::Automaton *automaton ); - const automaton::Automaton *getAutomaton(); + void setAutomaton( std::shared_ptr < abstraction::OperationAbstraction > automaton ); + const std::shared_ptr < abstraction::OperationAbstraction > getAutomaton(); // Inherited virtual ~InputModelBox() {} @@ -31,13 +31,13 @@ public: virtual bool isOutputAvailable() { return m_OutConnection == NULL; } virtual bool acceptInput() { return false; } virtual bool isOutputSet() { return m_OutConnection != NULL; } - virtual automaton::Automaton * run(); + virtual std::shared_ptr < abstraction::OperationAbstraction > run(); bool isInputEmpty() { return m_automaton == NULL; } void setSettings( const InputSettings & settings ); InputSettings getSettings(); private: ModelBox * m_OutConnection = NULL; - automaton::Automaton *m_automaton = NULL; + std::shared_ptr < abstraction::OperationAbstraction > m_automaton = NULL; InputSettings m_settings; }; diff --git a/agui2/models/modelbox.h b/agui2/models/modelbox.h index b5617bd231..c4d4f34ea1 100644 --- a/agui2/models/modelbox.h +++ b/agui2/models/modelbox.h @@ -2,10 +2,13 @@ #define MODELBOX_H #include "wrapperbox.h" -#include "alibexceptionhandler.h" -#include <automaton/Automaton.h> +#include <abstraction/OperationAbstraction.hpp> #include <exception/CommonException.h> + +#include <memory> + +#include "alibexceptionhandler.h" #include <QString> #include <QList> @@ -23,7 +26,7 @@ public: virtual bool isOutputAvailable() = 0; virtual bool acceptInput() = 0; virtual bool isOutputSet() = 0; - virtual automaton::Automaton * run() = 0; + virtual std::shared_ptr < abstraction::OperationAbstraction > run() = 0; friend class WrapperBox; protected: WrapperBox* m_wrapper; diff --git a/agui2/models/outputmodelbox.cpp b/agui2/models/outputmodelbox.cpp index a526be2e67..aeae0a23c1 100644 --- a/agui2/models/outputmodelbox.cpp +++ b/agui2/models/outputmodelbox.cpp @@ -1,7 +1,3 @@ -#include <automaton/Automaton.h> -#include <automaton/FSM/NFA.h> -#include <automaton/determinize/Determinize.h> - #include "outputmodelbox.h" #include "graphics/dialogs/resultdialog.h" #include "mainwindow.h" @@ -21,9 +17,9 @@ OutputModelBox::OutputModelBox() m_Settings.m_filename = ""; } -automaton::Automaton *OutputModelBox::run() +std::shared_ptr < abstraction::OperationAbstraction > OutputModelBox::run() { - automaton::Automaton * res = NULL; + std::shared_ptr < abstraction::OperationAbstraction > res = NULL; AlibExceptionHandler::getInstance().reset(); if( m_InConnection ) @@ -48,7 +44,6 @@ automaton::Automaton *OutputModelBox::run() else displayError( "Missing an input" ); } - delete res; return NULL; } @@ -67,7 +62,7 @@ void OutputModelBox::displayError(const QString &text) QMessageBox::warning( m_wrapper->getGraphics()->scene()->views().first(), "Output fail", text, QMessageBox::Ok ); } -void OutputModelBox::displayResult(automaton::Automaton *automaton) +void OutputModelBox::displayResult(std::shared_ptr < abstraction::OperationAbstraction > automaton) { switch (m_Settings.m_format) { @@ -88,32 +83,32 @@ void OutputModelBox::displayResult(automaton::Automaton *automaton) } } -void OutputModelBox::displayXML( automaton::Automaton * automaton ) +void OutputModelBox::displayXML( std::shared_ptr < abstraction::OperationAbstraction > automaton ) { ResultDialog * resultDlg = new ResultDialog(); - resultDlg->setTextContent( Converter::automatonToXML(*automaton) ); + resultDlg->setTextContent( Converter::automatonToXML( automaton) ); resultDlg->exec(); } -void OutputModelBox::displayTXT(automaton::Automaton *automaton) +void OutputModelBox::displayTXT(std::shared_ptr < abstraction::OperationAbstraction > automaton) { - QString text( Converter::automatonToTXT(*automaton) ); + QString text( Converter::automatonToTXT( automaton) ); ResultDialog * resultDlg = new ResultDialog(); resultDlg->setTextContent( text ); resultDlg->exec(); } -void OutputModelBox::displayPNG(automaton::Automaton *automaton) +void OutputModelBox::displayPNG(std::shared_ptr < abstraction::OperationAbstraction > automaton) { displayImage( automaton, GraphvizIntegrator::PNG ); } -void OutputModelBox::displaySVG(automaton::Automaton *automaton) +void OutputModelBox::displaySVG(std::shared_ptr < abstraction::OperationAbstraction > automaton) { displayImage( automaton, GraphvizIntegrator::SVG ); } -void OutputModelBox::displayImage(automaton::Automaton *automaton, GraphvizIntegrator::PictureFormat format) +void OutputModelBox::displayImage(std::shared_ptr < abstraction::OperationAbstraction > automaton, GraphvizIntegrator::PictureFormat format) { ResultDialog * resultDlg = new ResultDialog(); QImage img; @@ -122,10 +117,10 @@ void OutputModelBox::displayImage(automaton::Automaton *automaton, GraphvizInteg switch (format) { case GraphvizIntegrator::PNG: - img = Converter::automatonToPNG(*automaton); + img = Converter::automatonToPNG(automaton); break; case GraphvizIntegrator::SVG: - img = Converter::automatonToSVG(*automaton); + img = Converter::automatonToSVG(automaton); break; default: break; @@ -141,7 +136,7 @@ void OutputModelBox::displayImage(automaton::Automaton *automaton, GraphvizInteg resultDlg->exec(); } -void OutputModelBox::saveResultToFile(automaton::Automaton *automaton) +void OutputModelBox::saveResultToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton) { switch (m_Settings.m_format) { @@ -162,32 +157,32 @@ void OutputModelBox::saveResultToFile(automaton::Automaton *automaton) } } -void OutputModelBox::saveXMLToFile(automaton::Automaton *automaton) +void OutputModelBox::saveXMLToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton) { QFile file(m_Settings.m_filename); file.open(QFile::ReadWrite | QFile::Text); QTextStream s1(&file); - s1 << Converter::automatonToXML(*automaton) << endl; + s1 << Converter::automatonToXML(automaton) << endl; file.close(); } -void OutputModelBox::saveTXTToFile(automaton::Automaton *automaton) +void OutputModelBox::saveTXTToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton) { QFile file(m_Settings.m_filename); file.open(QFile::ReadWrite | QFile::Text); QTextStream s1(&file); - s1 << Converter::automatonToTXT(*automaton); + s1 << Converter::automatonToTXT(automaton); file.close(); } -void OutputModelBox::savePNGToFile(automaton::Automaton *automaton) +void OutputModelBox::savePNGToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton) { - GraphvizIntegrator::getInstance().createImageFile(Converter::automatonToDOT(*automaton), m_Settings.m_filename, GraphvizIntegrator::PNG); + GraphvizIntegrator::getInstance().createImageFile(Converter::automatonToDOT(automaton), m_Settings.m_filename, GraphvizIntegrator::PNG); } -void OutputModelBox::saveSVGToFile(automaton::Automaton *automaton) +void OutputModelBox::saveSVGToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton) { - GraphvizIntegrator::getInstance().createImageFile(Converter::automatonToDOT(*automaton), m_Settings.m_filename, GraphvizIntegrator::SVG); + GraphvizIntegrator::getInstance().createImageFile(Converter::automatonToDOT(automaton), m_Settings.m_filename, GraphvizIntegrator::SVG); } bool OutputModelBox::addInput(ModelBox *origin) diff --git a/agui2/models/outputmodelbox.h b/agui2/models/outputmodelbox.h index 0e924e7ab1..b50085f25d 100644 --- a/agui2/models/outputmodelbox.h +++ b/agui2/models/outputmodelbox.h @@ -34,22 +34,22 @@ public: virtual bool isOutputAvailable() { return false; } virtual bool acceptInput() { return true; } virtual bool isOutputSet() { return false; } - virtual automaton::Automaton * run(); + virtual std::shared_ptr < abstraction::OperationAbstraction > run(); void setSettings(const OutputSettings &settings ); OutputSettings getSettings(); private: void displayError(const QString & text); - void displayResult(automaton::Automaton *automaton); - void displayXML(automaton::Automaton *automaton); - void displayTXT(automaton::Automaton *automaton); - void displayPNG(automaton::Automaton *automaton); - void displaySVG(automaton::Automaton *automaton); - void displayImage(automaton::Automaton *automaton, GraphvizIntegrator::PictureFormat format); - void saveResultToFile(automaton::Automaton *automaton); - void saveXMLToFile(automaton::Automaton *automaton); - void saveTXTToFile(automaton::Automaton *automaton); - void savePNGToFile(automaton::Automaton *automaton); - void saveSVGToFile(automaton::Automaton *automaton); + void displayResult(std::shared_ptr < abstraction::OperationAbstraction > automaton); + void displayXML(std::shared_ptr < abstraction::OperationAbstraction > automaton); + void displayTXT(std::shared_ptr < abstraction::OperationAbstraction > automaton); + void displayPNG(std::shared_ptr < abstraction::OperationAbstraction > automaton); + void displaySVG(std::shared_ptr < abstraction::OperationAbstraction > automaton); + void displayImage(std::shared_ptr < abstraction::OperationAbstraction > automaton, GraphvizIntegrator::PictureFormat format); + void saveResultToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton); + void saveXMLToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton); + void saveTXTToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton); + void savePNGToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton); + void saveSVGToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton); ModelBox * m_InConnection = NULL; OutputSettings m_Settings; diff --git a/agui2/models/singlemodelbox.cpp b/agui2/models/singlemodelbox.cpp index bb9714a0b3..22099ac17f 100644 --- a/agui2/models/singlemodelbox.cpp +++ b/agui2/models/singlemodelbox.cpp @@ -1,6 +1,7 @@ #include "singlemodelbox.h" +#include <abstraction/common/AlgorithmHelper.h> -SingleModelBox::SingleModelBox( func func ) +SingleModelBox::SingleModelBox( std::string func ) { m_func = func; } @@ -23,15 +24,21 @@ bool SingleModelBox::addOutput(ModelBox *target) return true; } -automaton::Automaton *SingleModelBox::run() +std::shared_ptr < abstraction::OperationAbstraction > SingleModelBox::run() { - automaton::Automaton * res = NULL; + std::shared_ptr < abstraction::OperationAbstraction > res = NULL; if( m_InConnection ) res = m_InConnection->run(); if( res ) { try{ - res->setData( m_func( *res ).getData() ); + ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params; + params.push_back ( res ); + + std::vector < bool > moves; + moves.push_back ( true ); + + res = abstraction::AlgorithmHelper::eval ( m_func, params, moves ); } catch (exception::CommonException e) { QString mes = QString::fromStdString( e.getCause() ); AlibExceptionHandler::getInstance().setMessage( mes ); diff --git a/agui2/models/singlemodelbox.h b/agui2/models/singlemodelbox.h index 2e3ce6fa72..57304cd33d 100644 --- a/agui2/models/singlemodelbox.h +++ b/agui2/models/singlemodelbox.h @@ -3,12 +3,10 @@ #include "modelbox.h" -typedef automaton::Automaton(*func)(const automaton::Automaton&); - class SingleModelBox : public ModelBox { public: - SingleModelBox(func func); + SingleModelBox(std::string); // Inherited virtual ~SingleModelBox() {} virtual bool addInput( ModelBox * origin ); @@ -19,11 +17,11 @@ public: virtual bool isOutputAvailable() { return m_OutConnection == NULL; } virtual bool acceptInput() { return true; } virtual bool isOutputSet() { return m_OutConnection != NULL; } - virtual automaton::Automaton* run(); + virtual std::shared_ptr < abstraction::OperationAbstraction > run(); private: ModelBox * m_InConnection = NULL; ModelBox * m_OutConnection = NULL; - func m_func; + std::string m_func; }; #endif // SINGLEMODELBOX_H diff --git a/agui2/wrapperfactory.cpp b/agui2/wrapperfactory.cpp index 8d9c9072c0..f1591ba33e 100644 --- a/agui2/wrapperfactory.cpp +++ b/agui2/wrapperfactory.cpp @@ -1,24 +1,3 @@ -#include <automaton/determinize/Determinize.h> -#include <automaton/simplify/Total.h> -#include <automaton/simplify/SingleInitialState.h> -#include <automaton/simplify/EpsilonRemoverIncoming.h> -#include <automaton/simplify/EpsilonRemoverOutgoing.h> -#include <automaton/simplify/Minimize.h> -#include <automaton/simplify/Normalize.h> -#include <automaton/simplify/Rename.h> -#include <automaton/simplify/Trim.h> -#include <automaton/simplify/UselessStatesRemover.h> -#include <automaton/simplify/UnreachableStatesRemover.h> -#include <automaton/transform/Compaction.h> -#include <automaton/transform/Reverse.h> -#include <automaton/transform/AutomatonIteration.h> -#include <automaton/transform/AutomatonIterationEpsilonTransition.h> -#include <automaton/transform/AutomataConcatenation.h> -#include <automaton/transform/AutomataConcatenationEpsilonTransition.h> -#include <automaton/transform/AutomataUnionCartesianProduct.h> -#include <automaton/transform/AutomataUnionEpsilonTransition.h> -#include <automaton/transform/AutomataIntersectionCartesianProduct.h> - #include "wrapperfactory.h" #include "graphics/inputgraphicsbox.h" #include "graphics/outputgraphicsbox.h" @@ -45,49 +24,49 @@ WrapperBox *WrapperFactory::create(WrapperFactory::Algorithms algorithm, qreal x // Single simplify case DETERMINIZE: - return new WrapperBox( new SingleModelBox( &automaton::determinize::Determinize::determinize ), new GraphicsBox( "Determinize", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::determinize::Determinize" ), new GraphicsBox( "Determinize", x, y ) ); case TOTAL: - return new WrapperBox( new SingleModelBox( &automaton::simplify::Total::total ), new GraphicsBox( "Total", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::simplify::Total" ), new GraphicsBox( "Total", x, y ) ); case MINIMIZE: - return new WrapperBox( new SingleModelBox( &automaton::simplify::Minimize::minimize ), new GraphicsBox( "Minimize", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::simplify::Minimize" ), new GraphicsBox( "Minimize", x, y ) ); case NORMALIZE: - return new WrapperBox( new SingleModelBox( &automaton::simplify::Normalize::normalize ), new GraphicsBox( "Normalize", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::simplify::Normalize" ), new GraphicsBox( "Normalize", x, y ) ); case SINGLE_INITIAL: - return new WrapperBox( new SingleModelBox( &automaton::simplify::SingleInitialState::convert ), new GraphicsBox( "Single Initial", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::simplify::SingleInitialState" ), new GraphicsBox( "Single Initial", x, y ) ); case EPSILON_REMOVE_IN: - return new WrapperBox( new SingleModelBox( &automaton::simplify::EpsilonRemoverIncoming::remove ), new GraphicsBox( str.append( "-Remove In" ), x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::simplify::EpsilonRemoverIncoming" ), new GraphicsBox( str.append( "-Remove In" ), x, y ) ); case EPSILON_REMOVE_OUT: - return new WrapperBox( new SingleModelBox( &automaton::simplify::EpsilonRemoverOutgoing::remove ), new GraphicsBox( str.append( "-Remove Out" ), x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::simplify::EpsilonRemoverOutgoing" ), new GraphicsBox( str.append( "-Remove Out" ), x, y ) ); case RENAME: - return new WrapperBox( new SingleModelBox( &automaton::simplify::Rename::rename ), new GraphicsBox( "Rename", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::simplify::Rename" ), new GraphicsBox( "Rename", x, y ) ); case TRIM: - return new WrapperBox( new SingleModelBox( &automaton::simplify::Trim::trim ), new GraphicsBox( "Trim", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::simplify::Trim" ), new GraphicsBox( "Trim", x, y ) ); case REMOVE_USELES: - return new WrapperBox( new SingleModelBox( &automaton::simplify::UselessStatesRemover::remove ), new GraphicsBox( "Remove Useless", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::simplify::UselessStatesRemover" ), new GraphicsBox( "Remove Useless", x, y ) ); case REMOVE_UNREACHABLE: - return new WrapperBox( new SingleModelBox( &automaton::simplify::UnreachableStatesRemover::remove ), new GraphicsBox( "Remove Unreachable", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::simplify::UnreachableStatesRemover" ), new GraphicsBox( "Remove Unreachable", x, y ) ); // Single transform case COMPACT: - return new WrapperBox( new SingleModelBox( &automaton::transform::Compaction::convert ), new GraphicsBox( "Compact", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::transform::Compaction" ), new GraphicsBox( "Compact", x, y ) ); case REVERSE: - return new WrapperBox( new SingleModelBox( &automaton::transform::Reverse::convert ), new GraphicsBox( "Reverse", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::transform::Reverse" ), new GraphicsBox( "Reverse", x, y ) ); case ITERATE: - return new WrapperBox( new SingleModelBox( &automaton::transform::AutomatonIteration::iteration ), new GraphicsBox( "Iterate", x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::transform::AutomatonIteration" ), new GraphicsBox( "Iterate", x, y ) ); case ITERATE_EPSILON: - return new WrapperBox( new SingleModelBox( &automaton::transform::AutomatonIterationEpsilonTransition::iteration ), new GraphicsBox( str.append( "-Iterate" ), x, y ) ); + return new WrapperBox( new SingleModelBox( "automaton::transform::AutomatonIterationEpsilonTransition" ), new GraphicsBox( str.append( "-Iterate" ), x, y ) ); //Double case CONCATENATE: - return new WrapperBox( new DoubleModelBox( &automaton::transform::AutomataConcatenation::concatenation ), new DoubleGraphicsBox( "Concatenate", x, y ) ); + return new WrapperBox( new DoubleModelBox( "automaton::transform::AutomataConcatenation" ), new DoubleGraphicsBox( "Concatenate", x, y ) ); case CONCATENATE_EPSILON: - return new WrapperBox( new DoubleModelBox( &automaton::transform::AutomataConcatenationEpsilonTransition::concatenation ), new DoubleGraphicsBox( str.append( "-Concatenate" ), x, y ) ); + return new WrapperBox( new DoubleModelBox( "automaton::transform::AutomataConcatenationEpsilonTransition" ), new DoubleGraphicsBox( str.append( "-Concatenate" ), x, y ) ); case UNION: - return new WrapperBox( new DoubleModelBox( &automaton::transform::AutomataUnionCartesianProduct::unification ), new DoubleGraphicsBox( "Union", x, y ) ); + return new WrapperBox( new DoubleModelBox( "automaton::transform::AutomataUnionCartesianProduct" ), new DoubleGraphicsBox( "Union", x, y ) ); case UNION_EPSILON: - return new WrapperBox( new DoubleModelBox( &automaton::transform::AutomataUnionEpsilonTransition::unification ), new DoubleGraphicsBox( str.append( "-Union" ), x, y ) ); + return new WrapperBox( new DoubleModelBox( "automaton::transform::AutomataUnionEpsilonTransition" ), new DoubleGraphicsBox( str.append( "-Union" ), x, y ) ); case INTERSCT: - return new WrapperBox( new DoubleModelBox( &automaton::transform::AutomataIntersectionCartesianProduct::intersection ), new DoubleGraphicsBox( "Intersect", x, y ) ); + return new WrapperBox( new DoubleModelBox( "automaton::transform::AutomataIntersectionCartesianProduct" ), new DoubleGraphicsBox( "Intersect", x, y ) ); default: return NULL; } -- GitLab