From c3c363d09ff2c57f40cf2d3266bffb7950c4767c 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: Tue, 22 Feb 2022 09:07:56 +0100
Subject: [PATCH] abstraction: use unique_ptr only to manipulate
 operation::Abstraction

---
 alib2abstraction/src/common/CastHelper.cpp         | 5 +++--
 alib2abstraction/src/common/EvalHelper.cpp         | 4 ++--
 alib2abstraction/src/common/EvalHelper.h           | 2 +-
 alib2cli/src/ast/command/PrintCommand.cpp          | 2 +-
 alib2cli/src/ast/statements/ContainerStatement.cpp | 2 +-
 alib2cli/src/ast/statements/FileStatement.cpp      | 2 +-
 alib2cli/src/ast/statements/ResultFileStatement.h  | 2 +-
 alib2gui/src/Converter.cpp                         | 2 +-
 8 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/alib2abstraction/src/common/CastHelper.cpp b/alib2abstraction/src/common/CastHelper.cpp
index 997f4a4ac0..2b7a87c058 100644
--- a/alib2abstraction/src/common/CastHelper.cpp
+++ b/alib2abstraction/src/common/CastHelper.cpp
@@ -10,7 +10,8 @@ std::shared_ptr < abstraction::Value > CastHelper::eval ( abstraction::Temporari
 		return param;
 	}
 
-	std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getCastAbstraction ( type, param->getType ( ) );
+	std::unique_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getCastAbstraction ( type, param->getType ( ) );
+
 	res->attachInput ( param, 0 );
 
 	std::shared_ptr < abstraction::Value > result = res->eval ( );
