From f35507a3531ca904c6a7a471f553c6cf95b37825 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 8 Feb 2019 10:46:35 +0100
Subject: [PATCH] workout passing parameter qualifiers to overload resolution
 algo

---
 .../AnyaryOperationAbstraction.hpp            |  4 +++
 .../abstraction/NaryOperationAbstraction.hpp  |  4 +++
 .../src/abstraction/OperationAbstraction.hpp  |  7 +++++
 .../src/abstraction/PackingAbstraction.hpp    |  8 +++++
 .../abstraction/ValueOperationAbstraction.hpp | 29 +++++++++++++++++++
 .../src/abstraction/WrapperAbstraction.hpp    | 15 ++++++++++
 .../src/common/AbstractionHelpers.hpp         | 13 ++++++++-
 .../src/common/AlgorithmHelper.cpp            |  7 +++--
 .../src/registry/AlgorithmRegistry.cpp        |  2 +-
 .../src/registry/AlgorithmRegistry.hpp        |  2 +-
 alib2abstraction/src/registry/Registry.cpp    |  4 +--
 alib2abstraction/src/registry/Registry.h      |  2 +-
 .../InputFileTypeRegistration.cpp             |  3 +-
 .../OutputFileTypeRegistration.cpp            |  3 +-
 .../src/InputFileTypeRegistration.cpp         |  3 +-
 .../src/OutputFileTypeRegistration.cpp        |  3 +-
 .../src/InputFileTypeRegistration.cpp         |  3 +-
 .../src/OutputFileTypeRegistration.cpp        |  3 +-
 18 files changed, 101 insertions(+), 14 deletions(-)

diff --git a/alib2abstraction/src/abstraction/AnyaryOperationAbstraction.hpp b/alib2abstraction/src/abstraction/AnyaryOperationAbstraction.hpp
index 7bed05b845..f1208513aa 100644
--- a/alib2abstraction/src/abstraction/AnyaryOperationAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/AnyaryOperationAbstraction.hpp
@@ -81,6 +81,10 @@ public:
 		return ext::type_index ( typeid ( ParamType ) );
 	}
 
+	virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getParamTypeQualifiers ( unsigned ) const override {
+		return abstraction::ParamQualifiers::paramQualifiers < ParamType > ( );
+	}
+
 };
 
 } /* namespace abstraction */
diff --git a/alib2abstraction/src/abstraction/NaryOperationAbstraction.hpp b/alib2abstraction/src/abstraction/NaryOperationAbstraction.hpp
index 5df783dbae..38262a329d 100644
--- a/alib2abstraction/src/abstraction/NaryOperationAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/NaryOperationAbstraction.hpp
@@ -88,6 +88,10 @@ public:
 		return abstraction::ParamType < ParamTypes ... >::paramType ( index );
 	}
 
+	virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getParamTypeQualifiers ( unsigned index ) const override {
+		return abstraction::ParamType < ParamTypes ... >::paramTypeQualifiers ( index );
+	}
+
 };
 
 } /* namespace abstraction */
diff --git a/alib2abstraction/src/abstraction/OperationAbstraction.hpp b/alib2abstraction/src/abstraction/OperationAbstraction.hpp
index 491a4ae263..9ab0e32e48 100644
--- a/alib2abstraction/src/abstraction/OperationAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/OperationAbstraction.hpp
@@ -11,6 +11,9 @@
 #include <alib/memory>
 #include <alib/string>
 #include <alib/typeindex>
+#include <alib/set>
+
+#include <common/ParamQualifiers.hpp>
 
 namespace abstraction {
 
@@ -38,10 +41,14 @@ public:
 		return ext::to_string ( getParamTypeIndex ( index ) );
 	}
 
+	virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getParamTypeQualifiers ( unsigned index ) const = 0;
+
 	std::string getReturnType ( ) const {
 		return ext::to_string ( getReturnTypeIndex ( ) );
 	}
 
+	virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const = 0;
+
 	virtual std::shared_ptr < abstraction::OperationAbstraction > getProxyAbstraction ( ) {
 		return shared_from_this();
 	}
diff --git a/alib2abstraction/src/abstraction/PackingAbstraction.hpp b/alib2abstraction/src/abstraction/PackingAbstraction.hpp
index 37abbd7a2b..0a481c28d3 100644
--- a/alib2abstraction/src/abstraction/PackingAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/PackingAbstraction.hpp
@@ -105,10 +105,18 @@ public:
 		return m_abstractions [ m_connections.at ( index ) [ 0 ].targetId ]->getParamTypeIndex ( m_connections.at ( index ) [ 0 ].paramPosition );
 	}
 
