From 5cab2e36c7a12654fcc6001365f20fe7b6de317c Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Wed, 23 Aug 2017 16:22:46 +0200
Subject: [PATCH] allow export of summary from introspection

---
 aintrospection2/src/aintrospection.cpp        | 30 ++++++++++++
 .../command/AlgorithmsIntrospectionCommand.h  |  2 +-
 .../src/command/CastsIntrospectionCommand.h   |  6 +--
 .../command/DataTypesIntrospectionCommand.h   |  2 +-
 .../src/command/NamesIntrospectionCommand.h   |  2 +-
 .../command/OverloadsIntrospectionCommand.h   |  8 ++--
 .../src/abstraction/AlgorithmRegistry.cpp     | 22 ++++-----
 .../src/abstraction/AlgorithmRegistry.hpp     | 22 ++++-----
 alib2common/src/abstraction/CastRegistry.cpp  | 14 +++---
 alib2common/src/abstraction/CastRegistry.hpp  |  6 +--
 alib2common/src/abstraction/Registry.cpp      | 18 +++----
 alib2common/src/abstraction/Registry.h        | 18 +++----
 .../src/abstraction/XmlFileWriterRegistry.cpp |  8 ++--
 .../src/abstraction/XmlFileWriterRegistry.hpp |  4 +-
 .../abstraction/common/ParamQualifiers.cpp    | 48 +++++++++++++++++++
 .../abstraction/common/ParamQualifiers.hpp    | 14 ++++++
 alib2common/src/core/namingApi.hpp            |  8 ++--
 17 files changed, 162 insertions(+), 70 deletions(-)
 create mode 100644 alib2common/src/abstraction/common/ParamQualifiers.cpp

diff --git a/aintrospection2/src/aintrospection.cpp b/aintrospection2/src/aintrospection.cpp
index 74403f8518..5ff3c52532 100644
--- a/aintrospection2/src/aintrospection.cpp
+++ b/aintrospection2/src/aintrospection.cpp
@@ -13,6 +13,13 @@
 #include <lexer/Lexer.h>
 #include <parser/Parser.h>
 