@@ -18,7 +19,7 @@ std::shared_ptr < abstraction::Value > CastHelper::eval ( abstraction::Temporari
 		throw std::invalid_argument ( "Eval of cast to " + type + " failed." );
 
 	if ( abstraction::Registry::hasNormalize ( result->getType ( ) ) ) {
-		std::shared_ptr < abstraction::OperationAbstraction > normalize = abstraction::Registry::getNormalizeAbstraction ( result->getType ( ) );
+		std::unique_ptr < abstraction::OperationAbstraction > normalize = abstraction::Registry::getNormalizeAbstraction ( result->getType ( ) );
 		normalize->attachInput ( result, 0 );
 		result = normalize->eval ( );
 		if ( ! result )
diff --git a/alib2abstraction/src/common/EvalHelper.cpp b/alib2abstraction/src/common/EvalHelper.cpp
index b64517d993..f12b2ff2e9 100644
--- a/alib2abstraction/src/common/EvalHelper.cpp
+++ b/alib2abstraction/src/common/EvalHelper.cpp
@@ -66,7 +66,7 @@ std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( abstraction::T
 	}
 }
 
-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 ) {
+std::shared_ptr < abstraction::Value > EvalHelper::evalAbstraction ( abstraction::TemporariesHolder & environment, std::unique_ptr < abstraction::OperationAbstraction > abstraction, const ext::vector < std::shared_ptr < abstraction::Value > > & params ) {
 	unsigned i = 0;
 	ext::vector < std::shared_ptr < abstraction::Value > > casted_params;
 	for ( const std::shared_ptr < abstraction::Value > & param : params ) {
@@ -90,7 +90,7 @@ std::shared_ptr < abstraction::Value > EvalHelper::evalAbstraction ( abstraction
 		throw std::invalid_argument ( "Internal error in abstraction evaluation." );
 
 	if ( abstraction::Registry::hasNormalize ( result->getType ( ) ) ) {
-		std::shared_ptr < abstraction::OperationAbstraction > normalize = abstraction::Registry::getNormalizeAbstraction ( result->getType ( ) );
+		std::unique_ptr < abstraction::OperationAbstraction > normalize = abstraction::Registry::getNormalizeAbstraction ( result->getType ( ) );
 		normalize->attachInput ( result, 0 );
 		result = normalize->eval ( );
 		if ( ! result )
diff --git a/alib2abstraction/src/common/EvalHelper.h b/alib2abstraction/src/common/EvalHelper.h
index aaffe52d30..1718686e30 100644
--- a/alib2abstraction/src/common/EvalHelper.h
+++ b/alib2abstraction/src/common/EvalHelper.h
@@ -11,7 +11,7 @@
 namespace abstraction {
 
 class EvalHelper {
-	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 );
+	static std::shared_ptr < abstraction::Value > evalAbstraction ( abstraction::TemporariesHolder & environment, std::unique_ptr < abstraction::OperationAbstraction > abstraction, const ext::vector < std::shared_ptr < abstraction::Value > > & params );
 
 public:
 	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, abstraction::AlgorithmCategories::AlgorithmCategory category );
diff --git a/alib2cli/src/ast/command/PrintCommand.cpp b/alib2cli/src/ast/command/PrintCommand.cpp
index 0e88a5c291..ec8bff0176 100644
--- a/alib2cli/src/ast/command/PrintCommand.cpp
+++ b/alib2cli/src/ast/command/PrintCommand.cpp
@@ -11,7 +11,7 @@ CommandResult PrintCommand::run ( Environment & environment ) const {
 	if ( value->getType ( ) == ext::to_string < void > ( ) )
 		throw std::invalid_argument ( "Printing void is not allowed." );
 
-	std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( value->getType ( ) );
+	std::unique_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( value->getType ( ) );
 
 	res->attachInput ( value, 0 );
 	res->attachInput ( std::make_shared < abstraction::ValueHolder < ext::ostream & > > ( common::Streams::out, false ), 1 );
diff --git a/alib2cli/src/ast/statements/ContainerStatement.cpp b/alib2cli/src/ast/statements/ContainerStatement.cpp
index e5baff0878..404464dad9 100644
--- a/alib2cli/src/ast/statements/ContainerStatement.cpp
+++ b/alib2cli/src/ast/statements/ContainerStatement.cpp
@@ -19,7 +19,7 @@ std::shared_ptr < abstraction::Value > ContainerStatement::translateAndEval ( co
 		params.push_back ( param->translateAndEval ( prev, environment ) );
 	}
 
-	std::shared_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getContainerAbstraction ( m_container, m_type->getType ( ) );
+	std::unique_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getContainerAbstraction ( m_container, m_type->getType ( ) );
 
 	int i = 0;
 	ext::vector < std::shared_ptr < abstraction::Value > > casted_params;
diff --git a/alib2cli/src/ast/statements/FileStatement.cpp b/alib2cli/src/ast/statements/FileStatement.cpp
index 49fbfeddfb..b4935322ba 100644
--- a/alib2cli/src/ast/statements/FileStatement.cpp
+++ b/alib2cli/src/ast/statements/FileStatement.cpp
@@ -24,7 +24,7 @@ std::shared_ptr < abstraction::Value > FileStatement::translateAndEval ( const s
 		templateParams.push_back ( param->eval ( environment ) );
 	}
 
-	std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::InputFileRegistry::getAbstraction ( filetype, type, templateParams );
+	std::unique_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 > > ( m_file->eval ( environment ), true );
 	res->attachInput ( file, 0 );
diff --git a/alib2cli/src/ast/statements/ResultFileStatement.h b/alib2cli/src/ast/statements/ResultFileStatement.h
index 9e7d4e013d..e0dcae08a9 100644
--- a/alib2cli/src/ast/statements/ResultFileStatement.h
+++ b/alib2cli/src/ast/statements/ResultFileStatement.h
@@ -19,7 +19,7 @@ public:
 		if ( m_fileType )
 			filetype = m_fileType->eval ( environment );
 
-		std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::OutputFileRegistry::getAbstraction ( filetype, prev->getType ( ) );
+		std::unique_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 > > ( m_file->eval ( environment ), true );
 		res->attachInput ( file, 0 );
diff --git a/alib2gui/src/Converter.cpp b/alib2gui/src/Converter.cpp
index e57f24386e..71acaa5ea7 100644
--- a/alib2gui/src/Converter.cpp
+++ b/alib2gui/src/Converter.cpp
@@ -93,7 +93,7 @@ namespace Converter {
             ext::deque<sax::Token> tokens;
             sax::SaxParseInterface::parseMemory(xml.toStdString(), tokens);
             std::string type = tokens[0].getData();
-            std::shared_ptr<abstraction::OperationAbstraction> automaton = abstraction::XmlRegistry::getXmlParserAbstraction(
+            std::unique_ptr<abstraction::OperationAbstraction> automaton = abstraction::XmlRegistry::getXmlParserAbstraction(
                     type);
 
             auto tokensAbstraction = std::make_shared<abstraction::ValueHolder<ext::deque<sax::Token>>>(std::move ( tokens ), true);
-- 
GitLab