+	virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getParamTypeQualifiers ( unsigned index ) const override {
+		return m_abstractions [ m_connections.at ( index ) [ 0 ].targetId ]->getParamTypeQualifiers ( m_connections.at ( index ) [ 0 ].paramPosition );
+	}
+
 	virtual ext::type_index getReturnTypeIndex ( ) const override {
 		return m_abstractions [ m_resultId ]->getReturnTypeIndex ( );
 	}
 
+	virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
+		return m_abstractions [ m_resultId ]->getReturnTypeQualifiers ( );
+	}
+
 	virtual std::shared_ptr < abstraction::OperationAbstraction > getProxyAbstraction ( ) override {
 		return m_abstractions [ m_resultId ]->getProxyAbstraction ( );
 	}
diff --git a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp
index 2eac4cb455..af752aab1f 100644
--- a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp
@@ -15,6 +15,7 @@
 #include <abstraction/OperationAbstraction.hpp>
 #include <abstraction/ValueProvider.hpp>
 
+#include <common/ParamQualifiers.hpp>
 #include <common/AbstractionHelpers.hpp>
 
 namespace abstraction {
@@ -58,6 +59,10 @@ public:
 		return ext::type_index ( typeid ( ReturnType ) );
 	}
 
+	ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
+		return abstraction::ParamQualifiers::paramQualifiers < ReturnType > ( );
+	}
+
 	virtual bool cached ( ) const override {
 		return ( bool ) m_data;
 	}
@@ -103,6 +108,10 @@ public:
 		return ext::type_index ( typeid ( ReturnType ) );
 	}
 
+	ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
+		return abstraction::ParamQualifiers::paramQualifiers < const ReturnType > ( );
+	}
+
 	virtual bool cached ( ) const override {
 		return ( bool ) m_data;
 	}
@@ -148,6 +157,10 @@ public:
 		return ext::type_index ( typeid ( ReturnType ) );
 	}
 
+	ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
+		return abstraction::ParamQualifiers::paramQualifiers < ReturnType & > ( );
+	}
+
 	virtual bool cached ( ) const override {
 		return ( bool ) m_data;
 	}
@@ -193,6 +206,10 @@ public:
 		return ext::type_index ( typeid ( ReturnType ) );
 	}
 
+	ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
+		return abstraction::ParamQualifiers::paramQualifiers < const ReturnType & > ( );
+	}
+
 	virtual bool cached ( ) const override {
 		return ( bool ) m_data;
 	}
@@ -240,6 +257,10 @@ public:
 		return ext::type_index ( typeid ( ReturnType ) );
 	}
 
+	ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
+		return abstraction::ParamQualifiers::paramQualifiers < ReturnType && > ( );
+	}
+
 	virtual bool cached ( ) const override {
 		return ( bool ) m_data;
 	}
@@ -287,6 +308,10 @@ public:
 		return ext::type_index ( typeid ( ReturnType ) );
 	}
 
+	ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
+		return abstraction::ParamQualifiers::paramQualifiers < const ReturnType && > ( );
+	}
+
 	virtual bool cached ( ) const override {
 		return ( bool ) m_data;
 	}
@@ -308,6 +333,10 @@ public:
 		return ext::type_index ( typeid ( void ) );
 	}
 
+	ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
+		return abstraction::ParamQualifiers::paramQualifiers < void > ( );
+	}
+
 	virtual bool cached ( ) const override {
 		return false;
 	}
diff --git a/alib2abstraction/src/abstraction/WrapperAbstraction.hpp b/alib2abstraction/src/abstraction/WrapperAbstraction.hpp
index 0b2fc58e7c..f48c4a38ad 100644
--- a/alib2abstraction/src/abstraction/WrapperAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/WrapperAbstraction.hpp
@@ -96,6 +96,10 @@ public:
 		return ParamType < ParamTypes ... >::paramType ( index );
 	}
 
+	virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getParamTypeQualifiers ( unsigned index ) const override {
+		return ParamType < ParamTypes ... >::paramTypeQualifiers ( index );
+	}
+
 	virtual std::shared_ptr < abstraction::OperationAbstraction > getProxyAbstraction ( ) override {
 		if ( this->cached ( ) )
 			return this->m_abstraction->getProxyAbstraction ( );
@@ -133,6 +137,10 @@ public:
 		return ext::type_index ( typeid ( ReturnType ) );
 	}
 
+	virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
+		return abstraction::ParamQualifiers::paramQualifiers < ReturnType > ( );
+	}
+
 };
 
 template < class ... ParamTypes >
@@ -156,6 +164,13 @@ public:
 			throw std::domain_error ( "Return type unknown before evaluation." );
 	}
 
+	virtual ext::set < abstraction::ParamQualifiers::ParamQualifier > getReturnTypeQualifiers ( ) const override {
+		if ( this->cached ( ) )
+			return this->m_abstraction->getProxyAbstraction ( )->getReturnTypeQualifiers ( );
+		else
+			throw std::domain_error ( "Return type qualifiers unknown before evaluation." );
+	}
+
 };
 
 } /* namespace abstraction */
diff --git a/alib2abstraction/src/common/AbstractionHelpers.hpp b/alib2abstraction/src/common/AbstractionHelpers.hpp
index 25ce77edbf..15a7660123 100644
--- a/alib2abstraction/src/common/AbstractionHelpers.hpp
+++ b/alib2abstraction/src/common/AbstractionHelpers.hpp
@@ -62,6 +62,10 @@ struct ParamType < > {
 	static ext::type_index paramType ( unsigned ) {
 		throw std::logic_error ( "Out of types to check" );
 	}
+
+	static ext::set < abstraction::ParamQualifiers::ParamQualifier > paramTypeQualifiers ( unsigned ) {
+		throw std::logic_error ( "Out of types to check" );
+	}
 };
 
 template < class Param, class ... Params >
@@ -70,7 +74,14 @@ struct ParamType < Param, Params ... > {
 		if ( index == 0 )
 			return ext::type_index ( typeid ( Param ) );
 		else
-			return ParamType < Params ... >::paramType ( index - 1);
+			return ParamType < Params ... >::paramType ( index - 1 );
+	}
+
+	static ext::set < abstraction::ParamQualifiers::ParamQualifier > paramTypeQualifiers ( unsigned index ) {
+		if ( index == 0 )
+			return abstraction::ParamQualifiers::paramQualifiers < Param > ( );
+		else
+			return ParamType < Params ... >::paramTypeQualifiers ( index - 1 );
 	}
 };
 
diff --git a/alib2abstraction/src/common/AlgorithmHelper.cpp b/alib2abstraction/src/common/AlgorithmHelper.cpp
index 053452984f..c0d5bc45a9 100644
--- a/alib2abstraction/src/common/AlgorithmHelper.cpp
+++ b/alib2abstraction/src/common/AlgorithmHelper.cpp
@@ -14,10 +14,13 @@ namespace abstraction {
 
 std::shared_ptr < abstraction::OperationAbstraction > AlgorithmHelper::eval ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > & params, std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ) {
 	ext::vector < std::string > paramTypes;
-	for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : params )
+	ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers;
+	for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : params ) {
 		paramTypes.push_back ( param->getReturnType ( ) );
+		paramTypeQualifiers.push_back ( param->getReturnTypeQualifiers ( ) );
+	}
 
-	std::shared_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getAlgorithmAbstraction ( name, templateParams, paramTypes, category );
+	std::shared_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getAlgorithmAbstraction ( name, templateParams, paramTypes, paramTypeQualifiers, category );
 
 	unsigned i = 0;
 	ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > casted_params;
diff --git a/alib2abstraction/src/registry/AlgorithmRegistry.cpp b/alib2abstraction/src/registry/AlgorithmRegistry.cpp
index 983d80facf..6b2c3b6a97 100644
--- a/alib2abstraction/src/registry/AlgorithmRegistry.cpp
+++ b/alib2abstraction/src/registry/AlgorithmRegistry.cpp
@@ -86,7 +86,7 @@ ext::map < ext::pair < std::string, ext::vector < std::string > >, ext::list < s
 	return group;
 }
 
