diff --git a/alib2cli/src/ast/statements/ResultPrintStatement.h b/alib2cli/src/ast/statements/ResultPrintStatement.h index 187ce67bf5bced86c982f18920706637e7175e4c..fe30f6f453323a78b7af5f9b6e8d228c860da630 100644 --- a/alib2cli/src/ast/statements/ResultPrintStatement.h +++ b/alib2cli/src/ast/statements/ResultPrintStatement.h @@ -12,6 +12,10 @@ public: virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & ) const override { std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( prev->getReturnType ( ) ); + + if ( res->numberOfParams ( ) == 0 ) + return res; + if ( ! res->attachInput ( prev, 0, false ) ) throw exception::CommonException ( "Can't connect param at 0 of result print statement with result of type " + prev->getReturnType ( ) + "." ); if ( ! res->eval ( ) ) diff --git a/alib2common/src/abstraction/NaryOperationAbstraction.hpp b/alib2common/src/abstraction/NaryOperationAbstraction.hpp index 16e5dbaee30e537b5db608be549e74b1a680afc2..49bcce19644998a63323d3efaf199e9750988a13 100644 --- a/alib2common/src/abstraction/NaryOperationAbstraction.hpp +++ b/alib2common/src/abstraction/NaryOperationAbstraction.hpp @@ -23,6 +23,9 @@ protected: private: virtual bool attachInput ( const std::shared_ptr < OperationAbstraction > & input, unsigned index, bool move ) override { + if ( index >= m_moves.size ( ) ) + throw exception::CommonException ( "Parameter index out of bounds."); + m_moves [ index ] = move; auto attachCallback = [ & ] ( auto & param ) { @@ -37,16 +40,21 @@ private: return false; } }; + return ext::call_on_nth < bool > ( m_params, index, attachCallback ); } virtual bool detachInput ( unsigned index ) override { + if ( index >= m_moves.size ( ) ) + throw exception::CommonException ( "Parameter index out of bounds."); + m_moves [ index ] = false; auto detachCallback = [ & ] ( auto & param ) { param = nullptr; return true; }; + return ext::call_on_nth < bool > ( m_params, index, detachCallback ); } diff --git a/alib2common/src/abstraction/PrimitiveRegistrator.cpp b/alib2common/src/abstraction/PrimitiveRegistrator.cpp index 97974e243b066f3e6ef2c8e3db69b8cb1149a8d1..ad4be3902dd059aec097ff277d57478e18d32e30 100644 --- a/alib2common/src/abstraction/PrimitiveRegistrator.cpp +++ b/alib2common/src/abstraction/PrimitiveRegistrator.cpp @@ -43,6 +43,7 @@ public: abstraction::ValuePrinterRegistry::registerValuePrinter < int > ( ); abstraction::ValuePrinterRegistry::registerValuePrinter < double > ( ); abstraction::ValuePrinterRegistry::registerValuePrinter < std::string > ( ); + abstraction::ValuePrinterRegistry::registerValuePrinter < void > ( ); abstraction::ImmediateRegistry::registerImmediate < int > ( ); abstraction::ImmediateRegistry::registerImmediate < std::string > ( ); diff --git a/alib2common/src/abstraction/ValuePrinterAbstraction.hpp b/alib2common/src/abstraction/ValuePrinterAbstraction.hpp index e70abb33dbe2805aa6a9c30376d79ee78fc2ccde..24c0c28300f2a6c6aa3d1ff6850923329736c3c2 100644 --- a/alib2common/src/abstraction/ValuePrinterAbstraction.hpp +++ b/alib2common/src/abstraction/ValuePrinterAbstraction.hpp @@ -9,6 +9,7 @@ #define _VALUE_PRINTER_ABSTRACTION_HPP_ #include <abstraction/UnaryOperationAbstraction.hpp> +#include <abstraction/NullaryOperationAbstraction.hpp> #include <tuple> namespace abstraction { @@ -25,6 +26,14 @@ public: } }; +template < > +class ValuePrinterAbstraction < void > : public NullaryOperationAbstraction < void > { +public: + virtual bool run ( ) override { + return true; + } +}; + } /* namespace abstraction */ #endif /* _VALUE_PRINTER_ABSTRACTION_HPP_ */ diff --git a/alib2common/src/abstraction/ValuePrinterRegistry.cpp b/alib2common/src/abstraction/ValuePrinterRegistry.cpp new file mode 100644 index 0000000000000000000000000000000000000000..39e39fc57965b4d3e46a821af6626a0a6fa7b08c --- /dev/null +++ b/alib2common/src/abstraction/ValuePrinterRegistry.cpp @@ -0,0 +1,17 @@ +/* + * ValuePrinterRegistry.cpp + * + * Created on: 21. 7. 2017 + * Author: Jan Travnicek + */ + +#include <abstraction/ValuePrinterRegistry.hpp> + +namespace abstraction { + +template < > +std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( ) const { + return std::make_shared < abstraction::ValuePrinterAbstraction < void > > ( ); +} + +} /* namespace abstraction */ diff --git a/alib2common/src/abstraction/ValuePrinterRegistry.hpp b/alib2common/src/abstraction/ValuePrinterRegistry.hpp index f1ef0ae91e4ed45523e5d9ad9f6196d17b3cc587..92b4f370ad3eba18ffa5b75a41a8dc305b046163 100644 --- a/alib2common/src/abstraction/ValuePrinterRegistry.hpp +++ b/alib2common/src/abstraction/ValuePrinterRegistry.hpp @@ -69,6 +69,9 @@ std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::Entr return std::make_shared < abstraction::ValuePrinterAbstraction < const Param & > > ( ); } +template < > +std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( ) const; + } /* namespace abstraction */ #endif /* _VALUE_PRINTER_REGISTRY_HPP_ */