+#include <container/ObjectsMap.h>
+#include <container/ObjectsSet.h>
+#include <container/ObjectsPair.h>
+#include <container/ObjectsVector.h>
+#include <container/ObjectsTuple.h>
+#include <primitive/String.h>
+
 int main ( int argc, char * argv[] ) {
 	try {
 		common::GlobalData::argc = argc;
@@ -35,6 +42,12 @@ int main ( int argc, char * argv[] ) {
 		TCLAP::SwitchArg castTo ( "t", "cast_to", "Casting to type", false );
 		cmd.add ( castTo );
 
+		TCLAP::SwitchArg names ( "n", "names", "Names", false );
+		cmd.add ( names );
+
+		TCLAP::SwitchArg summary ( "s", "sumary", "Sumary", false );
+		cmd.add ( summary );
+
 		TCLAP::UnlabeledValueArg < std::string > argument ( "argument", "Type name for casts, algorithm name for overloads, group name for algorithms or datatypes", false, "", "string" );
 		cmd.add ( argument );
 
@@ -73,6 +86,23 @@ int main ( int argc, char * argv[] ) {
 		} else if ( castTo.isSet ( ) ) {
 			cli::Parser parser ( cli::Lexer ( "introspect casts :to #argument" ) );
 			parser.parse ( )->run ( environment );
+		} else if ( names.isSet ( ) ) {
+			cli::Parser parser ( cli::Lexer ( "introspect names" ) );
+			parser.parse ( )->run ( environment );
+		} else if ( summary.isSet ( ) ) {
+			ext::set < ext::pair < std::string, std::string > > casts = abstraction::Registry::listCasts ( );
+			ext::set < std::string > algos = abstraction::Registry::listAlgorithms ( );
+
+			ext::map < std::string, ext::set < ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > > overs;
+			for ( const std::string & algo : algos )
+				overs.insert ( std::make_pair ( algo, abstraction::Registry::listOverloads ( algo ) ) );
+
+			ext::pair <
+				ext::set < ext::pair < std::string, std::string > >,
+				ext::map < std::string, ext::set < ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > >
+				> res = ext::make_pair ( casts, overs );
+
+			alib::XmlDataFactory::toStdout ( res );
 		}
 
 		measurements::end ( );
diff --git a/alib2cli/src/command/AlgorithmsIntrospectionCommand.h b/alib2cli/src/command/AlgorithmsIntrospectionCommand.h
index c79aea07ac..b4c844307a 100644
--- a/alib2cli/src/command/AlgorithmsIntrospectionCommand.h
+++ b/alib2cli/src/command/AlgorithmsIntrospectionCommand.h
@@ -13,7 +13,7 @@ public:
 	AlgorithmsIntrospectionCommand ( std::unique_ptr < cli::Arg > param ) : m_param ( std::move ( param ) ) {
 	}
 
-	void printAlgos ( const std::set < std::string > & algos ) const {
+	void printAlgos ( const ext::set < std::string > & algos ) const {
 		for ( const std::string & algo : algos )
 			std::cout << algo << std::endl;
 	}
diff --git a/alib2cli/src/command/CastsIntrospectionCommand.h b/alib2cli/src/command/CastsIntrospectionCommand.h
index 217925218d..069d654b45 100644
--- a/alib2cli/src/command/CastsIntrospectionCommand.h
+++ b/alib2cli/src/command/CastsIntrospectionCommand.h
@@ -15,13 +15,13 @@ public:
 	CastsIntrospectionCommand (std::unique_ptr < cli::Arg > param, bool from, bool to ) : m_param ( std::move ( param ) ), m_from ( from ), m_to ( to ) {
 	}
 
-	void printTypes ( const std::set < std::string > & types ) const {
+	void printTypes ( const ext::set < std::string > & types ) const {
 		for ( const std::string & type : types )
 			std::cout << type << std::endl;
 	}
 
-	void printCasts ( const std::set < std::pair < std::string, std::string > > & casts ) const {
-		for ( const std::pair < std::string, std::string > & cast : casts )
+	void printCasts ( const ext::set < ext::pair < std::string, std::string > > & casts ) const {
+		for ( const ext::pair < std::string, std::string > & cast : casts )
 			std::cout << cast.first << ", " << cast.second << std::endl;
 	}
 
diff --git a/alib2cli/src/command/DataTypesIntrospectionCommand.h b/alib2cli/src/command/DataTypesIntrospectionCommand.h
index 901a74860b..ab80a3c445 100644
--- a/alib2cli/src/command/DataTypesIntrospectionCommand.h
+++ b/alib2cli/src/command/DataTypesIntrospectionCommand.h
@@ -13,7 +13,7 @@ public:
 	DataTypesIntrospectionCommand ( std::unique_ptr < cli::Arg > param ) : m_param ( std::move ( param ) ) {
 	}
 
-	void printTypes ( const std::set < std::string > & types ) const {
+	void printTypes ( const ext::set < std::string > & types ) const {
 		for ( const std::string & type : types )
 			std::cout << type << std::endl;
 	}
diff --git a/alib2cli/src/command/NamesIntrospectionCommand.h b/alib2cli/src/command/NamesIntrospectionCommand.h
index 4812a6d6a0..994039a54a 100644
--- a/alib2cli/src/command/NamesIntrospectionCommand.h
+++ b/alib2cli/src/command/NamesIntrospectionCommand.h
@@ -8,7 +8,7 @@ namespace cli {
 
 class NamesIntrospectionCommand : public Command {
 public:
-	void printNames ( const std::set < std::pair < std::string, std::set < std::string > > > & names ) const {
+	void printNames ( const ext::set < ext::pair < std::string, ext::set < std::string > > > & names ) const {
 		for ( const std::pair < std::string, std::set < std::string > > & entry : names ) {
 			std::cout << entry.first << " : ";
 			bool first = true;
diff --git a/alib2cli/src/command/OverloadsIntrospectionCommand.h b/alib2cli/src/command/OverloadsIntrospectionCommand.h
index 2fc7fd6603..7bc96a88db 100644
--- a/alib2cli/src/command/OverloadsIntrospectionCommand.h
+++ b/alib2cli/src/command/OverloadsIntrospectionCommand.h
@@ -16,10 +16,10 @@ public:
 	virtual Command::Result run ( Environment & environment ) const override {
 		std::string param = m_param->eval ( environment );
 
-		std::set < std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > overloads = abstraction::Registry::listOverloads ( param );
-		for ( const std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > & overload : overloads ) {
+		ext::set < ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > overloads = abstraction::Registry::listOverloads ( param );
+		for ( const ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > & overload : overloads ) {
 			{
-				const std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > & result = overload.first;
+				const ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > & result = overload.first;
 
 				if ( std::get < 1 > ( result ).count ( abstraction::ParamQualifiers::ParamQualifier::CONST ) )
 					std::cout << "const ";
@@ -34,7 +34,7 @@ public:
 			}
 			std::cout << " (";
 			bool first = true;
-			for ( const std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > & parameter : overload.second ) {
+			for ( const ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > & parameter : overload.second ) {
 				if ( first )
 					first = false;
 				else
diff --git a/alib2common/src/abstraction/AlgorithmRegistry.cpp b/alib2common/src/abstraction/AlgorithmRegistry.cpp
index bd2dbac927..daf32b22b4 100644
--- a/alib2common/src/abstraction/AlgorithmRegistry.cpp
+++ b/alib2common/src/abstraction/AlgorithmRegistry.cpp
@@ -60,7 +60,7 @@ std::shared_ptr < abstraction::OperationAbstraction > AlgorithmRegistry::getAbst
 
 	// determine how one can actually map what we have ( paramTypes ) as params to what is available as overloads ( group->second )
 	std::vector < std::pair < ext::vector < ext::tuple < MatchType, std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > >, std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > > compatibilityData;
-	for ( const std::pair < ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > & entry : group->second ) {
+	for ( const ext::pair < ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > & entry : group->second ) {
 		if ( entry.first.size ( ) != paramTypes.size ( ) )
 			continue;
 
@@ -148,32 +148,32 @@ std::shared_ptr < abstraction::OperationAbstraction > AlgorithmRegistry::getAbst
 	return getAbstraction ( name, paramTypes, downcast, normalize );
 }
 
-std::set < std::string > AlgorithmRegistry::listGroup ( const std::string & group ) {
-	std::set < std::string > res;
+ext::set < std::string > AlgorithmRegistry::listGroup ( const std::string & group ) {
+	ext::set < std::string > res;
 
-	for ( const std::pair < const std::string, ext::vector < std::pair < ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > > > & entry : getEntries ( ) )
+	for ( const std::pair < const std::string, ext::vector < ext::pair < ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > > > & entry : getEntries ( ) )
 		if ( entry.first.find ( group ) == 0 ) //found at the begining
 			res.insert ( entry.first );
 
 	return res;
 }
 
-std::set < std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > AlgorithmRegistry::listOverloads ( const std::string & algorithm ) {
+ext::set < ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > AlgorithmRegistry::listOverloads ( const std::string & algorithm ) {
 	auto group = getEntries ( ).find ( algorithm );
 	if ( group == getEntries ( ).end ( ) )
 		throw exception::CommonException ( "Entry " + algorithm + " not available" );
 
-	std::set < std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > res;
-	for ( const std::pair < ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > & overloads : group->second )
-		res.insert ( std::make_pair ( overloads.second.first, overloads.first ) );
+	ext::set < ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > res;
+	for ( const ext::pair < ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > & overloads : group->second )
+		res.insert ( ext::make_pair ( overloads.second.first, overloads.first ) );
 
 	return res;
 }
 
-std::set < std::string > AlgorithmRegistry::list ( ) {
-	std::set < std::string > res;
+ext::set < std::string > AlgorithmRegistry::list ( ) {
+	ext::set < std::string > res;
 
-	for ( const std::pair < const std::string, ext::vector < std::pair < ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > > > & entry : getEntries ( ) )
+	for ( const std::pair < const std::string, ext::vector < ext::pair < ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > > > & entry : getEntries ( ) )
 		res.insert ( entry.first );
 
 	return res;
diff --git a/alib2common/src/abstraction/AlgorithmRegistry.hpp b/alib2common/src/abstraction/AlgorithmRegistry.hpp
index 6b319e9ad1..c101136121 100644
--- a/alib2common/src/abstraction/AlgorithmRegistry.hpp
+++ b/alib2common/src/abstraction/AlgorithmRegistry.hpp
@@ -52,8 +52,8 @@ class AlgorithmRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
 	};
 
-	static ext::map < std::string, ext::vector < std::pair < ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > > > & getEntries ( ) {
-		static ext::map < std::string, ext::vector < std::pair < ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > > > algorithmGroups;
+	static ext::map < std::string, ext::vector < ext::pair < ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > > > & getEntries ( ) {
+		static ext::map < std::string, ext::vector < ext::pair < ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > > > algorithmGroups;
 		return algorithmGroups;
 	};
 
@@ -70,29 +70,29 @@ public:
 
 		std::string algorithm = ext::to_string < Algo > ( );
 
-		ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > params;
+		ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > params;
 		unsigned i = 0; /* the evaluation order in initializer list is actually defined */
-		( void ) std::initializer_list < int > { ( params.push_back ( std::make_tuple ( ext::to_string < typename std::decay < ParamTypes >::type > ( ), abstraction::ParamQualifiers::paramQualifiers < ParamTypes > ( ), std::move ( paramNames [ i ++ ] ) ) ), 0 ) ... };
+		( void ) std::initializer_list < int > { ( params.push_back ( ext::make_tuple ( ext::to_string < typename std::decay < ParamTypes >::type > ( ), abstraction::ParamQualifiers::paramQualifiers < ParamTypes > ( ), std::move ( paramNames [ i ++ ] ) ) ), 0 ) ... };
 
 		auto & group = getEntries ( ) [ algorithm ];
-		for ( const std::pair < ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > & entry : group )
+		for ( const ext::pair < ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > > & entry : group )
 			if ( entry.first == params )
 				throw exception::CommonException ( "Callback for " + algorithm + " already registered." );
 
-		std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > result = std::make_pair ( ext::to_string < typename std::decay < ReturnType >::type > ( ), abstraction::ParamQualifiers::paramQualifiers < ReturnType > ( ) );
-		std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > entryValue = std::make_pair ( std::move ( result ), std::make_shared < EntryImpl < ReturnType, ParamTypes ... > > ( callback, downcast, normalize ) );
-		group.push_back ( std::make_pair ( params, entryValue ) );
+		ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > result = ext::make_pair ( ext::to_string < typename std::decay < ReturnType >::type > ( ), abstraction::ParamQualifiers::paramQualifiers < ReturnType > ( ) );
+		ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < Entry > > entryValue = ext::make_pair ( std::move ( result ), std::make_shared < EntryImpl < ReturnType, ParamTypes ... > > ( callback, downcast, normalize ) );
+		group.push_back ( ext::make_pair ( params, entryValue ) );
 	}
 
 	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & name, const ext::vector < std::string > & paramTypes, bool & downcast, bool & normalize );
 
 	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & name, const ext::vector < std::string > & paramTypes );
 
-	static std::set < std::string > listGroup ( const std::string & group );
+	static ext::set < std::string > listGroup ( const std::string & group );
 
-	static std::set < std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > listOverloads ( const std::string & algorithm );
+	static ext::set < ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > listOverloads ( const std::string & algorithm );
 
-	static std::set < std::string > list ( );
+	static ext::set < std::string > list ( );
 };
 
 } /* namespace abstraction */
diff --git a/alib2common/src/abstraction/CastRegistry.cpp b/alib2common/src/abstraction/CastRegistry.cpp
index fefc7e86e0..251ff90e4b 100644
--- a/alib2common/src/abstraction/CastRegistry.cpp
+++ b/alib2common/src/abstraction/CastRegistry.cpp
@@ -62,7 +62,7 @@ std::shared_ptr < abstraction::OperationAbstraction > CastRegistry::getAbstracti
 	return getAbstraction ( target, param, normalize );
 }
 
-std::set < std::string > CastRegistry::listFrom ( const std::string & type ) {
+ext::set < std::string > CastRegistry::listFrom ( const std::string & type ) {
 	std::set < std::string > sourceTypes;
 
 	if ( alib::namingApi::hasTypes ( type ) )
@@ -70,7 +70,7 @@ std::set < std::string > CastRegistry::listFrom ( const std::string & type ) {
 	else
 		sourceTypes.insert ( type );
 
-	std::set < std::string > res;
+	ext::set < std::string > res;
 
 	for ( const std::pair < const std::pair < std::string, std::string >, std::unique_ptr < Entry > > & entry : getEntries ( ) )
 		if ( sourceTypes.count ( entry.first.second ) )
@@ -79,7 +79,7 @@ std::set < std::string > CastRegistry::listFrom ( const std::string & type ) {
 	return res;
 }
 
-std::set < std::string > CastRegistry::listTo ( const std::string & type ) {
+ext::set < std::string > CastRegistry::listTo ( const std::string & type ) {
 	std::set < std::string > targetTypes;
 
 	if ( alib::namingApi::hasTypes ( type ) )
@@ -87,7 +87,7 @@ std::set < std::string > CastRegistry::listTo ( const std::string & type ) {
 	else
 		targetTypes.insert ( type );
 
-	std::set < std::string > res;
+	ext::set < std::string > res;
 
 	for ( const std::pair < const std::pair < std::string, std::string >, std::unique_ptr < Entry > > & entry : getEntries ( ) )
 		if ( targetTypes.count ( entry.first.first ) )
@@ -96,11 +96,11 @@ std::set < std::string > CastRegistry::listTo ( const std::string & type ) {
 	return res;
 }
 
-std::set < std::pair < std::string, std::string > > CastRegistry::list ( ) {
-	std::set < std::pair < std::string, std::string > > res;
+ext::set < ext::pair < std::string, std::string > > CastRegistry::list ( ) {
+	ext::set < ext::pair < std::string, std::string > > res;
 
 	for ( const std::pair < const std::pair < std::string, std::string >, std::unique_ptr < Entry > > & entry : getEntries ( ) )
-		res.insert ( std::make_pair ( entry.first.first, entry.first.second ) );
+		res.insert ( ext::make_pair ( entry.first.first, entry.first.second ) );
 
 	return res;
 }
diff --git a/alib2common/src/abstraction/CastRegistry.hpp b/alib2common/src/abstraction/CastRegistry.hpp
index a666554656..09651e1208 100644
--- a/alib2common/src/abstraction/CastRegistry.hpp
+++ b/alib2common/src/abstraction/CastRegistry.hpp
@@ -109,11 +109,11 @@ public:
 
 	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & target, const std::string & param );
 
-	static std::set < std::string > listFrom ( const std::string & type );
+	static ext::set < std::string > listFrom ( const std::string & type );
 
-	static std::set < std::string > listTo ( const std::string & type );
+	static ext::set < std::string > listTo ( const std::string & type );
 
-	static std::set < std::pair < std::string, std::string > > list ( );
+	static ext::set < ext::pair < std::string, std::string > > list ( );
 };
 
 } /* namespace abstraction */
diff --git a/alib2common/src/abstraction/Registry.cpp b/alib2common/src/abstraction/Registry.cpp
index aaf0cd8e7a..e45d6f808e 100644
--- a/alib2common/src/abstraction/Registry.cpp
+++ b/alib2common/src/abstraction/Registry.cpp
@@ -20,39 +20,39 @@
 
 namespace abstraction {
 
-std::set < std::string > Registry::listAlgorithmGroup ( const std::string & group ) {
+ext::set < std::string > Registry::listAlgorithmGroup ( const std::string & group ) {
 	return AlgorithmRegistry::listGroup ( group );
 }
 
-std::set < std::string > Registry::listAlgorithms ( ) {
+ext::set < std::string > Registry::listAlgorithms ( ) {
 	return AlgorithmRegistry::list ( );
 }
 
-std::set < std::string > Registry::listDataTypes ( ) {
+ext::set < std::string > Registry::listDataTypes ( ) {
 	return XmlFileWriterRegistry::list ( );
 }
 
-std::set < std::string > Registry::listDataTypeGroup ( const std::string & group ) {
+ext::set < std::string > Registry::listDataTypeGroup ( const std::string & group ) {
 	return XmlFileWriterRegistry::listGroup ( group );
 }
 
-std::set < std::string > Registry::listCastsFrom ( const std::string & type ) {
+ext::set < std::string > Registry::listCastsFrom ( const std::string & type ) {
 	return CastRegistry::listFrom ( type );
 }
 
-std::set < std::string > Registry::listCastsTo ( const std::string & type ) {
+ext::set < std::string > Registry::listCastsTo ( const std::string & type ) {
 	return CastRegistry::listTo ( type );
 }
 
-std::set < std::pair < std::string, std::string > > Registry::listCasts ( ) {
+ext::set < ext::pair < std::string, std::string > > Registry::listCasts ( ) {
 	return CastRegistry::list ( );
 }
 
-std::set < std::pair < std::string, std::set < std::string > > > Registry::listNames ( ) {
+ext::set < ext::pair < std::string, ext::set < std::string > > > Registry::listNames ( ) {
 	return alib::namingApi::list ( );
 }
 
-std::set < std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > Registry::listOverloads ( const std::string & algorithm ) {
+ext::set < ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > Registry::listOverloads ( const std::string & algorithm ) {
 	return AlgorithmRegistry::listOverloads ( algorithm );
 }
 
diff --git a/alib2common/src/abstraction/Registry.h b/alib2common/src/abstraction/Registry.h
index acd0ec78fc..32873ae54c 100644
--- a/alib2common/src/abstraction/Registry.h
+++ b/alib2common/src/abstraction/Registry.h
@@ -15,19 +15,19 @@ namespace abstraction {
 
 class Registry {
 public:
-	static std::set < std::string > listAlgorithmGroup ( const std::string & group );
-	static std::set < std::string > listAlgorithms ( );
+	static ext::set < std::string > listAlgorithmGroup ( const std::string & group );
+	static ext::set < std::string > listAlgorithms ( );
 
-	static std::set < std::string > listDataTypes ( );
-	static std::set < std::string > listDataTypeGroup ( const std::string & group );
+	static ext::set < std::string > listDataTypes ( );
+	static ext::set < std::string > listDataTypeGroup ( const std::string & group );
 
-	static std::set < std::string > listCastsFrom ( const std::string & type );
-	static std::set < std::string > listCastsTo ( const std::string & type );
-	static std::set < std::pair < std::string, std::string > > listCasts ( );
+	static ext::set < std::string > listCastsFrom ( const std::string & type );
+	static ext::set < std::string > listCastsTo ( const std::string & type );
+	static ext::set < ext::pair < std::string, std::string > > listCasts ( );
 
-	static std::set < std::pair < std::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < std::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > listOverloads ( const std::string & algorithm );
+	static ext::set < ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > > > listOverloads ( const std::string & algorithm );
 
-	static std::set < std::pair < std::string, std::set < std::string > > > listNames ( );
+	static ext::set < ext::pair < std::string, ext::set < std::string > > > listNames ( );
 
 	static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & paramTypes );
 	static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( const std::string & name, const ext::vector < std::string > & paramTypes, bool & unwrap, bool & normalize );
diff --git a/alib2common/src/abstraction/XmlFileWriterRegistry.cpp b/alib2common/src/abstraction/XmlFileWriterRegistry.cpp
index 83580202b5..c11c841e35 100644
--- a/alib2common/src/abstraction/XmlFileWriterRegistry.cpp
+++ b/alib2common/src/abstraction/XmlFileWriterRegistry.cpp
@@ -17,8 +17,8 @@ std::shared_ptr < abstraction::OperationAbstraction > XmlFileWriterRegistry::get
 	return res->second->getAbstraction ( std::move ( filename ) );
 }
 
-std::set < std::string > XmlFileWriterRegistry::listGroup ( const std::string & group ) {
-	std::set < std::string > res;
+ext::set < std::string > XmlFileWriterRegistry::listGroup ( const std::string & group ) {
+	ext::set < std::string > res;
 
 	for ( const std::pair < const std::string, std::unique_ptr < Entry > > & entry : getEntries ( ) )
 		if ( entry.first.find ( group ) == 0 ) //found at the begining
@@ -27,8 +27,8 @@ std::set < std::string > XmlFileWriterRegistry::listGroup ( const std::string &
 	return res;
 }
 
-std::set < std::string > XmlFileWriterRegistry::list ( ) {
-	std::set < std::string > res;
+ext::set < std::string > XmlFileWriterRegistry::list ( ) {
+	ext::set < std::string > res;
 
 	for ( const std::pair < const std::string, std::unique_ptr < Entry > > & entry : getEntries ( ) )
 		res.insert ( entry.first );
diff --git a/alib2common/src/abstraction/XmlFileWriterRegistry.hpp b/alib2common/src/abstraction/XmlFileWriterRegistry.hpp
index 8034313d91..bca003992a 100644
--- a/alib2common/src/abstraction/XmlFileWriterRegistry.hpp
+++ b/alib2common/src/abstraction/XmlFileWriterRegistry.hpp
@@ -52,9 +52,9 @@ public:
 
 	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & param, std::string filename );
 
-	static std::set < std::string > listGroup ( const std::string & group );
+	static ext::set < std::string > listGroup ( const std::string & group );
 
-	static std::set < std::string > list ( );
+	static ext::set < std::string > list ( );
 };
 
 } /* namespace abstraction */
diff --git a/alib2common/src/abstraction/common/ParamQualifiers.cpp b/alib2common/src/abstraction/common/ParamQualifiers.cpp
new file mode 100644
index 0000000000..b89878a262
--- /dev/null
+++ b/alib2common/src/abstraction/common/ParamQualifiers.cpp
@@ -0,0 +1,48 @@
+#include <abstraction/common/ParamQualifiers.hpp>
+
+namespace alib {
+
+abstraction::ParamQualifiers::ParamQualifier xmlApi < abstraction::ParamQualifiers::ParamQualifier >::parse ( ext::deque < sax::Token >::iterator & input ) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) );
+
+	std::string data = sax::FromXMLParserHelper::popTokenData(input, sax::Token::TokenType::CHARACTER);
+	abstraction::ParamQualifiers::ParamQualifier res = abstraction::ParamQualifiers::ParamQualifier::CONST;
+	if ( data == "lref" )
+		res = abstraction::ParamQualifiers::ParamQualifier::LREF;
+	else if ( data == "rref" )
+		res = abstraction::ParamQualifiers::ParamQualifier::RREF;
+	else if ( data == "const" )
+		res = abstraction::ParamQualifiers::ParamQualifier::CONST;
+	else
+		throw exception::CommonException ( "Invalid param qualifier." );
+
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) );
+
+	return res;
+}
+
+bool xmlApi < abstraction::ParamQualifiers::ParamQualifier >::first ( const ext::deque < sax::Token >::const_iterator & input ) {
+	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) );
+}
+
+std::string xmlApi < abstraction::ParamQualifiers::ParamQualifier >::xmlTagName ( ) {
+	return "ParamQualifier";
+}
+
+void xmlApi < abstraction::ParamQualifiers::ParamQualifier >::compose ( ext::deque < sax::Token > & out, abstraction::ParamQualifiers::ParamQualifier paramQualifier ) {
+	out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT);
+	switch ( paramQualifier ) {
+	case abstraction::ParamQualifiers::ParamQualifier::CONST:
+		out.emplace_back("const", sax::Token::TokenType::CHARACTER);
+		break;
+	case abstraction::ParamQualifiers::ParamQualifier::LREF:
+		out.emplace_back("lref", sax::Token::TokenType::CHARACTER);
+		break;
+	case abstraction::ParamQualifiers::ParamQualifier::RREF:
+		out.emplace_back("rref", sax::Token::TokenType::CHARACTER);
+		break;
+	}
+	out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT);
+}
+
+} /* namespace alib */
diff --git a/alib2common/src/abstraction/common/ParamQualifiers.hpp b/alib2common/src/abstraction/common/ParamQualifiers.hpp
index ab729b9dd0..ed5b151384 100644
--- a/alib2common/src/abstraction/common/ParamQualifiers.hpp
+++ b/alib2common/src/abstraction/common/ParamQualifiers.hpp
@@ -3,6 +3,8 @@
 
 #include <set>
 #include <type_traits>
+#include <core/xmlApi.hpp>
+#include <string>
 
 namespace abstraction {
 
@@ -33,4 +35,16 @@ public:
 
 } /* namespace abstraction */
 
+namespace alib {
+
+template < >
+struct xmlApi < abstraction::ParamQualifiers::ParamQualifier > {
+	static abstraction::ParamQualifiers::ParamQualifier parse ( ext::deque < sax::Token >::iterator & input );
+	static bool first ( const ext::deque < sax::Token >::const_iterator & input );
+	static std::string xmlTagName ( );
+	static void compose ( ext::deque < sax::Token > & output, abstraction::ParamQualifiers::ParamQualifier );
+};
+
+} /* namespace alib */
+
 #endif // _PARAM_QUALIFIERS_HPP_
diff --git a/alib2common/src/core/namingApi.hpp b/alib2common/src/core/namingApi.hpp
index a9c7d1a3af..5aa707a74c 100644
--- a/alib2common/src/core/namingApi.hpp
+++ b/alib2common/src/core/namingApi.hpp
@@ -45,15 +45,15 @@ public:
 		return name != getNames ( ).end ( );
 	}
 
-	static std::set < std::pair < std::string, std::set < std::string > > > list ( ) {
-		std::set < std::pair < std::string, std::set < std::string > > > res;
+	static ext::set < ext::pair < std::string, ext::set < std::string > > > list ( ) {
+		ext::set < ext::pair < std::string, ext::set < std::string > > > res;
 
 		for ( const std::pair < const std::string, ext::set < ext::type_index > > & entry : getNames ( ) ) {
-			std::set < std::string > names;
+			ext::set < std::string > names;
 			for ( const ext::type_index & name : entry.second )
 				names.insert ( ext::to_string ( name ) );
 
-			res.insert ( std::make_pair ( entry.first, names ) );
+			res.insert ( ext::make_pair ( entry.first, names ) );
 		}
 
 		return res;
-- 
GitLab