-std::shared_ptr < abstraction::OperationAbstraction > AlgorithmRegistry::getAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, AlgorithmCategories::AlgorithmCategory ) {
+std::shared_ptr < abstraction::OperationAbstraction > AlgorithmRegistry::getAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, const ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > &, AlgorithmCategories::AlgorithmCategory ) {
 	auto group = findAbstractionGroup ( name, templateParams );
 
 	auto incompatibleLambda = [ ] ( MatchType compatibility ) {
diff --git a/alib2abstraction/src/registry/AlgorithmRegistry.hpp b/alib2abstraction/src/registry/AlgorithmRegistry.hpp
index bb704e65e7..627833a726 100644
--- a/alib2abstraction/src/registry/AlgorithmRegistry.hpp
+++ b/alib2abstraction/src/registry/AlgorithmRegistry.hpp
@@ -302,7 +302,7 @@ public:
 		registerInternal ( std::move ( algorithm ), std::move ( templateParams ), std::make_shared < WrapperImpl < ReturnType, ParamTypes ... > > ( category, std::move ( params ), std::move ( parameterNames ), std::move ( result ), callback ) );
 	}
 
-	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, AlgorithmCategories::AlgorithmCategory category );
+	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, const ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > & paramQualifiers, AlgorithmCategories::AlgorithmCategory category );
 
 	static ext::set < ext::pair < std::string, ext::vector < std::string > > > listGroup ( const std::string & group );
 
diff --git a/alib2abstraction/src/registry/Registry.cpp b/alib2abstraction/src/registry/Registry.cpp
index 7bc204e2f5..7dcd2032c8 100644
--- a/alib2abstraction/src/registry/Registry.cpp
+++ b/alib2abstraction/src/registry/Registry.cpp
@@ -44,8 +44,8 @@ std::shared_ptr < abstraction::OperationAbstraction > Registry::getContainerAbst
 	return ContainerRegistry::getAbstraction ( container, type );
 }
 
-std::shared_ptr < abstraction::OperationAbstraction > Registry::getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, AlgorithmCategories::AlgorithmCategory category ) {
-	return AlgorithmRegistry::getAbstraction ( name, templateParams, paramTypes, category );
+std::shared_ptr < abstraction::OperationAbstraction > Registry::getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, const ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > & paramQualifiers, AlgorithmCategories::AlgorithmCategory category ) {
+	return AlgorithmRegistry::getAbstraction ( name, templateParams, paramTypes, paramQualifiers, category );
 }
 
 std::shared_ptr < abstraction::OperationAbstraction > Registry::getCastAbstraction ( const std::string & target, const std::string & param ) {
diff --git a/alib2abstraction/src/registry/Registry.h b/alib2abstraction/src/registry/Registry.h
index b759517436..12f08c5280 100644
--- a/alib2abstraction/src/registry/Registry.h
+++ b/alib2abstraction/src/registry/Registry.h
@@ -29,7 +29,7 @@ public:
 	static ext::set < ext::tuple < AlgorithmCategories::AlgorithmCategory, ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > >, ext::vector < std::string >, std::string > > listOverloads ( const std::string & algorithm, const ext::vector < std::string > & templateParams );
 
 	static std::shared_ptr < abstraction::OperationAbstraction > getContainerAbstraction ( const std::string & container, const std::string & type );
-	static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, AlgorithmCategories::AlgorithmCategory );
+	static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::string > & paramTypes, const ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > & paramQualifiers, AlgorithmCategories::AlgorithmCategory );
 	static std::shared_ptr < abstraction::OperationAbstraction > getCastAbstraction ( const std::string & target, const std::string & param );
 	static bool isCastNoOp ( const std::string & target, const std::string & param );
 	static std::shared_ptr < abstraction::OperationAbstraction > getImmediateAbstraction ( const std::string & result, std::string value );
diff --git a/alib2cli/src/registration/InputFileTypeRegistration.cpp b/alib2cli/src/registration/InputFileTypeRegistration.cpp
index 26af7813f7..01fe22bec6 100644
--- a/alib2cli/src/registration/InputFileTypeRegistration.cpp
+++ b/alib2cli/src/registration/InputFileTypeRegistration.cpp
@@ -51,8 +51,9 @@ namespace {
 		ext::vector < std::string > templateParams;
 		ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ) };
 		abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
+		ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
-		return abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category );
+		return abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, paramTypeQualifiers, category );
 	}
 
 auto xmlInputFileHandler = registration::InputFileRegister ( "xml", dummy );
diff --git a/alib2cli/src/registration/OutputFileTypeRegistration.cpp b/alib2cli/src/registration/OutputFileTypeRegistration.cpp
index 50277ab395..56eb9d6666 100644
--- a/alib2cli/src/registration/OutputFileTypeRegistration.cpp
+++ b/alib2cli/src/registration/OutputFileTypeRegistration.cpp
@@ -31,8 +31,9 @@ namespace {
 		ext::vector < std::string > templateParams;
 		ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ), ext::to_string < std::string > ( ) };
 		abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
+		ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ), abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
-		return abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category );
+		return abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, paramTypeQualifiers, category );
 	}
 
 auto xmlOutputFileHandler = registration::OutputFileRegister ( "xml", dummy );
diff --git a/alib2raw_cli_integration/src/InputFileTypeRegistration.cpp b/alib2raw_cli_integration/src/InputFileTypeRegistration.cpp
index cefbbc483b..cbd4faf4c9 100644
--- a/alib2raw_cli_integration/src/InputFileTypeRegistration.cpp
+++ b/alib2raw_cli_integration/src/InputFileTypeRegistration.cpp
@@ -15,8 +15,9 @@ namespace {
 		ext::vector < std::string > templateParams;
 		ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ) };
 		abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
+		ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
-		abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category ) );
+		abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, paramTypeQualifiers, category ) );
 
 		auto rawParserAbstractionFinder = [ = ] ( const std::string & ) {
 			return abstraction::RawReaderRegistry::getAbstraction ( typehint );
diff --git a/alib2raw_cli_integration/src/OutputFileTypeRegistration.cpp b/alib2raw_cli_integration/src/OutputFileTypeRegistration.cpp
index 096fc0b6dc..668c59300a 100644
--- a/alib2raw_cli_integration/src/OutputFileTypeRegistration.cpp
+++ b/alib2raw_cli_integration/src/OutputFileTypeRegistration.cpp
@@ -18,8 +18,9 @@ namespace {
 		ext::vector < std::string > templateParams;
 		ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ), ext::to_string < std::string > ( ) };
 		abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
+		ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ), abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
-		abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category ) );
+		abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, paramTypeQualifiers, category ) );
 
 		std::shared_ptr < abstraction::PackingAbstraction < 2 > > res = std::make_shared < abstraction::PackingAbstraction < 2 > > ( std::move ( abstractions ), 1 );
 		res->setInnerConnection ( 0, 1, 1, true );
diff --git a/alib2str_cli_integration/src/InputFileTypeRegistration.cpp b/alib2str_cli_integration/src/InputFileTypeRegistration.cpp
index 77acaad93a..b6eed2f023 100644
--- a/alib2str_cli_integration/src/InputFileTypeRegistration.cpp
+++ b/alib2str_cli_integration/src/InputFileTypeRegistration.cpp
@@ -15,8 +15,9 @@ namespace {
 		ext::vector < std::string > templateParams;
 		ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ) };
 		abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
+		ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
-		abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, category ) );
+		abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::ReadFile", templateParams, paramTypes, paramTypeQualifiers, category ) );
 
 		auto stringParserAbstractionFinder = [ = ] ( const std::string & data ) {
 			return abstraction::StringReaderRegistry::getAbstraction ( typehint, data );
diff --git a/alib2str_cli_integration/src/OutputFileTypeRegistration.cpp b/alib2str_cli_integration/src/OutputFileTypeRegistration.cpp
index a7e427e7a0..1b32d89648 100644
--- a/alib2str_cli_integration/src/OutputFileTypeRegistration.cpp
+++ b/alib2str_cli_integration/src/OutputFileTypeRegistration.cpp
@@ -18,8 +18,9 @@ namespace {
 		ext::vector < std::string > templateParams;
 		ext::vector < std::string > paramTypes { ext::to_string < std::string > ( ), ext::to_string < std::string > ( ) };
 		abstraction::AlgorithmCategories::AlgorithmCategory category = abstraction::AlgorithmCategories::AlgorithmCategory::NONE;
+		ext::vector < ext::set < abstraction::ParamQualifiers::ParamQualifier > > paramTypeQualifiers { abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ), abstraction::ParamQualifiers::paramQualifiers < const std::string & > ( ) };
 
-		abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, category ) );
+		abstractions.push_back ( abstraction::Registry::getAlgorithmAbstraction ( "cli::builtin::WriteFile", templateParams, paramTypes, paramTypeQualifiers, category ) );
 
 		std::shared_ptr < abstraction::PackingAbstraction < 2 > > res = std::make_shared < abstraction::PackingAbstraction < 2 > > ( std::move ( abstractions ), 1 );
 		res->setInnerConnection ( 0, 1, 1, true );
-- 
GitLab