diff --git a/alib2abstraction/src/abstraction/PackingAbstraction.cpp b/alib2abstraction/src/abstraction/PackingAbstraction.cpp index 7ae1427be0424ee8abb84417218968c414d8f1b9..7a83d4d881922e9b236dc3ddb8afd455c27ca8d4 100644 --- a/alib2abstraction/src/abstraction/PackingAbstraction.cpp +++ b/alib2abstraction/src/abstraction/PackingAbstraction.cpp @@ -8,7 +8,7 @@ namespace abstraction { PackingAbstractionImpl::LazyValue::LazyValue ( std::unique_ptr < abstraction::OperationAbstraction > ref ) : m_lifeReference ( std::move ( ref ) ) { } -std::shared_ptr < abstraction::Value > PackingAbstractionImpl::LazyValue::asValue ( bool, bool ) { +std::unique_ptr < abstraction::Value > PackingAbstractionImpl::LazyValue::asValue ( bool, bool ) { throw std::domain_error ( "Feature not available on lazy value" ); } diff --git a/alib2abstraction/src/abstraction/PackingAbstraction.hpp b/alib2abstraction/src/abstraction/PackingAbstraction.hpp index 8b6a11c5c4cfb01674c7becee622bec06aff240a..0f13e4c97e3afed7de109ffb9a85f0931e667bd7 100644 --- a/alib2abstraction/src/abstraction/PackingAbstraction.hpp +++ b/alib2abstraction/src/abstraction/PackingAbstraction.hpp @@ -17,7 +17,7 @@ protected: public: explicit LazyValue ( std::unique_ptr < abstraction::OperationAbstraction > ref ); - std::shared_ptr < abstraction::Value > asValue ( bool move, bool isTemporary ) override; + std::unique_ptr < abstraction::Value > asValue ( bool move, bool isTemporary ) override; ext::type_index getTypeIndex ( ) const override; diff --git a/alib2abstraction/src/abstraction/Value.cpp b/alib2abstraction/src/abstraction/Value.cpp index 0edf1bedd5ca3308af17e0777ab381640f462d8b..620fe05dab6d14aa4d845b1a8f852f9d627e0102 100644 --- a/alib2abstraction/src/abstraction/Value.cpp +++ b/alib2abstraction/src/abstraction/Value.cpp @@ -11,20 +11,20 @@ std::string Value::getType ( ) const { return ext::to_string ( getTypeIndex ( ) ); } -std::shared_ptr < abstraction::Value > Value::clone ( abstraction::TypeQualifiers::TypeQualifierSet typeQualifiers, bool isTemporary ) { +std::unique_ptr < abstraction::Value > Value::clone ( abstraction::TypeQualifiers::TypeQualifierSet typeQualifiers, bool isTemporary ) { if ( TypeQualifiers::isRef ( typeQualifiers ) ) { if ( TypeQualifiers::isConst ( this->getTypeQualifiers ( ) ) && ! TypeQualifiers::isConst ( typeQualifiers ) ) throw std::domain_error ( "Cannot bind const value to non-const reference." ); if ( ! this->isTemporary ( ) && isTemporary ) throw std::domain_error ( "Cannot bind without move." ); - return std::make_shared < abstraction::ValueReference > ( this->getProxyAbstraction ( ), typeQualifiers, isTemporary ); + return std::make_unique < abstraction::ValueReference > ( this->getProxyAbstraction ( ), typeQualifiers, isTemporary ); } else { return this->asValue ( this->isTemporary ( ), isTemporary ); } } -std::shared_ptr < abstraction::Value > ValueReference::asValue ( bool move, bool isTemporary ) { +std::unique_ptr < abstraction::Value > ValueReference::asValue ( bool move, bool isTemporary ) { return getProxyAbstraction ( )->asValue ( move, isTemporary ); } @@ -56,7 +56,7 @@ bool ValueReference::isTemporary ( ) const { } -std::shared_ptr < abstraction::Value > Void::asValue ( bool, bool ) { +std::unique_ptr < abstraction::Value > Void::asValue ( bool, bool ) { throw std::domain_error ( "Void variables are not allowed" ); } diff --git a/alib2abstraction/src/abstraction/Value.hpp b/alib2abstraction/src/abstraction/Value.hpp index 3a1594d7fce5f7a4fb7896f2050b4dc97195397e..aac9d612d6ccdf5b6b230f6e1d6c3d8b8a07ac9d 100644 --- a/alib2abstraction/src/abstraction/Value.hpp +++ b/alib2abstraction/src/abstraction/Value.hpp @@ -13,12 +13,12 @@ class ValueReference; class Value : public std::enable_shared_from_this < Value > { protected: - virtual std::shared_ptr < abstraction::Value > asValue ( bool move, bool isTemporary ) = 0; + virtual std::unique_ptr < abstraction::Value > asValue ( bool move, bool isTemporary ) = 0; public: virtual ~Value ( ) noexcept = default; - std::shared_ptr < abstraction::Value > clone ( abstraction::TypeQualifiers::TypeQualifierSet typeQualifiers, bool isTemporary ); + std::unique_ptr < abstraction::Value > clone ( abstraction::TypeQualifiers::TypeQualifierSet typeQualifiers, bool isTemporary ); virtual std::shared_ptr < abstraction::Value > getProxyAbstraction ( ); @@ -39,7 +39,7 @@ class ValueReference : public Value { abstraction::TypeQualifiers::TypeQualifierSet m_typeQualifiers; bool m_isTemporary; - std::shared_ptr < abstraction::Value > asValue ( bool move, bool isTemporary ) override; + std::unique_ptr < abstraction::Value > asValue ( bool move, bool isTemporary ) override; public: ValueReference ( const std::shared_ptr < abstraction::Value > & value, abstraction::TypeQualifiers::TypeQualifierSet typeQualifiers, bool isTemporary ); @@ -55,7 +55,7 @@ public: class Void : public Value { public: - std::shared_ptr < abstraction::Value > asValue ( bool move, bool isTemporary ) override; + std::unique_ptr < abstraction::Value > asValue ( bool move, bool isTemporary ) override; ext::type_index getTypeIndex ( ) const override; diff --git a/alib2abstraction/src/abstraction/ValueHolder.hpp b/alib2abstraction/src/abstraction/ValueHolder.hpp index e95a02e1398e5c10648a76a6af7bd185225d2d9e..ff20d79997a5aec4f90eddb80ae65b4ed7179d21 100644 --- a/alib2abstraction/src/abstraction/ValueHolder.hpp +++ b/alib2abstraction/src/abstraction/ValueHolder.hpp @@ -57,16 +57,13 @@ class ValueHolder : public std::conditional_t < std::is_reference_v < Type >, Re return m_isTemporary; } - std::shared_ptr < abstraction::Value > asValue ( bool move, bool temporary ) override { - ( void ) move; - ( void ) temporary; - + std::unique_ptr < abstraction::Value > asValue ( bool move, bool temporary ) override { 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 - return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > > > ( retrieveValue < std::decay_t < Type > > ( this->shared_from_this ( ), move ), temporary ); + return std::make_unique < abstraction::ValueHolder < std::decay_t < Type > > > ( retrieveValue < std::decay_t < Type > > ( this->shared_from_this ( ), move ), temporary ); } public: