diff --git a/alib2abstraction/src/abstraction/CastAbstraction.hpp b/alib2abstraction/src/abstraction/CastAbstraction.hpp index 028efa7b67f4135639ecca521af6ed7d2e26a118..f15e5b9d2bc3a545abe41f247ce4d8894b97caea 100644 --- a/alib2abstraction/src/abstraction/CastAbstraction.hpp +++ b/alib2abstraction/src/abstraction/CastAbstraction.hpp @@ -19,7 +19,7 @@ public: std::shared_ptr < abstraction::Value > run ( ) override { std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) ); - return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), ReturnType ( retrieveValue < const ParamType & > ( param.first, param.second ) ), true ); + return std::make_shared < abstraction::ValueHolder < ReturnType > > ( ReturnType ( retrieveValue < const ParamType & > ( param.first, param.second ) ), true ); } }; diff --git a/alib2abstraction/src/abstraction/NormalizeAbstraction.hpp b/alib2abstraction/src/abstraction/NormalizeAbstraction.hpp index ee8b9ab5d33c38891978d9ec2104e2b4143059a7..d5ff9f4bf123a781357b322816d9446b34fc79f6 100644 --- a/alib2abstraction/src/abstraction/NormalizeAbstraction.hpp +++ b/alib2abstraction/src/abstraction/NormalizeAbstraction.hpp @@ -22,7 +22,7 @@ public: std::pair < std::shared_ptr < abstraction::Value >, bool > & rawParam = std::get < 0 > ( this->getParams ( ) ); ParamType && param = retrieveValue < ParamType && > ( rawParam.first, rawParam.second ); - return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), factory::NormalizeFactory::normalize ( std::move ( param ) ), true ); + return std::make_shared < abstraction::ValueHolder < ReturnType > > ( factory::NormalizeFactory::normalize ( std::move ( param ) ), true ); } }; diff --git a/alib2abstraction/src/abstraction/ReferenceAbstraction.hpp b/alib2abstraction/src/abstraction/ReferenceAbstraction.hpp index 51cb51ffb9327493d00dde1fa7ee82cb7e02def2..04677ad5651d6d8a17d773747e26c46137a475a2 100644 --- a/alib2abstraction/src/abstraction/ReferenceAbstraction.hpp +++ b/alib2abstraction/src/abstraction/ReferenceAbstraction.hpp @@ -21,7 +21,7 @@ public: std::shared_ptr < abstraction::Value > run ( ) override { std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) ); - return std::make_shared < abstraction::ValueHolder < Type * > > ( this->getProxyAbstraction ( ), & retrieveValue < Type & > ( param.first, param.second ), true ); + return std::make_shared < abstraction::ValueHolder < Type * > > ( & retrieveValue < Type & > ( param.first, param.second ), true ); } }; diff --git a/alib2abstraction/src/abstraction/SetAbstraction.hpp b/alib2abstraction/src/abstraction/SetAbstraction.hpp index e304ec94823e63de519d2f54abd35acbd94aa16e..854e17d9f872fe8a4b42259c5fb6afc7cb6413bf 100644 --- a/alib2abstraction/src/abstraction/SetAbstraction.hpp +++ b/alib2abstraction/src/abstraction/SetAbstraction.hpp @@ -24,7 +24,7 @@ public: theSet.insert ( abstraction::retrieveValue < ParamType > ( param.first, param.second ) ); } - return std::make_shared < abstraction::ValueHolder < ext::set < ParamType > > > ( this->getProxyAbstraction ( ), std::move ( theSet ), true ); + return std::make_shared < abstraction::ValueHolder < ext::set < ParamType > > > ( std::move ( theSet ), true ); } }; diff --git a/alib2abstraction/src/abstraction/TemporariesHolder.cpp b/alib2abstraction/src/abstraction/TemporariesHolder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5852e26918e4d76a6a95a85e0ce32ef45d68d2d7 --- /dev/null +++ b/alib2abstraction/src/abstraction/TemporariesHolder.cpp @@ -0,0 +1,17 @@ +#include <abstraction/TemporariesHolder.h> + +namespace abstraction { + +void TemporariesHolder::holdTemporary ( std::shared_ptr < abstraction::Value > temporary ) { + temporary->increaseTemporaryReference ( ); + m_temporaries.push_back ( std::move ( temporary ) ); +} + +void TemporariesHolder::clearTemporaries ( ) { + for ( std::shared_ptr < abstraction::Value > & temporary : m_temporaries ) { + temporary->decreaseTemporaryReference ( ); + } + m_temporaries.clear ( ); +} + +} /* namespace abstraction */ diff --git a/alib2abstraction/src/abstraction/TemporariesHolder.h b/alib2abstraction/src/abstraction/TemporariesHolder.h new file mode 100644 index 0000000000000000000000000000000000000000..509fc5d86ca419ab87ece7d0ebbaa1300f6dde98 --- /dev/null +++ b/alib2abstraction/src/abstraction/TemporariesHolder.h @@ -0,0 +1,32 @@ +#ifndef _TEMPORARIES_HOLDER_H_ +#define _TEMPORARIES_HOLDER_H_ + +#include <alib/vector> +#include <abstraction/Value.hpp> + +namespace abstraction { + +class TemporariesHolder { + std::vector < std::shared_ptr < abstraction::Value > > m_temporaries; + +public: + TemporariesHolder ( ) = default; + + TemporariesHolder ( const TemporariesHolder & ) = delete; + + TemporariesHolder ( TemporariesHolder && ) = default; + + TemporariesHolder & operator = ( const TemporariesHolder & ) = delete; + + TemporariesHolder & operator = ( TemporariesHolder && ) = default; + + virtual ~TemporariesHolder ( ) = default; + + void holdTemporary ( std::shared_ptr < abstraction::Value > temporary ); + + void clearTemporaries ( ); +}; + +} /* namespace abstraction */ + +#endif /* _TEMPORARIES_HOLDER_H_ */ diff --git a/alib2abstraction/src/abstraction/Value.cpp b/alib2abstraction/src/abstraction/Value.cpp index 80de81380b462359941b486a4048f81f251fa626..548fac02fa7649d1da5e024602a964eba043a115 100644 --- a/alib2abstraction/src/abstraction/Value.cpp +++ b/alib2abstraction/src/abstraction/Value.cpp @@ -10,9 +10,6 @@ namespace abstraction { -Value::Value ( const std::shared_ptr < abstraction::OperationAbstraction > & ref ) : m_lifeReference ( ref ) { -} - std::shared_ptr < abstraction::Value > Value::getProxyAbstraction ( ) { return shared_from_this ( ); } @@ -21,12 +18,8 @@ std::string Value::getType ( ) const { return ext::to_string ( getTypeIndex ( ) ); } -const std::shared_ptr < abstraction::OperationAbstraction > & Value::getLifeReference ( ) const { - return m_lifeReference; -} - -std::shared_ptr < abstraction::Value > Void::clone ( const std::shared_ptr < abstraction::OperationAbstraction > &, abstraction::ParamQualifiers::ParamQualifierSet, bool, bool ) { +std::shared_ptr < abstraction::Value > Void::clone ( abstraction::ParamQualifiers::ParamQualifierSet, bool, bool ) { throw std::domain_error ( "Void variables are not allowed" ); } @@ -39,10 +32,10 @@ abstraction::ParamQualifiers::ParamQualifierSet Void::getTypeQualifiers ( ) cons } -LazyValue::LazyValue ( const std::shared_ptr < abstraction::OperationAbstraction > & ref ) : Value ( std::move ( ref ) ) { +LazyValue::LazyValue ( const std::shared_ptr < abstraction::OperationAbstraction > & ref ) : m_lifeReference ( std::move ( ref ) ) { } -std::shared_ptr < abstraction::Value > LazyValue::clone ( const std::shared_ptr < abstraction::OperationAbstraction > &, abstraction::ParamQualifiers::ParamQualifierSet, bool, bool ) { +std::shared_ptr < abstraction::Value > LazyValue::clone ( abstraction::ParamQualifiers::ParamQualifierSet, bool, bool ) { throw std::domain_error ( "Feature not available on lazy value" ); } @@ -60,4 +53,8 @@ std::shared_ptr < abstraction::Value > LazyValue::getProxyAbstraction ( ) { return cache->getProxyAbstraction ( ); } +const std::shared_ptr < abstraction::OperationAbstraction > & LazyValue::getLifeReference ( ) const { + return m_lifeReference; +} + } /* namespace abstraction */ diff --git a/alib2abstraction/src/abstraction/Value.hpp b/alib2abstraction/src/abstraction/Value.hpp index 3ae3de118da46b633f89589cf074e879dea7b4a6..df351ba59dc20c428b393f54127bff06f8dc4dae 100644 --- a/alib2abstraction/src/abstraction/Value.hpp +++ b/alib2abstraction/src/abstraction/Value.hpp @@ -19,14 +19,12 @@ namespace abstraction { class OperationAbstraction; class Value : public std::enable_shared_from_this < Value > { - std::shared_ptr < abstraction::OperationAbstraction > m_lifeReference; + size_t m_temporaryReferences = 0; public: - Value ( const std::shared_ptr < abstraction::OperationAbstraction > & ref ); - virtual ~Value ( ) noexcept = default; - virtual std::shared_ptr < abstraction::Value > clone ( const std::shared_ptr < abstraction::OperationAbstraction > & lifeReference, abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move = false ) = 0; + virtual std::shared_ptr < abstraction::Value > clone ( abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move = false ) = 0; virtual std::shared_ptr < abstraction::Value > getProxyAbstraction ( ); @@ -36,14 +34,25 @@ public: virtual abstraction::ParamQualifiers::ParamQualifierSet getTypeQualifiers ( ) const = 0; - const std::shared_ptr < abstraction::OperationAbstraction > & getLifeReference ( ) const; + void increaseTemporaryReference ( ) { + m_temporaryReferences += 1; + } + + void decreaseTemporaryReference ( ) { + if ( m_temporaryReferences == 0 ) + throw std::domain_error ( "Attempted to decrease temporary reference count bellow zerp" ); + + m_temporaryReferences -= 1; + } + + size_t getTemporaryReferences ( ) const { + return m_temporaryReferences; + } }; class Void : public Value { public: - using Value::Value; - - std::shared_ptr < abstraction::Value > clone ( const std::shared_ptr < abstraction::OperationAbstraction > & lifeReference, abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override; + std::shared_ptr < abstraction::Value > clone ( abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override; ext::type_index getTypeIndex ( ) const override; @@ -53,17 +62,20 @@ public: class LazyValue : public Value { std::shared_ptr < Value > cache; + std::shared_ptr < abstraction::OperationAbstraction > m_lifeReference; public: LazyValue ( const std::shared_ptr < abstraction::OperationAbstraction > & ref ); - std::shared_ptr < abstraction::Value > clone ( const std::shared_ptr < abstraction::OperationAbstraction > & lifeReference, abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override; + std::shared_ptr < abstraction::Value > clone ( abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override; ext::type_index getTypeIndex ( ) const override; abstraction::ParamQualifiers::ParamQualifierSet getTypeQualifiers ( ) const override; std::shared_ptr < abstraction::Value > getProxyAbstraction ( ) override; + + const std::shared_ptr < abstraction::OperationAbstraction > & getLifeReference ( ) const; }; } /* namespace abstraction */ diff --git a/alib2abstraction/src/abstraction/ValueHolder.hpp b/alib2abstraction/src/abstraction/ValueHolder.hpp index 77cafbd5af375adc34ad620058e8d4b193e5ea7e..88cb61a23d066958feeb5cbc961c1a23a78b0712 100644 --- a/alib2abstraction/src/abstraction/ValueHolder.hpp +++ b/alib2abstraction/src/abstraction/ValueHolder.hpp @@ -114,30 +114,30 @@ public: template < class Type > class ValueHolder : public ValueHolderImpl < Type > { public: - ValueHolder ( const std::shared_ptr < abstraction::OperationAbstraction > & ref, Type && value, bool temporary ) : ValueHolderImpl < Type > ( ref, ParamQualifiers::paramQualifiers < Type > ( ), temporary ) { + ValueHolder ( Type && value, bool temporary ) : ValueHolderImpl < Type > ( ParamQualifiers::paramQualifiers < Type > ( ), temporary ) { this->setData ( std::forward < Type > ( value ) ); } - std::shared_ptr < abstraction::Value > clone ( const std::shared_ptr < abstraction::OperationAbstraction > & lifeReference, ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override { - if ( ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::LREF || paramQualifierSet && ParamQualifiers::ParamQualifierSet::RREF ) && this->isTemporary ( ) && ! this->isRef ( ) && lifeReference == nullptr ) - throw std::domain_error ( "Taking reference to a temporary" ); + std::shared_ptr < abstraction::Value > clone ( ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override { +/* if ( ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::LREF || paramQualifierSet && ParamQualifiers::ParamQualifierSet::RREF ) && this->isTemporary ( ) && ! this->isRef ( ) && this->getTemporaryReferences ( ) == 0 ) + throw std::domain_error ( "Taking reference to a temporary" );*/ if ( ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::CONST ) && ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::LREF ) ) - return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > & > > ( lifeReference, retrieveValue < const std::decay_t < Type > & > ( this->getProxyAbstraction ( ), move ), isTemporary ); + return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > & > > ( retrieveValue < const std::decay_t < Type > & > ( this->getProxyAbstraction ( ), move ), isTemporary ); else if ( ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::CONST ) && ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::RREF ) ) - return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > && > > ( lifeReference, retrieveValue < const std::decay_t < Type > && > ( this->getProxyAbstraction ( ), move ), isTemporary ); + return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > && > > ( retrieveValue < const std::decay_t < Type > && > ( this->getProxyAbstraction ( ), move ), isTemporary ); else if ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::LREF ) - return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > & > > ( lifeReference, retrieveValue < std::decay_t < Type > & > ( this->getProxyAbstraction ( ), move ), isTemporary ); + return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > & > > ( retrieveValue < std::decay_t < Type > & > ( this->getProxyAbstraction ( ), move ), isTemporary ); else if ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::RREF ) - return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > && > > ( lifeReference, retrieveValue < std::decay_t < Type > && > ( this->getProxyAbstraction ( ), move ), isTemporary ); + return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > && > > ( retrieveValue < std::decay_t < Type > && > ( this->getProxyAbstraction ( ), move ), isTemporary ); else if constexpr ( std::is_abstract_v < std::decay_t < Type > > ) throw std::domain_error ( "Cannot declare value of abstract class." ); else if constexpr ( ! std::is_assignable_v < std::decay_t < Type > &, std::decay_t < Type > > ) throw std::domain_error ( "Cannot assign value." ); else if ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::CONST ) - return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > > > ( lifeReference, retrieveValue < const std::decay_t < Type > > ( this->getProxyAbstraction ( ), move ), isTemporary ); + return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > > > ( retrieveValue < const std::decay_t < Type > > ( this->getProxyAbstraction ( ), move ), isTemporary ); else - return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > > > ( lifeReference, retrieveValue < std::decay_t < Type > > ( this->getProxyAbstraction ( ), move ), isTemporary ); + return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > > > ( retrieveValue < std::decay_t < Type > > ( this->getProxyAbstraction ( ), move ), isTemporary ); } abstraction::ParamQualifiers::ParamQualifierSet getTypeQualifiers ( ) const override { diff --git a/alib2abstraction/src/abstraction/ValueHolderInterface.hpp b/alib2abstraction/src/abstraction/ValueHolderInterface.hpp index b0a0a82500af199361ff08c788ad4e295b7bd3b3..5e9999b81a9e26edf4ba03968994d4ab38949fd9 100644 --- a/alib2abstraction/src/abstraction/ValueHolderInterface.hpp +++ b/alib2abstraction/src/abstraction/ValueHolderInterface.hpp @@ -18,7 +18,7 @@ class ValueHolderInterface : public Value { bool m_isTemporary; protected: - ValueHolderInterface ( const std::shared_ptr < abstraction::OperationAbstraction > & ref, ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary ) : Value ( ref ), m_paramQualifierSet ( paramQualifierSet ), m_isTemporary ( isTemporary ) { + ValueHolderInterface ( ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary ) : m_paramQualifierSet ( paramQualifierSet ), m_isTemporary ( isTemporary ) { if ( this->isLvalueRef ( ) && this->isTemporary ( ) ) throw std::domain_error ( "Lvalue references cannot be a temporarie." ); if ( this->isLvalueRef ( ) && this->isRvalueRef ( ) ) @@ -63,6 +63,11 @@ ParamType retrieveValue ( const std::shared_ptr < abstraction::Value > & param, if ( ! interface ) throw std::invalid_argument ( "Abstraction does not provide value of type " + ext::to_string < ParamType > ( ) + " but " + param->getType ( ) + "." ); +/* if constexpr ( std::is_reference_v < ParamType > ) { + if ( interface->isTemporary ( ) && ! interface->isRef ( ) && interface->getTemporaryReferences ( ) == 0 ) + throw std::domain_error ( "Taking reference to a temporary." ); + }*/ + if constexpr ( std::is_rvalue_reference_v < ParamType > ) { if ( move || interface->isTemporary ( ) ) return std::move ( interface->getValue ( ) ); diff --git a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp index 347d08a7b391ac680c2b7eaa8f85b01ac4821c90..a6be5bdce48867aee4de185504bd78e93e74858f 100644 --- a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp +++ b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp @@ -23,7 +23,7 @@ class ValueOperationAbstraction : virtual public OperationAbstraction { public: template < typename ... ParamTypes, typename Callable > inline std::shared_ptr < abstraction::Value > run_helper ( Callable callback, const ext::array < std::pair < std::shared_ptr < abstraction::Value >, bool >, sizeof ... ( ParamTypes ) > & inputs ) { - return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), abstraction::apply < ParamTypes ... > ( callback, inputs ), std::is_lvalue_reference_v < ReturnType > ? false : true ); + return std::make_shared < abstraction::ValueHolder < ReturnType > > ( abstraction::apply < ParamTypes ... > ( callback, inputs ), std::is_lvalue_reference_v < ReturnType > ? false : true ); } abstraction::ParamQualifiers::ParamQualifierSet getReturnTypeQualifiers ( ) const override { @@ -42,7 +42,7 @@ public: template < typename ... ParamTypes, typename Callable > inline std::shared_ptr < abstraction::Value > run_helper ( Callable callback, const ext::array < std::pair < std::shared_ptr < abstraction::Value >, bool >, sizeof ... ( ParamTypes ) > & inputs ) { abstraction::apply < ParamTypes ... > ( callback, inputs ); - return std::make_shared < abstraction::Void > ( this->getProxyAbstraction ( ) ); + return std::make_shared < abstraction::Void > ( ); } ext::type_index getReturnTypeIndex ( ) const override; diff --git a/alib2abstraction/src/abstraction/ValuePrinterAbstraction.hpp b/alib2abstraction/src/abstraction/ValuePrinterAbstraction.hpp index 7e60291a788a177cd925517566f09f9c04926246..54ae6be2af5693e46a98c6198cd5dcf144cfc092 100644 --- a/alib2abstraction/src/abstraction/ValuePrinterAbstraction.hpp +++ b/alib2abstraction/src/abstraction/ValuePrinterAbstraction.hpp @@ -26,7 +26,7 @@ public: std::pair < std::shared_ptr < abstraction::Value >, bool > & secondParam = std::get < 1 > ( this->getParams ( ) ); retrieveValue < std::ostream & > ( secondParam.first, secondParam.second ) << retrieveValue < const ParamType & > ( firstParam.first, firstParam.second ) << std::endl; - return std::make_shared < abstraction::Void > ( this->getProxyAbstraction ( ) ); + return std::make_shared < abstraction::Void > ( ); } }; @@ -37,7 +37,7 @@ public: } std::shared_ptr < abstraction::Value > run ( ) override { - return std::make_shared < abstraction::Void > ( this->getProxyAbstraction ( ) ); + return std::make_shared < abstraction::Void > ( ); } }; diff --git a/alib2abstraction/src/common/CastHelper.cpp b/alib2abstraction/src/common/CastHelper.cpp index f7d5ead893270879cd484836401d8f9c17784817..5b9134f0cc983fcad91def69177d54227422b4df 100644 --- a/alib2abstraction/src/common/CastHelper.cpp +++ b/alib2abstraction/src/common/CastHelper.cpp @@ -1,11 +1,11 @@ -#include <registry/Registry.h> #include <common/CastHelper.h> + +#include <registry/Registry.h> #include <exception> -#include <abstraction/Value.hpp> namespace abstraction { -std::shared_ptr < abstraction::Value > CastHelper::eval ( const std::shared_ptr < abstraction::Value > & param, const std::string & type, bool move ) { +std::shared_ptr < abstraction::Value > CastHelper::eval ( abstraction::TemporariesHolder &, const std::shared_ptr < abstraction::Value > & param, const std::string & type, bool move ) { if ( abstraction::Registry::isCastNoOp ( type, param->getType ( ) ) ) { return param; } @@ -13,7 +13,7 @@ std::shared_ptr < abstraction::Value > CastHelper::eval ( const std::shared_ptr std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getCastAbstraction ( type, param->getType ( ) ); res->attachInput ( param, 0, move ); - std::shared_ptr < Value > result = res->eval ( ); + std::shared_ptr < abstraction::Value > result = res->eval ( ); if ( ! result ) throw std::invalid_argument ( "Eval of cast to " + type + " failed." ); diff --git a/alib2abstraction/src/common/CastHelper.h b/alib2abstraction/src/common/CastHelper.h index 4b70eac1e0b867ce407a96bc8a214662c2e2dd99..99b8c6291ad535b6fd4a439617785c8bbcbf4377 100644 --- a/alib2abstraction/src/common/CastHelper.h +++ b/alib2abstraction/src/common/CastHelper.h @@ -1,13 +1,16 @@ #ifndef _CAST_HELPER_H_ #define _CAST_HELPER_H_ -#include <registry/Registry.h> +#include <string> +#include <memory> +#include <abstraction/Value.hpp> +#include <abstraction/TemporariesHolder.h> namespace abstraction { class CastHelper { public: - static std::shared_ptr < abstraction::Value > eval ( const std::shared_ptr < abstraction::Value > & param, const std::string & type, bool move ); + static std::shared_ptr < abstraction::Value > eval ( abstraction::TemporariesHolder & environment, const std::shared_ptr < abstraction::Value > & param, const std::string & type, bool move ); }; diff --git a/alib2abstraction/src/common/EvalHelper.cpp b/alib2abstraction/src/common/EvalHelper.cpp index 7edb58f8058e72176b46c7560de9c6c91a983a44..d1a51409813c685e11aeb0b8b26a1e563d265669 100644 --- a/alib2abstraction/src/common/EvalHelper.cpp +++ b/alib2abstraction/src/common/EvalHelper.cpp @@ -5,14 +5,15 @@ * Author: Jan Travnicek */ +#include <common/EvalHelper.h> + #include <registry/Registry.h> #include <exception> -#include <common/EvalHelper.h> #include <common/CastHelper.h> namespace abstraction { -std::shared_ptr < abstraction::Value > EvalHelper::evalAlgorithm ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ) { +std::shared_ptr < abstraction::Value > EvalHelper::evalAlgorithm ( abstraction::TemporariesHolder & environment, const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ) { ext::vector < std::string > paramTypes; ext::vector < abstraction::ParamQualifiers::ParamQualifierSet > paramTypeQualifiers; for ( const std::shared_ptr < abstraction::Value > & param : params ) { @@ -21,13 +22,13 @@ std::shared_ptr < abstraction::Value > EvalHelper::evalAlgorithm ( const std::st } try { - return evalAbstraction ( abstraction::Registry::getAlgorithmAbstraction ( name, templateParams, paramTypes, paramTypeQualifiers, category ), params, moves ); + return evalAbstraction ( environment, abstraction::Registry::getAlgorithmAbstraction ( name, templateParams, paramTypes, paramTypeQualifiers, category ), params, moves ); } catch ( const std::exception & executionException ) { std::throw_with_nested ( std::runtime_error ( "Evaluation of algorithm " + name + " failed." ) ); } } -std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::BinaryOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ) { +std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::BinaryOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ) { ext::vector < std::string > paramTypes; ext::vector < abstraction::ParamQualifiers::ParamQualifierSet > paramTypeQualifiers; for ( const std::shared_ptr < abstraction::Value > & param : params ) { @@ -36,13 +37,13 @@ std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::Bin } try { - return evalAbstraction ( Registry::getBinaryOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves ); + return evalAbstraction ( environment, abstraction::Registry::getBinaryOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves ); } catch ( ... ) { - std::throw_with_nested ( std::runtime_error ( "Evaluation of binary operator " + Operators::toString ( type ) + " failed." ) ); + std::throw_with_nested ( std::runtime_error ( "Evaluation of binary operator " + abstraction::Operators::toString ( type ) + " failed." ) ); } } -std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::PrefixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ) { +std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::PrefixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ) { ext::vector < std::string > paramTypes; ext::vector < abstraction::ParamQualifiers::ParamQualifierSet > paramTypeQualifiers; for ( const std::shared_ptr < abstraction::Value > & param : params ) { @@ -51,13 +52,13 @@ std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::Pre } try { - return evalAbstraction ( Registry::getPrefixOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves ); + return evalAbstraction ( environment, abstraction::Registry::getPrefixOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves ); } catch ( ... ) { - std::throw_with_nested ( std::runtime_error ( "Evaluation of prefix operator " + Operators::toString ( type ) + " failed." ) ); + std::throw_with_nested ( std::runtime_error ( "Evaluation of prefix operator " + abstraction::Operators::toString ( type ) + " failed." ) ); } } -std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::PostfixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ) { +std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::PostfixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ) { ext::vector < std::string > paramTypes; ext::vector < abstraction::ParamQualifiers::ParamQualifierSet > paramTypeQualifiers; for ( const std::shared_ptr < abstraction::Value > & param : params ) { @@ -66,20 +67,21 @@ std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::Pos } try { - return evalAbstraction ( Registry::getPostfixOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves ); + return evalAbstraction ( environment, abstraction::Registry::getPostfixOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves ); } catch ( ... ) { - std::throw_with_nested ( std::runtime_error ( "Evaluation of postfix operator " + Operators::toString ( type ) + " failed." ) ); + std::throw_with_nested ( std::runtime_error ( "Evaluation of postfix operator " + abstraction::Operators::toString ( type ) + " failed." ) ); } } -std::shared_ptr < abstraction::Value > EvalHelper::evalAbstraction ( std::shared_ptr < abstraction::OperationAbstraction > abstraction, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves ) { +std::shared_ptr < abstraction::Value > EvalHelper::evalAbstraction ( abstraction::TemporariesHolder & environment, std::shared_ptr < abstraction::OperationAbstraction > abstraction, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves ) { unsigned i = 0; ext::vector < std::shared_ptr < abstraction::Value > > casted_params; for ( const std::shared_ptr < abstraction::Value > & param : params ) { if ( abstraction::Registry::isCastNoOp ( abstraction->getParamType ( i ), param->getType ( ) ) ) { casted_params.push_back ( param ); } else { - casted_params.push_back ( abstraction::CastHelper::eval ( param, abstraction->getParamType ( i ), moves [ i ] ) ); + casted_params.push_back ( abstraction::CastHelper::eval ( environment, param, abstraction->getParamType ( i ), moves [ i ] ) ); + environment.holdTemporary ( casted_params.back ( ) ); } ++ i; } diff --git a/alib2abstraction/src/common/EvalHelper.h b/alib2abstraction/src/common/EvalHelper.h index ab8a1ea8710ee0610ab4e550436e6fe20497e604..4de53909659cf2e0aaaf5afbf927ce3a707b8e89 100644 --- a/alib2abstraction/src/common/EvalHelper.h +++ b/alib2abstraction/src/common/EvalHelper.h @@ -14,20 +14,21 @@ #include <common/AlgorithmCategories.hpp> #include <common/Operators.hpp> #include <abstraction/Value.hpp> +#include <abstraction/TemporariesHolder.h> namespace abstraction { class EvalHelper { - static std::shared_ptr < abstraction::Value > evalAbstraction ( std::shared_ptr < abstraction::OperationAbstraction > abstraction, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves ); + static std::shared_ptr < abstraction::Value > evalAbstraction ( abstraction::TemporariesHolder & environment, std::shared_ptr < abstraction::OperationAbstraction > abstraction, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves ); public: - static std::shared_ptr < abstraction::Value > evalAlgorithm ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ); + static std::shared_ptr < abstraction::Value > evalAlgorithm ( abstraction::TemporariesHolder & environment, const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ); - static std::shared_ptr < abstraction::Value > evalOperator ( Operators::BinaryOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ); + static std::shared_ptr < abstraction::Value > evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::BinaryOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ); - static std::shared_ptr < abstraction::Value > evalOperator ( Operators::PrefixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ); + static std::shared_ptr < abstraction::Value > evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::PrefixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ); - static std::shared_ptr < abstraction::Value > evalOperator ( Operators::PostfixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ); + static std::shared_ptr < abstraction::Value > evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::PostfixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ); }; } /* namespace abstraction */ diff --git a/alib2cli/src/ast/command/CommandList.h b/alib2cli/src/ast/command/CommandList.h index 3b6719608e7f4ae38f6e192b5922cb73af948b32..3bbf5fbbd40e9ae6ab490da0201f9c0126930ac5 100644 --- a/alib2cli/src/ast/command/CommandList.h +++ b/alib2cli/src/ast/command/CommandList.h @@ -17,8 +17,10 @@ public: throw std::invalid_argument ( "Command list can't be empty" ); CommandResult res = CommandResult::OK; - for ( size_t i = 0; i < m_commands.size ( ) && res == CommandResult::OK; ++ i ) + for ( size_t i = 0; i < m_commands.size ( ) && res == CommandResult::OK; ++ i ) { res = m_commands [ i ]->run ( environment ); + environment.clearTemporaries ( ); + } return res; } diff --git a/alib2cli/src/ast/command/PrintCommand.h b/alib2cli/src/ast/command/PrintCommand.h index 07deead9d68578985ea8a0018f872612b892588e..be5213bea963a6c58784aa94078644e1fba80cd6 100644 --- a/alib2cli/src/ast/command/PrintCommand.h +++ b/alib2cli/src/ast/command/PrintCommand.h @@ -23,7 +23,7 @@ public: std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( value->getType ( ) ); res->attachInput ( value, 0, false ); - res->attachInput ( std::make_shared < abstraction::ValueHolder < std::ostream & > > ( nullptr, common::Streams::out, false ), 1, false ); + res->attachInput ( std::make_shared < abstraction::ValueHolder < std::ostream & > > ( common::Streams::out, false ), 1, false ); std::shared_ptr < abstraction::Value > result = res->eval ( ); if ( ! result ) throw std::invalid_argument ( "Eval of result print statement failed." ); diff --git a/alib2cli/src/ast/statements/CastStatement.h b/alib2cli/src/ast/statements/CastStatement.h index 946ca5d1619aafca13eae092e5c8474d765e5168..fff7f7120993161176ee09d56fc0da568799e18b 100644 --- a/alib2cli/src/ast/statements/CastStatement.h +++ b/alib2cli/src/ast/statements/CastStatement.h @@ -20,7 +20,9 @@ public: std::shared_ptr < abstraction::Value > translatedStatement = m_statement->translateAndEval ( prev, environment ); - return abstraction::CastHelper::eval ( translatedStatement, type, m_move ); + environment.holdTemporary ( translatedStatement ); + + return abstraction::CastHelper::eval ( environment, translatedStatement, type, m_move ); } }; diff --git a/alib2cli/src/ast/statements/ContainerStatement.cpp b/alib2cli/src/ast/statements/ContainerStatement.cpp index b1579c9fece48fe91c4acb25f073ba0b833b3603..e1ce0d084181c300f4dea468a8dbdcd9f5ba625d 100644 --- a/alib2cli/src/ast/statements/ContainerStatement.cpp +++ b/alib2cli/src/ast/statements/ContainerStatement.cpp @@ -4,6 +4,7 @@ #include <common/CastHelper.h> #include <exception> #include <alib/iostream> +#include <registry/Registry.h> namespace cli { @@ -24,7 +25,7 @@ std::shared_ptr < abstraction::Value > ContainerStatement::translateAndEval ( co if ( abstraction::Registry::isCastNoOp ( algo->getParamType ( i ), param->getType ( ) ) ) { casted_params.push_back ( param ); } else { - casted_params.push_back ( abstraction::CastHelper::eval ( param, algo->getParamType ( i ), m_moves [ i ] ) ); + casted_params.push_back ( abstraction::CastHelper::eval ( environment, param, algo->getParamType ( i ), m_moves [ i ] ) ); } ++ i; } diff --git a/alib2cli/src/ast/statements/FileStatement.cpp b/alib2cli/src/ast/statements/FileStatement.cpp index 3762be2f92a194f02802444088380ce9108564a3..6d5fb83564f47e08b5d4f9ed3c4f6b5b40d90dc1 100644 --- a/alib2cli/src/ast/statements/FileStatement.cpp +++ b/alib2cli/src/ast/statements/FileStatement.cpp @@ -26,7 +26,7 @@ std::shared_ptr < abstraction::Value > FileStatement::translateAndEval ( const s std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::InputFileRegistry::getAbstraction ( filetype, type, templateParams ); - std::shared_ptr < abstraction::ValueHolder < std::string > > file = std::make_shared < abstraction::ValueHolder < std::string > > ( nullptr, m_file->eval ( environment ), true ); + std::shared_ptr < abstraction::ValueHolder < std::string > > file = std::make_shared < abstraction::ValueHolder < std::string > > ( m_file->eval ( environment ), true ); res->attachInput ( file, 0, false ); return res->eval ( ); diff --git a/alib2cli/src/ast/statements/ImmediateStatement.h b/alib2cli/src/ast/statements/ImmediateStatement.h index 6f0fc664eb3097784044390cdac29c8499d3c158..b7038fa23ca34c7dbc4e25e881e883bf0c388585 100644 --- a/alib2cli/src/ast/statements/ImmediateStatement.h +++ b/alib2cli/src/ast/statements/ImmediateStatement.h @@ -10,7 +10,7 @@ class ImmediateStatement final : public Statement { std::shared_ptr < abstraction::ValueHolder < Type > > m_value; public: - ImmediateStatement ( Type value ) : m_value ( std::make_shared < abstraction::ValueHolder < Type > > ( nullptr, std::move ( value ), true ) ) { + ImmediateStatement ( Type value ) : m_value ( std::make_shared < abstraction::ValueHolder < Type > > ( std::move ( value ), true ) ) { } std::shared_ptr < abstraction::Value > translateAndEval ( const std::shared_ptr < abstraction::Value > &, Environment & ) const override { diff --git a/alib2cli/src/ast/statements/ResultFileStatement.h b/alib2cli/src/ast/statements/ResultFileStatement.h index b7c462f06ebd1574689b56023157275915da5063..8f5255a00cd006465de6a29552381ad167d2b6f9 100644 --- a/alib2cli/src/ast/statements/ResultFileStatement.h +++ b/alib2cli/src/ast/statements/ResultFileStatement.h @@ -22,7 +22,7 @@ public: std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::OutputFileRegistry::getAbstraction ( filetype, prev->getType ( ) ); - std::shared_ptr < abstraction::ValueHolder < std::string > > file = std::make_shared < abstraction::ValueHolder < std::string > > ( nullptr, m_file->eval ( environment ), true ); + std::shared_ptr < abstraction::ValueHolder < std::string > > file = std::make_shared < abstraction::ValueHolder < std::string > > ( m_file->eval ( environment ), true ); res->attachInput ( file, 0, false ); res->attachInput ( prev, 1, false ); return res->eval ( ); diff --git a/alib2cli/src/ast/statements/ResultVariableStatement.h b/alib2cli/src/ast/statements/ResultVariableStatement.h index 461662bd871225f1571c95ab6beab5314a7fa2c7..286799e99794e8d303a7831a47c9ac60cadb85a5 100644 --- a/alib2cli/src/ast/statements/ResultVariableStatement.h +++ b/alib2cli/src/ast/statements/ResultVariableStatement.h @@ -13,7 +13,7 @@ public: } std::shared_ptr < abstraction::Value > translateAndEval ( const std::shared_ptr < abstraction::Value > & prev, Environment & environment ) const override { - std::shared_ptr < abstraction::Value > res = prev->clone ( nullptr, abstraction::ParamQualifiers::ParamQualifierSet::NONE, false, false ); + std::shared_ptr < abstraction::Value > res = prev->clone ( abstraction::ParamQualifiers::ParamQualifierSet::NONE, false, false ); environment.setVariable ( m_name->eval ( environment ), res ); return res; } diff --git a/alib2cli/src/ast/statements/SingleStatement.cpp b/alib2cli/src/ast/statements/SingleStatement.cpp index 47d53413a4fde5988624b55df20683faf56668c8..a63dae472dbcb8fd03be1662d750731a6f334862 100644 --- a/alib2cli/src/ast/statements/SingleStatement.cpp +++ b/alib2cli/src/ast/statements/SingleStatement.cpp @@ -11,7 +11,9 @@ SingleStatement::SingleStatement ( std::unique_ptr < Arg > name, ext::vector < s std::shared_ptr < abstraction::Value > SingleStatement::translateAndEval ( const std::shared_ptr < abstraction::Value > & prev, Environment & environment ) const { ext::vector < std::shared_ptr < abstraction::Value > > params; for ( const std::shared_ptr < Statement > & param : m_params ) { - params.push_back ( param->translateAndEval ( prev, environment ) ); + std::shared_ptr < abstraction::Value > translatedParam = param->translateAndEval ( prev, environment ); + environment.holdTemporary ( translatedParam ); + params.push_back ( translatedParam ); } std::string name = m_name->eval ( environment ); @@ -24,7 +26,7 @@ std::shared_ptr < abstraction::Value > SingleStatement::translateAndEval ( const if ( m_category ) category = m_category->getCategory ( ); - return abstraction::EvalHelper::evalAlgorithm ( name, templateParams, params, m_moves, category ); + return abstraction::EvalHelper::evalAlgorithm ( environment, name, templateParams, params, m_moves, category ); } } /* namespace cli */ diff --git a/alib2cli/src/ast/statements/ValueStatement.h b/alib2cli/src/ast/statements/ValueStatement.h index 36361fbd14c3e040abbff06f4b3c54800a9356b9..a16508acece95d3efd6e01cc5d4a1678b7e7197d 100644 --- a/alib2cli/src/ast/statements/ValueStatement.h +++ b/alib2cli/src/ast/statements/ValueStatement.h @@ -14,7 +14,7 @@ public: } std::shared_ptr < abstraction::Value > translateAndEval ( const std::shared_ptr < abstraction::Value > &, Environment & environment ) const override { - return std::make_shared < abstraction::ValueHolder < std::string > > ( nullptr, m_arg->eval ( environment ), true ); + return std::make_shared < abstraction::ValueHolder < std::string > > ( m_arg->eval ( environment ), true ); } }; diff --git a/alib2cli/src/environment/Environment.h b/alib2cli/src/environment/Environment.h index 2f1aa555433aaf40805078647cd5cdba1431f0be..6ff6ecfa4dee2225a94fed912d8328d106ebe616 100644 --- a/alib2cli/src/environment/Environment.h +++ b/alib2cli/src/environment/Environment.h @@ -14,11 +14,13 @@ #include <ast/command/CommandResult.h> #include <lexer/CharSequence.h> +#include <abstraction/TemporariesHolder.h> + namespace cli { class Command; -class Environment { +class Environment : public abstraction::TemporariesHolder { ext::map < std::string, std::string > m_bindings; ext::map < std::string, std::shared_ptr < abstraction::Value > > m_variables; std::shared_ptr < abstraction::Value > m_result; @@ -102,7 +104,7 @@ public: template < class T > void setVariable ( std::string name, T value ) { - auto variable = std::make_shared < abstraction::ValueHolder < T > > ( nullptr, std::move ( value ), false ); + auto variable = std::make_shared < abstraction::ValueHolder < T > > ( std::move ( value ), false ); setVariableInt ( std::move ( name ), variable ); } diff --git a/alib2gui/src/Algorithm/Algorithm.cpp b/alib2gui/src/Algorithm/Algorithm.cpp index 2e688b75fc08bf22ae3e4052485a27f0592d57b3..8106a3e80c3874c3bf1cca4a5b7a7e7479c4609c 100644 --- a/alib2gui/src/Algorithm/Algorithm.cpp +++ b/alib2gui/src/Algorithm/Algorithm.cpp @@ -86,7 +86,9 @@ std::shared_ptr<abstraction::Value> Algorithm::execute(const std::vector<std::shared_ptr<abstraction::Value>>& params) const { std::vector<bool> moves(params.size(), false); ext::vector<std::shared_ptr<abstraction::Value>> extParams(params.begin(), params.end()); - return abstraction::EvalHelper::evalAlgorithm(this->fullName, + abstraction::TemporariesHolder environment; + + return abstraction::EvalHelper::evalAlgorithm(environment, this->fullName, {}, extParams, moves, diff --git a/alib2gui/src/Converter.cpp b/alib2gui/src/Converter.cpp index d8477a04f7d9dd1182a0f789347a4a6b38e21313..49cb11a852ed4f2d60afd2ae3c484a3268703c5d 100644 --- a/alib2gui/src/Converter.cpp +++ b/alib2gui/src/Converter.cpp @@ -37,8 +37,9 @@ namespace Converter { std::vector<bool> moves; moves.push_back(false); + abstraction::TemporariesHolder environment; - auto res = abstraction::EvalHelper::evalAlgorithm("convert::DotConverter", + auto res = abstraction::EvalHelper::evalAlgorithm(environment, "convert::DotConverter", {}, params, moves, @@ -98,7 +99,7 @@ namespace Converter { std::shared_ptr<abstraction::OperationAbstraction> automaton = abstraction::XmlRegistry::getXmlParserAbstraction( type); - auto tokensAbstraction = std::make_shared<abstraction::ValueHolder<ext::deque<sax::Token>>>(nullptr, std::move ( tokens ), true); + auto tokensAbstraction = std::make_shared<abstraction::ValueHolder<ext::deque<sax::Token>>>(std::move ( tokens ), true); automaton->attachInput(tokensAbstraction, 0, true); return automaton->eval ( ); } @@ -110,13 +111,15 @@ namespace Converter { std::shared_ptr<abstraction::Value> parseText(const QString& txt) { ext::vector<std::shared_ptr<abstraction::Value>> params; - params.push_back(std::make_shared<abstraction::ValueHolder<std::string>>(nullptr, txt.toStdString(), true)); + params.push_back(std::make_shared<abstraction::ValueHolder<std::string>>( txt.toStdString(), true)); std::vector<bool> moves; moves.push_back(true); + abstraction::TemporariesHolder environment; + for (const auto& type: { "automaton::Automaton", "grammar::Grammar", "regexp::RegExp"}) { try { - return abstraction::EvalHelper::evalAlgorithm("string::Parse", + return abstraction::EvalHelper::evalAlgorithm(environment, "string::Parse", {type}, params, moves, diff --git a/alib2gui/src/Utils.cpp b/alib2gui/src/Utils.cpp index 36c3ffa20d8c4a09a65e6a273b0f710c459438fe..b47b6d4da49bf2c82e6d1f83a64dc62570dbbe0d 100644 --- a/alib2gui/src/Utils.cpp +++ b/alib2gui/src/Utils.cpp @@ -14,14 +14,16 @@ namespace Utils std::shared_ptr<abstraction::Value> generateRandomAutomaton() { ext::vector<std::shared_ptr<abstraction::Value>> params; - params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>(nullptr, 5, true)); - params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>(nullptr, 3, true)); - params.push_back(std::make_shared<abstraction::ValueHolder<bool>>(nullptr, true, true)); - params.push_back(std::make_shared<abstraction::ValueHolder<double>>(nullptr, 10.0, true)); + params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>( 5, true)); + params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>( 3, true)); + params.push_back(std::make_shared<abstraction::ValueHolder<bool>>( true, true)); + params.push_back(std::make_shared<abstraction::ValueHolder<double>>( 10.0, true)); std::vector<bool> moves(params.size(), true); - return abstraction::EvalHelper::evalAlgorithm("automaton::generate::RandomAutomatonFactory", + + abstraction::TemporariesHolder environment; + return abstraction::EvalHelper::evalAlgorithm(environment, "automaton::generate::RandomAutomatonFactory", {}, params, moves, @@ -30,14 +32,15 @@ namespace Utils std::shared_ptr<abstraction::Value> generateRandomGrammar() { ext::vector<std::shared_ptr<abstraction::Value>> params; - params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>(nullptr, 5, true)); - params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>(nullptr, 3, true)); - params.push_back(std::make_shared<abstraction::ValueHolder<bool>>(nullptr, true, true)); - params.push_back(std::make_shared<abstraction::ValueHolder<double>>(nullptr, 30.0, true)); + params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>( 5, true)); + params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>( 3, true)); + params.push_back(std::make_shared<abstraction::ValueHolder<bool>>( true, true)); + params.push_back(std::make_shared<abstraction::ValueHolder<double>>( 30.0, true)); std::vector<bool> moves(params.size(), true); - return abstraction::EvalHelper::evalAlgorithm("grammar::generate::RandomGrammarFactory", + abstraction::TemporariesHolder environment; + return abstraction::EvalHelper::evalAlgorithm(environment, "grammar::generate::RandomGrammarFactory", {}, params, moves, diff --git a/alib2raw/src/abstraction/RawReaderAbstraction.hpp b/alib2raw/src/abstraction/RawReaderAbstraction.hpp index e34a2a2c8f4d05661a4e9520a1d9ca3ece590c2b..74ad14c73393202a509cd42b0c77ec522ef010fd 100644 --- a/alib2raw/src/abstraction/RawReaderAbstraction.hpp +++ b/alib2raw/src/abstraction/RawReaderAbstraction.hpp @@ -20,7 +20,7 @@ class RawReaderAbstraction : virtual public NaryOperationAbstraction < std::stri public: std::shared_ptr < abstraction::Value > run ( ) override { std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) ); - return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), factory::RawDataFactory::fromString ( abstraction::retrieveValue < std::string && > ( param.first, param.second ) ), true ); + return std::make_shared < abstraction::ValueHolder < ReturnType > > ( factory::RawDataFactory::fromString ( abstraction::retrieveValue < std::string && > ( param.first, param.second ) ), true ); } }; diff --git a/alib2raw/src/abstraction/RawWriterAbstraction.hpp b/alib2raw/src/abstraction/RawWriterAbstraction.hpp index fa27ede68c30293e0de0e469c6d90dda9d795565..5fba83baee255abcf491d814cb3fd6067ab19ca2 100644 --- a/alib2raw/src/abstraction/RawWriterAbstraction.hpp +++ b/alib2raw/src/abstraction/RawWriterAbstraction.hpp @@ -20,7 +20,7 @@ class RawWriterAbstraction : virtual public NaryOperationAbstraction < const Par public: std::shared_ptr < abstraction::Value > run ( ) override { std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) ); - return std::make_shared < abstraction::ValueHolder < std::string > > ( this->getProxyAbstraction ( ), factory::RawDataFactory::toString ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true ); + return std::make_shared < abstraction::ValueHolder < std::string > > ( factory::RawDataFactory::toString ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true ); } }; diff --git a/alib2str/src/abstraction/StringReaderAbstraction.hpp b/alib2str/src/abstraction/StringReaderAbstraction.hpp index 8d9152a99c4051fcbace04db855e50f986e4b642..942d2a1c14d1928f4c007d203fe0a3d6d912cf29 100644 --- a/alib2str/src/abstraction/StringReaderAbstraction.hpp +++ b/alib2str/src/abstraction/StringReaderAbstraction.hpp @@ -20,7 +20,7 @@ class StringReaderAbstraction : virtual public NaryOperationAbstraction < std::s public: std::shared_ptr < abstraction::Value > run ( ) override { std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) ); - return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), factory::StringDataFactory::fromString ( abstraction::retrieveValue < std::string && > ( param.first, param.second ) ), true ); + return std::make_shared < abstraction::ValueHolder < ReturnType > > ( factory::StringDataFactory::fromString ( abstraction::retrieveValue < std::string && > ( param.first, param.second ) ), true ); } }; diff --git a/alib2str/src/abstraction/StringWriterAbstraction.hpp b/alib2str/src/abstraction/StringWriterAbstraction.hpp index 5c1f7c1c78b98ec7254923b7a0848c0d4326023c..6769fe5baa56085984f40c75ff58fcad64b76866 100644 --- a/alib2str/src/abstraction/StringWriterAbstraction.hpp +++ b/alib2str/src/abstraction/StringWriterAbstraction.hpp @@ -20,7 +20,7 @@ class StringWriterAbstraction : virtual public NaryOperationAbstraction < const public: std::shared_ptr < abstraction::Value > run ( ) override { std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) ); - return std::make_shared < abstraction::ValueHolder < std::string > > ( this->getProxyAbstraction ( ), factory::StringDataFactory::toString ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true ); + return std::make_shared < abstraction::ValueHolder < std::string > > ( factory::StringDataFactory::toString ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true ); } }; diff --git a/alib2xml/src/abstraction/XmlComposerAbstraction.hpp b/alib2xml/src/abstraction/XmlComposerAbstraction.hpp index 641351e9832daedfad5c00c446184c48910cd184..4f8c478a77ff484f1924c8e15a5d66d8e40347b2 100644 --- a/alib2xml/src/abstraction/XmlComposerAbstraction.hpp +++ b/alib2xml/src/abstraction/XmlComposerAbstraction.hpp @@ -20,7 +20,7 @@ class XmlComposerAbstraction : virtual public NaryOperationAbstraction < const P public: std::shared_ptr < abstraction::Value > run ( ) override { std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) ); - return std::make_shared < abstraction::ValueHolder < ext::deque < sax::Token > > > ( this->getProxyAbstraction ( ), factory::XmlDataFactory::toTokens ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true ); + return std::make_shared < abstraction::ValueHolder < ext::deque < sax::Token > > > ( factory::XmlDataFactory::toTokens ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true ); } }; diff --git a/alib2xml/src/abstraction/XmlParserAbstraction.hpp b/alib2xml/src/abstraction/XmlParserAbstraction.hpp index 98c85dc0d132e7b32b2d7c42a92dc2c7b5a100ed..4e732229ce525815eed16ee3ea41180eb24214b0 100644 --- a/alib2xml/src/abstraction/XmlParserAbstraction.hpp +++ b/alib2xml/src/abstraction/XmlParserAbstraction.hpp @@ -20,7 +20,7 @@ class XmlParserAbstraction : virtual public NaryOperationAbstraction < ext::dequ public: std::shared_ptr < abstraction::Value > run ( ) override { std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) ); - return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), factory::XmlDataFactory::fromTokens ( abstraction::retrieveValue < ext::deque < sax::Token > && > ( param.first, param.second ) ), true ); + return std::make_shared < abstraction::ValueHolder < ReturnType > > ( factory::XmlDataFactory::fromTokens ( abstraction::retrieveValue < ext::deque < sax::Token > && > ( param.first, param.second ) ), true ); } }; diff --git a/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp b/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp index 0003fc3c9037755667e5fa8d8a84eee23cff0494..ddd01c9fd342837d93ec515bbc7d454b34df619d 100644 --- a/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp +++ b/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp @@ -21,7 +21,7 @@ public: std::pair < std::shared_ptr < abstraction::Value >, bool > & param2 = std::get < 0 > ( this->getParams ( ) ); std::pair < std::shared_ptr < abstraction::Value >, bool > & param1 = std::get < 1 > ( this->getParams ( ) ); sax::SaxComposeInterface::composeFile ( abstraction::retrieveValue < const std::string & > ( param1.first, param1.second ), abstraction::retrieveValue < const ext::deque < sax::Token > & > ( param2.first, param2.second ) ); - return std::make_shared < abstraction::Void > ( this->getProxyAbstraction ( ) ); + return std::make_shared < abstraction::Void > ( ); } }; diff --git a/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp b/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp index 75a1f5337197e9ec06cb17acaf8cc995bd0037af..027bbb81eb4ccc26ffd6dcf7ba7371ef55cdff90 100644 --- a/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp +++ b/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp @@ -19,7 +19,7 @@ class XmlTokensParserAbstraction : virtual public NaryOperationAbstraction < con public: std::shared_ptr < abstraction::Value > run ( ) override { std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) ); - return std::make_shared < abstraction::ValueHolder < ext::deque < sax::Token > > > ( this->getProxyAbstraction ( ), sax::SaxParseInterface::parseFile ( abstraction::retrieveValue < const std::string & > ( param.first, param.second ) ), true ); + return std::make_shared < abstraction::ValueHolder < ext::deque < sax::Token > > > ( sax::SaxParseInterface::parseFile ( abstraction::retrieveValue < const std::string & > ( param.first, param.second ) ), true ); } };