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