Skip to content
Snippets Groups Projects
Commit 448efaa4 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

take out core of algorithm evaluation in cli

parent 0f220973
No related branches found
No related tags found
No related merge requests found
Pipeline #
/*
* AlgorithmHelper.cpp
*
* Created on: 25. 8. 2017
* Author: Jan Travnicek
*/
#include <abstraction/Registry.h>
#include <exception/CommonException.h>
#include <ast/common/AlgorithmHelper.h>
#include <ast/common/CastHelper.h>
namespace cli {
std::shared_ptr < abstraction::OperationAbstraction > AlgorithmHelper::eval ( const std::string & name, const ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > & params, std::vector < bool > & moves ) {
ext::vector < std::string > paramTypes;
for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : params )
paramTypes.push_back ( param->getReturnType ( ) );
bool downcast = false;
bool normalize = false;
std::shared_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getAlgorithmAbstraction ( name, paramTypes, downcast, normalize );
unsigned i = 0;
ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > casted_params;
for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : params ) {
if ( abstraction::Registry::isCastNoOp ( algo->getParamType ( i ), param->getReturnType ( ) ) ) {
casted_params.push_back ( param );
} else {
casted_params.push_back ( CastHelper::eval ( param, algo->getParamType ( i ), moves [ i ] ) );
moves [ i ] = true;
}
++ i;
}
i = 0;
for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : casted_params ) {
if ( ! algo->attachInput ( param, i, moves [ i ] ) )
throw exception::CommonException ( "Can't connect param at " + ext::to_string ( i ) + " of algorithm " + name + " with result of type " + param->getReturnType ( ) + "." );
++ i;
}
if ( ! algo->eval ( ) )
throw exception::CommonException ( "Eval of algorithm " + name + " failed." );
if ( downcast ) {
std::shared_ptr < abstraction::OperationAbstraction > downcaster = abstraction::Registry::getDowncastAbstraction ( algo->getRuntimeReturnType ( ), algo->getReturnType ( ) );
if ( ! downcaster->attachInput ( algo, 0, true ) )
throw exception::CommonException ( "Can't connect param at 0 of downcast of algorithm " + name + " with result of type " + algo->getReturnType ( ) + "." );
if ( ! downcaster->eval ( ) )
throw exception::CommonException ( "Eval of downcast of algorithm " + name + " failed." );
algo = downcaster;
}
if ( normalize ) {
std::shared_ptr < abstraction::OperationAbstraction > normalized = abstraction::Registry::getNormalizeAbstraction ( algo->getReturnType ( ) );
if ( ! normalized->attachInput ( algo, 0, true ) )
throw exception::CommonException ( "Can't connect param at 0 of normalize of algorithm " + name + " with result of type " + algo->getReturnType ( ) + "." );
if ( ! normalized->eval ( ) )
throw exception::CommonException ( "Eval of normalize of algorithm " + name + " failed." );
algo = normalized;
}
return algo;
}
} /* namespace cli */
/*
* AbstractionHelper.hpp
*
* Created on: 25. 8. 2017
* Author: Jan Travnicek
*/
#ifndef _ALGORITHM_HELPER_HPP_
#define _ALGORITHM_HELPER_HPP_
#include <string>
#include <memory>
#include <vector>
namespace cli {
class AlgorithmHelper {
public:
static std::shared_ptr < abstraction::OperationAbstraction > eval ( const std::string & algo, const ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > & params, std::vector < bool > & moves );
};
} /* namespace cli */
#endif /* _ALGORITHM_HELPER_HPP_ */
#include <abstraction/Registry.h>
#include <ast/common/CastHelper.h>
namespace cli {
std::shared_ptr < abstraction::OperationAbstraction > CastHelper::eval ( const std::shared_ptr < abstraction::OperationAbstraction > & param, const std::string & type, bool move ) {
if ( abstraction::Registry::isCastNoOp ( type, param->getReturnType ( ) ) ) {
return param;
}
bool normalize;
std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getCastAbstraction ( type, param->getReturnType ( ), normalize );
if ( ! res->attachInput ( param, 0, move ) )
throw exception::CommonException ( "Can't connect param at 0 of cast to " + type + " with result of type " + param->getReturnType ( ) + "." );
if ( ! res->eval ( ) )
throw exception::CommonException ( "Eval of cast to " + type + " failed." );
if ( normalize ) {
std::shared_ptr < abstraction::OperationAbstraction > normalized = abstraction::Registry::getNormalizeAbstraction ( res->getReturnType ( ) );
if ( ! normalized->attachInput ( res, 0, true ) )
throw exception::CommonException ( "Can't connect param at 0 of normalize of cast to " + type + " with result of type " + res->getReturnType ( ) + "." );
if ( ! normalized->eval ( ) )
throw exception::CommonException ( "Eval of normalize of cast to " + type + " failed." );
res = normalized;
}
return res;
}
} /* namespace cli */
...@@ -7,31 +7,7 @@ namespace cli { ...@@ -7,31 +7,7 @@ namespace cli {
   
class CastHelper { class CastHelper {
public: public:
static std::shared_ptr < abstraction::OperationAbstraction > castHelper ( const std::shared_ptr < abstraction::OperationAbstraction > & param, const std::string & type, bool move ) { static std::shared_ptr < abstraction::OperationAbstraction > eval ( const std::shared_ptr < abstraction::OperationAbstraction > & param, const std::string & type, bool move );
if ( abstraction::Registry::isCastNoOp ( type, param->getReturnType ( ) ) ) {
return param;
}
bool normalize;
std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getCastAbstraction ( type, param->getReturnType ( ), normalize );
if ( ! res->attachInput ( param, 0, move ) )
throw exception::CommonException ( "Can't connect param at 0 of cast to " + type + " with result of type " + param->getReturnType ( ) + "." );
if ( ! res->eval ( ) )
throw exception::CommonException ( "Eval of cast to " + type + " failed." );
if ( normalize ) {
std::shared_ptr < abstraction::OperationAbstraction > normalized = abstraction::Registry::getNormalizeAbstraction ( res->getReturnType ( ) );
if ( ! normalized->attachInput ( res, 0, true ) )
throw exception::CommonException ( "Can't connect param at 0 of normalize of cast to " + type + " with result of type " + res->getReturnType ( ) + "." );
if ( ! normalized->eval ( ) )
throw exception::CommonException ( "Eval of normalize of cast to " + type + " failed." );
res = normalized;
}
return res;
}
   
}; };
   
......
...@@ -19,7 +19,7 @@ public: ...@@ -19,7 +19,7 @@ public:
   
std::shared_ptr < abstraction::OperationAbstraction > translatedParam = m_param->translateAndEval ( prev, environment ); std::shared_ptr < abstraction::OperationAbstraction > translatedParam = m_param->translateAndEval ( prev, environment );
   
return CastHelper::castHelper ( translatedParam, type, getMove ( ) ); return CastHelper::eval ( translatedParam, type, getMove ( ) );
} }
}; };
   
......
...@@ -20,7 +20,7 @@ public: ...@@ -20,7 +20,7 @@ public:
   
std::shared_ptr < abstraction::OperationAbstraction > translatedStatement = m_statement->translateAndEval ( prev, environment ); std::shared_ptr < abstraction::OperationAbstraction > translatedStatement = m_statement->translateAndEval ( prev, environment );
   
return CastHelper::castHelper ( translatedStatement, type, m_move ); return CastHelper::eval ( translatedStatement, type, m_move );
} }
   
}; };
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#include <ast/Option.h> #include <ast/Option.h>
#include <ast/Param.h> #include <ast/Param.h>
#include <ast/Arg.h> #include <ast/Arg.h>
#include <ast/common/CastHelper.h> #include <ast/common/AlgorithmHelper.h>
   
namespace cli { namespace cli {
   
...@@ -23,61 +23,9 @@ std::shared_ptr < abstraction::OperationAbstraction > SingleStatement::translate ...@@ -23,61 +23,9 @@ std::shared_ptr < abstraction::OperationAbstraction > SingleStatement::translate
moves.push_back ( param->getMove ( ) ); moves.push_back ( param->getMove ( ) );
} }
   
ext::vector < std::string > paramTypes;
for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : params ) {
paramTypes.push_back ( param->getReturnType ( ) );
}
std::string name = m_name->eval ( environment ); std::string name = m_name->eval ( environment );
   
bool downcast = false; return AlgorithmHelper::eval ( name, params, moves );
bool normalize = false;
std::shared_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getAlgorithmAbstraction ( name, paramTypes, downcast, normalize );
unsigned i = 0;
ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > casted_params;
for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : params ) {
if ( abstraction::Registry::isCastNoOp ( algo->getParamType ( i ), param->getReturnType ( ) ) ) {
casted_params.push_back ( param );
} else {
casted_params.push_back ( CastHelper::castHelper ( param, algo->getParamType ( i ), moves [ i ] ) );
moves [ i ] = true;
}
++ i;
}
i = 0;
for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : casted_params ) {
if ( ! algo->attachInput ( param, i, moves [ i ] ) )
throw exception::CommonException ( "Can't connect param at " + ext::to_string ( i ) + " of algorithm " + name + " with result of type " + param->getReturnType ( ) + "." );
++ i;
}
if ( ! algo->eval ( ) )
throw exception::CommonException ( "Eval of algorithm " + name + " failed." );
if ( downcast ) {
std::shared_ptr < abstraction::OperationAbstraction > downcaster = abstraction::Registry::getDowncastAbstraction ( algo->getRuntimeReturnType ( ), algo->getReturnType ( ) );
if ( ! downcaster->attachInput ( algo, 0, true ) )
throw exception::CommonException ( "Can't connect param at 0 of downcast of algorithm " + name + " with result of type " + algo->getReturnType ( ) + "." );
if ( ! downcaster->eval ( ) )
throw exception::CommonException ( "Eval of downcast of algorithm " + name + " failed." );
algo = downcaster;
}
if ( normalize ) {
std::shared_ptr < abstraction::OperationAbstraction > normalized = abstraction::Registry::getNormalizeAbstraction ( algo->getReturnType ( ) );
if ( ! normalized->attachInput ( algo, 0, true ) )
throw exception::CommonException ( "Can't connect param at 0 of normalize of algorithm " + name + " with result of type " + algo->getReturnType ( ) + "." );
if ( ! normalized->eval ( ) )
throw exception::CommonException ( "Eval of normalize of algorithm " + name + " failed." );
algo = normalized;
}
return algo;
} }
   
} /* namespace cli */ } /* namespace cli */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment