From 6abd71410bad53d20a7b7938f02de5b8fc1be555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tr=C3=A1vn=C3=AD=C4=8Dek?= <jan.travnicek@fit.cvut.cz> Date: Mon, 21 Feb 2022 06:29:29 +0100 Subject: [PATCH] abstraction: reduce some use of shared_ptrs --- alib2abstraction/src/abstraction/PackingAbstraction.cpp | 2 +- alib2abstraction/src/abstraction/PackingAbstraction.hpp | 2 +- alib2abstraction/src/abstraction/Value.cpp | 8 ++++---- alib2abstraction/src/abstraction/Value.hpp | 8 ++++---- alib2abstraction/src/abstraction/ValueHolder.hpp | 7 ++----- 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/alib2abstraction/src/abstraction/PackingAbstraction.cpp b/alib2abstraction/src/abstraction/PackingAbstraction.cpp index 7ae1427be0..7a83d4d881 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 8b6a11c5c4..0f13e4c97e 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 0edf1bedd5..620fe05dab 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 3a1594d7fc..aac9d612d6 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 e95a02e139..ff20d79997 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: -- GitLab