#include <ast/statements/ContainerStatement.h> #include <ast/Option.h> #include <ast/Param.h> #include <ast/Arg.h> #include <abstraction/common/CastHelper.h> #include <exception/CommonException.h> #include <iostream> namespace cli { ContainerStatement::ContainerStatement ( std::string container, ext::vector < std::unique_ptr < Param > > params, ext::vector < std::unique_ptr < Option > > options ) : m_container ( std::move ( container ) ), m_params ( std::move ( params ) ), m_options ( std::move ( options ) ) { for ( const std::unique_ptr < Option > & option : m_options ) { option->eval ( * this ); } } std::shared_ptr < abstraction::OperationAbstraction > ContainerStatement::translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const { ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params; for ( const std::unique_ptr < Param > & param : m_params ) { params.push_back ( param->translateAndEval ( prev, environment ) ); } std::vector < bool > moves; for ( const std::unique_ptr < Param > & param : m_params ) { moves.push_back ( param->getMove ( ) ); } std::shared_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getContainerAbstraction ( m_container, m_type ); 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 ( abstraction::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 " + m_container + " with result of type " + param->getReturnType ( ) + "." ); ++ i; } if ( ! algo->eval ( ) ) throw exception::CommonException ( "Eval of algorithm " + m_container + " failed." ); return algo; } void ContainerStatement::setType ( std::string type ) { m_type = std::move ( type ); } } /* namespace cli */