From 26fd045ddca822d9886911eab2a3a3afae8a617e Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 29 Jan 2019 23:45:00 +0100
Subject: [PATCH] move registered entries data objects from headers to cpp
 files

---
 .../src/registry/AlgorithmRegistry.cpp        |  5 +++++
 .../src/registry/AlgorithmRegistry.hpp        |  5 +----
 .../src/registry/CastRegistry.cpp             |  5 +++++
 .../src/registry/CastRegistry.hpp             |  5 +----
 .../src/registry/ContainerRegistry.cpp        |  5 +++++
 .../src/registry/ContainerRegistry.hpp        |  5 +----
 .../src/registry/ImmediateRegistry.cpp        |  5 +++++
 .../src/registry/ImmediateRegistry.hpp        |  5 +----
 .../src/registry/NormalizeRegistry.cpp        |  5 +++++
 .../src/registry/NormalizeRegistry.hpp        |  5 +----
 .../src/registry/ValuePrinterRegistry.cpp     |  5 +++++
 .../src/registry/ValuePrinterRegistry.hpp     |  5 +----
 alib2raw/src/registry/RawReaderRegistry.cpp   |  5 +++++
 alib2raw/src/registry/RawReaderRegistry.hpp   |  5 +----
 alib2raw/src/registry/RawWriterRegistry.cpp   |  5 +++++
 alib2raw/src/registry/RawWriterRegistry.hpp   |  5 +----
 alib2str/src/core/stringApi.cpp               | 17 ++++++++++++++++
 alib2str/src/core/stringApi.hpp               | 19 +++++++-----------
 .../src/registry/StringReaderRegistry.cpp     | 13 ++++++++----
 .../src/registry/StringReaderRegistry.hpp     | 20 +++++++++----------
 .../src/registry/StringWriterRegistry.cpp     |  5 +++++
 .../src/registry/StringWriterRegistry.hpp     |  5 +----
 alib2xml/src/core/xmlApi.cpp                  | 17 ++++++++++++++++
 alib2xml/src/core/xmlApi.hpp                  | 12 ++---------
 alib2xml/src/registry/XmlComposerRegistry.cpp |  5 +++++
 alib2xml/src/registry/XmlComposerRegistry.hpp |  5 +----
 .../registry/XmlContainerParserRegistry.cpp   |  5 +++++
 .../registry/XmlContainerParserRegistry.hpp   |  5 +----
 alib2xml/src/registry/XmlParserRegistry.cpp   |  5 +++++
 alib2xml/src/registry/XmlParserRegistry.hpp   |  5 +----
 30 files changed, 133 insertions(+), 85 deletions(-)
 create mode 100644 alib2str/src/core/stringApi.cpp
 create mode 100644 alib2xml/src/core/xmlApi.cpp

diff --git a/alib2abstraction/src/registry/AlgorithmRegistry.cpp b/alib2abstraction/src/registry/AlgorithmRegistry.cpp
index bbed267255..605930c7fc 100644
--- a/alib2abstraction/src/registry/AlgorithmRegistry.cpp
+++ b/alib2abstraction/src/registry/AlgorithmRegistry.cpp
@@ -12,6 +12,11 @@
 
 namespace abstraction {
 
+ext::map < ext::pair < std::string, ext::vector < std::string > >, ext::list < ext::tuple < AlgorithmCategories::AlgorithmCategory, 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 < AlgorithmRegistry::Entry > > > > > & AlgorithmRegistry::getEntries ( ) {
+	static ext::map < ext::pair < std::string, ext::vector < std::string > >, ext::list < ext::tuple < AlgorithmCategories::AlgorithmCategory, 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;
+}
+
 bool AlgorithmRegistry::isRegistered ( const std::string & algorithm, const ext::vector < std::string > & templateParams, AlgorithmCategories::AlgorithmCategory category, const ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > > & params ) {
 	auto & group = getEntries ( ) [ ext::make_pair ( algorithm, templateParams ) ];
 
diff --git a/alib2abstraction/src/registry/AlgorithmRegistry.hpp b/alib2abstraction/src/registry/AlgorithmRegistry.hpp
index 2c3f453930..18683a0de2 100644
--- a/alib2abstraction/src/registry/AlgorithmRegistry.hpp
+++ b/alib2abstraction/src/registry/AlgorithmRegistry.hpp
@@ -78,10 +78,7 @@ class AlgorithmRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
 	};
 
-	static ext::map < ext::pair < std::string, ext::vector < std::string > >, ext::list < ext::tuple < AlgorithmCategories::AlgorithmCategory, 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 < ext::pair < std::string, ext::vector < std::string > >, ext::list < ext::tuple < AlgorithmCategories::AlgorithmCategory, 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;
-	};
+	static ext::map < ext::pair < std::string, ext::vector < std::string > >, ext::list < ext::tuple < AlgorithmCategories::AlgorithmCategory, 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 ( );
 
 	enum class MatchType {
 		EXACT,
diff --git a/alib2abstraction/src/registry/CastRegistry.cpp b/alib2abstraction/src/registry/CastRegistry.cpp
index 53c19198cc..47f670ccd8 100644
--- a/alib2abstraction/src/registry/CastRegistry.cpp
+++ b/alib2abstraction/src/registry/CastRegistry.cpp
@@ -11,6 +11,11 @@
 
 namespace abstraction {
 
+ext::map < std::pair < std::string, std::string >, std::unique_ptr < CastRegistry::Entry > > & CastRegistry::getEntries ( ) {
+	static ext::map < std::pair < std::string, std::string >, std::unique_ptr < Entry > > casts;
+	return casts;
+}
+
 std::shared_ptr < abstraction::OperationAbstraction > CastRegistry::getAbstraction ( const std::string & target, const std::string & param ) {
 	auto entry = getEntries ( ).end ( );
 	for ( auto iter = getEntries ( ).begin ( ); iter != getEntries ( ).end ( ); ++ iter )
diff --git a/alib2abstraction/src/registry/CastRegistry.hpp b/alib2abstraction/src/registry/CastRegistry.hpp
index c99e8e0e03..40bc9ccd60 100644
--- a/alib2abstraction/src/registry/CastRegistry.hpp
+++ b/alib2abstraction/src/registry/CastRegistry.hpp
@@ -47,10 +47,7 @@ class CastRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
 	};
 
-	static ext::map < std::pair < std::string, std::string >, std::unique_ptr < Entry > > & getEntries ( ) {
-		static ext::map < std::pair < std::string, std::string >, std::unique_ptr < Entry > > casts;
-		return casts;
-	};
+	static ext::map < std::pair < std::string, std::string >, std::unique_ptr < Entry > > & getEntries ( );
 
 public:
 	static void unregisterCast ( std::string target, std::string param ) {
diff --git a/alib2abstraction/src/registry/ContainerRegistry.cpp b/alib2abstraction/src/registry/ContainerRegistry.cpp
index e5f0b55cac..3afccd87ca 100644
--- a/alib2abstraction/src/registry/ContainerRegistry.cpp
+++ b/alib2abstraction/src/registry/ContainerRegistry.cpp
@@ -11,6 +11,11 @@
 
 namespace abstraction {
 
+ext::map < std::string, ext::list < ext::pair < std::string, std::shared_ptr < ContainerRegistry::Entry > > > > & ContainerRegistry::getEntries ( ) {
+	static ext::map < std::string, ext::list < ext::pair < std::string, std::shared_ptr < Entry > > > > containerGroups;
+	return containerGroups;
+}
+
 bool ContainerRegistry::hasAbstraction ( const std::string & container ) {
 	return getEntries ( ).count ( container );
 }
diff --git a/alib2abstraction/src/registry/ContainerRegistry.hpp b/alib2abstraction/src/registry/ContainerRegistry.hpp
index c923a329db..b49fc5510d 100644
--- a/alib2abstraction/src/registry/ContainerRegistry.hpp
+++ b/alib2abstraction/src/registry/ContainerRegistry.hpp
@@ -39,10 +39,7 @@ class ContainerRegistry {
 		}
 	};
 
-	static ext::map < std::string, ext::list < ext::pair < std::string, std::shared_ptr < Entry > > > > & getEntries ( ) {
-		static ext::map < std::string, ext::list < ext::pair < std::string, std::shared_ptr < Entry > > > > containerGroups;
-		return containerGroups;
-	};
+	static ext::map < std::string, ext::list < ext::pair < std::string, std::shared_ptr < Entry > > > > & getEntries ( );
 
 public:
 	static void unregisterSet ( std::string param ) {
diff --git a/alib2abstraction/src/registry/ImmediateRegistry.cpp b/alib2abstraction/src/registry/ImmediateRegistry.cpp
index 94426babbd..ad26da2e80 100644
--- a/alib2abstraction/src/registry/ImmediateRegistry.cpp
+++ b/alib2abstraction/src/registry/ImmediateRegistry.cpp
@@ -9,6 +9,11 @@
 
 namespace abstraction {
 
+ext::map < std::string, std::unique_ptr < ImmediateRegistry::Entry > > & ImmediateRegistry::getEntries ( ) {
+	static ext::map < std::string, std::unique_ptr < Entry > > fileWriters;
+	return fileWriters;
+}
+
 std::shared_ptr < abstraction::OperationAbstraction > ImmediateRegistry::getAbstraction ( const std::string & result, std::string value ) {
 	auto res = getEntries ( ).find ( result );
 	if ( res == getEntries ( ).end ( ) )
diff --git a/alib2abstraction/src/registry/ImmediateRegistry.hpp b/alib2abstraction/src/registry/ImmediateRegistry.hpp
index d20e413796..63b0ab4f4e 100644
--- a/alib2abstraction/src/registry/ImmediateRegistry.hpp
+++ b/alib2abstraction/src/registry/ImmediateRegistry.hpp
@@ -39,10 +39,7 @@ class ImmediateRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::string value ) const override;
 	};
 
-	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) {
-		static ext::map < std::string, std::unique_ptr < Entry > > fileWriters;
-		return fileWriters;
-	}
+	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( );
 
 public:
 	static void unregisterImmediate ( std::string result ) {
diff --git a/alib2abstraction/src/registry/NormalizeRegistry.cpp b/alib2abstraction/src/registry/NormalizeRegistry.cpp
index 048fda2d42..dd8353d588 100644
--- a/alib2abstraction/src/registry/NormalizeRegistry.cpp
+++ b/alib2abstraction/src/registry/NormalizeRegistry.cpp
@@ -9,6 +9,11 @@
 
 namespace abstraction {
 
+ext::map < std::string, std::list < std::unique_ptr < NormalizeRegistry::Entry > > > & NormalizeRegistry::getEntries ( ) {
+	static ext::map < std::string, std::list < std::unique_ptr < Entry > > > entries;
+	return entries;
+}
+
 std::shared_ptr < abstraction::OperationAbstraction > NormalizeRegistry::getAbstraction ( const std::string & param ) {
 	auto res = getEntries ( ).find ( param );
 	if ( res == getEntries ( ).end ( ) || res->second.size ( ) == 0 )
diff --git a/alib2abstraction/src/registry/NormalizeRegistry.hpp b/alib2abstraction/src/registry/NormalizeRegistry.hpp
index 7d8365e4eb..782d357ed3 100644
--- a/alib2abstraction/src/registry/NormalizeRegistry.hpp
+++ b/alib2abstraction/src/registry/NormalizeRegistry.hpp
@@ -42,10 +42,7 @@ class NormalizeRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
 	};
 
-	static ext::map < std::string, std::list < std::unique_ptr < Entry > > > & getEntries ( ) {
-		static ext::map < std::string, std::list < std::unique_ptr < Entry > > > entries;
-		return entries;
-	}
+	static ext::map < std::string, std::list < std::unique_ptr < Entry > > > & getEntries ( );
 
 public:
 	template < class ParamType >
diff --git a/alib2abstraction/src/registry/ValuePrinterRegistry.cpp b/alib2abstraction/src/registry/ValuePrinterRegistry.cpp
index e0789d7ad3..93868482cb 100644
--- a/alib2abstraction/src/registry/ValuePrinterRegistry.cpp
+++ b/alib2abstraction/src/registry/ValuePrinterRegistry.cpp
@@ -9,6 +9,11 @@
 
 namespace abstraction {
 
+ext::map < std::string, std::unique_ptr < ValuePrinterRegistry::Entry > > & ValuePrinterRegistry::getEntries ( ) {
+	static ext::map < std::string, std::unique_ptr < Entry > > fileWriters;
+	return fileWriters;
+}
+
 std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::getAbstraction ( const std::string & param, std::ostream & os ) {
 	auto res = getEntries ( ).find ( param );
 	if ( res == getEntries ( ).end ( ) )
diff --git a/alib2abstraction/src/registry/ValuePrinterRegistry.hpp b/alib2abstraction/src/registry/ValuePrinterRegistry.hpp
index 9563dc7606..56bce0bbcb 100644
--- a/alib2abstraction/src/registry/ValuePrinterRegistry.hpp
+++ b/alib2abstraction/src/registry/ValuePrinterRegistry.hpp
@@ -39,10 +39,7 @@ class ValuePrinterRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::ostream & os ) const override;
 	};
 
-	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) {
-		static ext::map < std::string, std::unique_ptr < Entry > > fileWriters;
-		return fileWriters;
-	}
+	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( );
 
 public:
 	static void unregisterValuePrinter ( std::string param ) {
diff --git a/alib2raw/src/registry/RawReaderRegistry.cpp b/alib2raw/src/registry/RawReaderRegistry.cpp
index 2f46c32bd1..8044273553 100644
--- a/alib2raw/src/registry/RawReaderRegistry.cpp
+++ b/alib2raw/src/registry/RawReaderRegistry.cpp
@@ -11,6 +11,11 @@
 
 namespace abstraction {
 
+ext::map < std::string, std::unique_ptr < RawReaderRegistry::Entry > > & RawReaderRegistry::getEntries ( ) {
+	static ext::map < std::string, std::unique_ptr < Entry > > readers;
+	return readers;
+}
+
 std::shared_ptr < abstraction::OperationAbstraction > RawReaderRegistry::getAbstraction ( const std::string & type ) {
 	for ( const std::pair < const std::string, std::unique_ptr < Entry > > & entry : getEntries ( ) ) {
 		if ( ext::is_same_type ( entry.first, type ) )
diff --git a/alib2raw/src/registry/RawReaderRegistry.hpp b/alib2raw/src/registry/RawReaderRegistry.hpp
index 2714eb86cf..a02b9e5bb7 100644
--- a/alib2raw/src/registry/RawReaderRegistry.hpp
+++ b/alib2raw/src/registry/RawReaderRegistry.hpp
@@ -36,10 +36,7 @@ class RawReaderRegistry {
 		}
 	};
 
-	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) {
-		static ext::map < std::string, std::unique_ptr < Entry > > readers;
-		return readers;
-	}
+	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( );
 
 public:
 	static void unregisterRawReader ( std::string type ) {
diff --git a/alib2raw/src/registry/RawWriterRegistry.cpp b/alib2raw/src/registry/RawWriterRegistry.cpp
index 2930443998..94eb942eb1 100644
--- a/alib2raw/src/registry/RawWriterRegistry.cpp
+++ b/alib2raw/src/registry/RawWriterRegistry.cpp
@@ -9,6 +9,11 @@
 
 namespace abstraction {
 
+ext::map < std::string, std::unique_ptr < RawWriterRegistry::Entry > > & RawWriterRegistry::getEntries ( ) {
+	static ext::map < std::string, std::unique_ptr < Entry > > writers;
+	return writers;
+}
+
 std::shared_ptr < abstraction::OperationAbstraction > RawWriterRegistry::getAbstraction ( const std::string & param ) {
 	auto type = getEntries ( ).find ( param );
 	if ( type == getEntries ( ).end ( ) )
diff --git a/alib2raw/src/registry/RawWriterRegistry.hpp b/alib2raw/src/registry/RawWriterRegistry.hpp
index e4f48da19d..180a216ba9 100644
--- a/alib2raw/src/registry/RawWriterRegistry.hpp
+++ b/alib2raw/src/registry/RawWriterRegistry.hpp
@@ -39,10 +39,7 @@ class RawWriterRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
 	};
 
-	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) {
-		static ext::map < std::string, std::unique_ptr < Entry > > writers;
-		return writers;
-	}
+	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( );
 
 public:
 	static void unregisterRawWriter ( std::string param ) {
diff --git a/alib2str/src/core/stringApi.cpp b/alib2str/src/core/stringApi.cpp
new file mode 100644
index 0000000000..a97ac87448
--- /dev/null
+++ b/alib2str/src/core/stringApi.cpp
@@ -0,0 +1,17 @@
+#include "stringApi.hpp"
+
+namespace core {
+
+ext::map < std::string, std::unique_ptr < stringApi < object::Object >::GroupWriter > > & stringApi < object::Object >::composeFunctions ( ) {
+	static ext::map < std::string, std::unique_ptr < GroupWriter > > res;
+
+	return res;
+}
+
+ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < stringApi < object::Object >::GroupReader > > > & stringApi < object::Object >::parseFunctions ( ) {
+	static ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < GroupReader > > > res;
+
+	return res;
+}
+
+} /* namespace core */
diff --git a/alib2str/src/core/stringApi.hpp b/alib2str/src/core/stringApi.hpp
index 759cba8f14..b47b0c4abb 100644
--- a/alib2str/src/core/stringApi.hpp
+++ b/alib2str/src/core/stringApi.hpp
@@ -9,7 +9,7 @@
 #define STRING_API_HPP_
 
 #include <alib/functional>
-#include <alib/deque>
+#include <alib/list>
 #include <alib/map>
 #include <alib/string>
 #include <alib/memory>
@@ -29,7 +29,7 @@ struct stringApi;
 
 template < >
 struct stringApi < object::Object > {
-private:
+public:
 	class GroupReader {
 	public:
 		virtual object::Object parse ( std::istream & input ) = 0;
@@ -38,11 +38,8 @@ private:
 		}
 	};
 
-	static ext::deque < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < GroupReader > > > & parseFunctions ( ) {
-		static ext::deque < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < GroupReader > > > res;
-
-		return res;
-	}
+private:
+	static ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < GroupReader > > > & parseFunctions ( );
 
 	template < class Type >
 	class ReaderRegister : public GroupReader {
@@ -54,6 +51,7 @@ private:
 		}
 	};
 
+public:
 	class GroupWriter {
 	public:
 		virtual void compose ( std::ostream & output, const object::Object & group ) = 0;
@@ -62,11 +60,8 @@ private:
 		}
 	};
 
-	static ext::map < std::string, std::unique_ptr < GroupWriter > > & composeFunctions ( ) {
-		static ext::map < std::string, std::unique_ptr < GroupWriter > > res;
-
-		return res;
-	}
+private:
+	static ext::map < std::string, std::unique_ptr < GroupWriter > > & composeFunctions ( );
 
 	template < class Type >
 	class WriterRegister : public GroupWriter {
diff --git a/alib2str/src/registry/StringReaderRegistry.cpp b/alib2str/src/registry/StringReaderRegistry.cpp
index e69c58d26d..d3d3783633 100644
--- a/alib2str/src/registry/StringReaderRegistry.cpp
+++ b/alib2str/src/registry/StringReaderRegistry.cpp
@@ -9,13 +9,18 @@
 
 namespace abstraction {
 
+ext::map < std::string, ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < StringReaderRegistry::Entry > > > > & StringReaderRegistry::getEntries ( ) {
+	static ext::map < std::string, ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < Entry > > > > readers;
+	return readers;
+}
+
 std::shared_ptr < abstraction::OperationAbstraction > StringReaderRegistry::getAbstraction ( const std::string & group, const std::string & str ) {
 	std::stringstream ss ( str );
 	while ( isspace ( ss.peek ( ) ) )
 		ss.get ( );
 
-	auto lambda = [ & ] ( const std::pair < const std::string, std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < Entry > > > & entry ) {
-		return entry.second.first ( ss );
+	auto lambda = [ & ] ( const std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < Entry > > & entry ) {
+		return entry.first ( ss );
 	};
 
 	const auto & entryIterator = getEntries ( ).find ( group );
@@ -26,14 +31,14 @@ std::shared_ptr < abstraction::OperationAbstraction > StringReaderRegistry::getA
 
 	int pos = ss.tellg();
 
-	typename ext::map < std::string, std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < Entry > > >::const_iterator callback = find_if ( entries.begin ( ), entries.end ( ), lambda );
+	typename ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < Entry > > >::const_iterator callback = find_if ( entries.begin ( ), entries.end ( ), lambda );
 	if ( callback == entries.end ( ) )
 		throw exception::CommonException ( "No callback handling input found." );
 
 	if ( pos != ss.tellg ( ) )
 		throw exception::CommonException ( "First function of registered callback moved the stream." );
 
-	return callback->second.second->getAbstraction ( );
+	return callback->second->getAbstraction ( );
 }
 
 } /* namespace abstraction */
diff --git a/alib2str/src/registry/StringReaderRegistry.hpp b/alib2str/src/registry/StringReaderRegistry.hpp
index 688572360b..b8feb2f1c1 100644
--- a/alib2str/src/registry/StringReaderRegistry.hpp
+++ b/alib2str/src/registry/StringReaderRegistry.hpp
@@ -19,6 +19,7 @@
 namespace abstraction {
 
 class StringReaderRegistry {
+public:
 	class Entry {
 	public:
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const = 0;
@@ -27,6 +28,7 @@ class StringReaderRegistry {
 		}
 	};
 
+private:
 	template < class Return >
 	class EntryImpl : public Entry {
 	public:
@@ -39,27 +41,23 @@ class StringReaderRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
 	};
 
-	static ext::map < std::string, ext::map < std::string, std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < Entry > > > > & getEntries ( ) {
-		static ext::map < std::string, ext::map < std::string, std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < Entry > > > > readers;
-		return readers;
-	}
+	static ext::map < std::string, ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < Entry > > > > & getEntries ( );
 
 public:
-	template < class Group, class ReturnType >
-	static void unregisterStringReader ( ) {
+	template < class Group >
+	static void unregisterStringReader ( ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < Entry > > >::const_iterator iter ) {
 		std::string group = ext::to_string < Group > ( );
-		std::string returnType = ext::to_string < ReturnType > ( );
 
-		getEntries ( ) [ group ].erase ( returnType );
+		getEntries ( ) [ group ].erase ( iter );
 	}
 
 	template < class Group, class ReturnType >
-	static void registerStringReader ( ) {
+	static ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < Entry > > >::const_iterator registerStringReader ( ) {
 		std::string group = ext::to_string < Group > ( );
 		std::string returnType = ext::to_string < ReturnType > ( );
 
-		if ( ! getEntries ( ) [ group ].insert ( std::make_pair ( std::move ( returnType ), std::make_pair ( core::stringApi < ReturnType >::first, std::unique_ptr < Entry > ( new EntryImpl < ReturnType > ( ) ) ) ) ).second )
-			throw std::invalid_argument ( "Entry " + returnType + " already registered in " + group + "." );
+		auto & entry = getEntries ( ) [ group ];
+		return entry.insert ( entry.end ( ), std::make_pair ( core::stringApi < ReturnType >::first, std::unique_ptr < Entry > ( new EntryImpl < ReturnType > ( ) ) ) );
 	}
 
 	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & group, const std::string & data );
diff --git a/alib2str/src/registry/StringWriterRegistry.cpp b/alib2str/src/registry/StringWriterRegistry.cpp
index cfc22761ec..99ef936ad9 100644
--- a/alib2str/src/registry/StringWriterRegistry.cpp
+++ b/alib2str/src/registry/StringWriterRegistry.cpp
@@ -9,6 +9,11 @@
 
 namespace abstraction {
 
+ext::map < std::string, std::unique_ptr < StringWriterRegistry::Entry > > & StringWriterRegistry::getEntries ( ) {
+	static ext::map < std::string, std::unique_ptr < Entry > > writers;
+	return writers;
+}
+
 std::shared_ptr < abstraction::OperationAbstraction > StringWriterRegistry::getAbstraction ( const std::string & param ) {
 	auto type = getEntries ( ).find ( param );
 	if ( type == getEntries ( ).end ( ) )
diff --git a/alib2str/src/registry/StringWriterRegistry.hpp b/alib2str/src/registry/StringWriterRegistry.hpp
index 9e4ff0573f..26e97e4e87 100644
--- a/alib2str/src/registry/StringWriterRegistry.hpp
+++ b/alib2str/src/registry/StringWriterRegistry.hpp
@@ -40,10 +40,7 @@ class StringWriterRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
 	};
 
-	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) {
-		static ext::map < std::string, std::unique_ptr < Entry > > writers;
-		return writers;
-	}
+	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( );
 
 public:
 	static void unregisterStringWriter ( std::string param ) {
diff --git a/alib2xml/src/core/xmlApi.cpp b/alib2xml/src/core/xmlApi.cpp
new file mode 100644
index 0000000000..a24de68f9f
--- /dev/null
+++ b/alib2xml/src/core/xmlApi.cpp
@@ -0,0 +1,17 @@
+#include "xmlApi.hpp"
+
+namespace core {
+
+ext::map < std::string, std::unique_ptr < xmlApi < object::Object >::GroupParser > > & xmlApi < object::Object >::parseFunctions ( ) {
+	static ext::map < std::string, std::unique_ptr < GroupParser > > res;
+
+	return res;
+}
+
+ext::map < std::string, std::unique_ptr < xmlApi < object::Object >::GroupComposer > > & xmlApi < object::Object >::composeFunctions ( ) {
+	static ext::map < std::string, std::unique_ptr < GroupComposer > > res;
+
+	return res;
+}
+
+} /* namespace core */
diff --git a/alib2xml/src/core/xmlApi.hpp b/alib2xml/src/core/xmlApi.hpp
index af6104cca6..270ca501c8 100644
--- a/alib2xml/src/core/xmlApi.hpp
+++ b/alib2xml/src/core/xmlApi.hpp
@@ -70,11 +70,7 @@ private:
 		virtual ~GroupParser ( ) noexcept = default;
 	};
 
-	static ext::map < std::string, std::unique_ptr < GroupParser > > & parseFunctions ( ) {
-		static ext::map < std::string, std::unique_ptr < GroupParser > > res;
-
-		return res;
-	}
+	static ext::map < std::string, std::unique_ptr < GroupParser > > & parseFunctions ( );
 
 	template < class Type >
 	class ParserRegister : public GroupParser {
@@ -92,11 +88,7 @@ private:
 		virtual ~GroupComposer( ) noexcept = default;
 	};
 
-	static ext::map < std::string, std::unique_ptr < GroupComposer > > & composeFunctions ( ) {
-		static ext::map < std::string, std::unique_ptr < GroupComposer > > res;
-
-		return res;
-	}
+	static ext::map < std::string, std::unique_ptr < GroupComposer > > & composeFunctions ( );
 
 	template < class Type >
 	class ComposerRegister : public GroupComposer {
diff --git a/alib2xml/src/registry/XmlComposerRegistry.cpp b/alib2xml/src/registry/XmlComposerRegistry.cpp
index 320267c699..ad298fc61e 100644
--- a/alib2xml/src/registry/XmlComposerRegistry.cpp
+++ b/alib2xml/src/registry/XmlComposerRegistry.cpp
@@ -9,6 +9,11 @@
 
 namespace abstraction {
 
+ext::map < std::string, std::unique_ptr < XmlComposerRegistry::Entry > > & XmlComposerRegistry::getEntries ( ) {
+	static ext::map < std::string, std::unique_ptr < Entry > > fileWriters;
+	return fileWriters;
+}
+
 std::shared_ptr < abstraction::OperationAbstraction > XmlComposerRegistry::getAbstraction ( const std::string & param ) {
 	auto res = getEntries ( ).find ( param );
 	if ( res == getEntries ( ).end ( ) )
diff --git a/alib2xml/src/registry/XmlComposerRegistry.hpp b/alib2xml/src/registry/XmlComposerRegistry.hpp
index 3ef67205fa..6ca9c69777 100644
--- a/alib2xml/src/registry/XmlComposerRegistry.hpp
+++ b/alib2xml/src/registry/XmlComposerRegistry.hpp
@@ -40,10 +40,7 @@ class XmlComposerRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
 	};
 
-	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) {
-		static ext::map < std::string, std::unique_ptr < Entry > > fileWriters;
-		return fileWriters;
-	}
+	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( );
 
 public:
 	static void unregisterXmlComposer ( std::string param ) {
diff --git a/alib2xml/src/registry/XmlContainerParserRegistry.cpp b/alib2xml/src/registry/XmlContainerParserRegistry.cpp
index 9aab4578a8..51f557c5a1 100644
--- a/alib2xml/src/registry/XmlContainerParserRegistry.cpp
+++ b/alib2xml/src/registry/XmlContainerParserRegistry.cpp
@@ -10,6 +10,11 @@
 
 namespace abstraction {
 
+ext::map < std::string, ext::list < ext::pair < std::string, std::shared_ptr < XmlContainerParserRegistry::Entry > > > > & XmlContainerParserRegistry::getEntries ( ) {
+	static ext::map < std::string, ext::list < ext::pair < std::string, std::shared_ptr < Entry > > > > containerGroups;
+	return containerGroups;
+}
+
 bool XmlContainerParserRegistry::hasAbstraction ( const std::string & container ) {
 	return getEntries ( ).count ( container );
 }
diff --git a/alib2xml/src/registry/XmlContainerParserRegistry.hpp b/alib2xml/src/registry/XmlContainerParserRegistry.hpp
index e13b4bb4d1..4bc2e54bf1 100644
--- a/alib2xml/src/registry/XmlContainerParserRegistry.hpp
+++ b/alib2xml/src/registry/XmlContainerParserRegistry.hpp
@@ -39,10 +39,7 @@ class XmlContainerParserRegistry {
 		}
 	};
 
-	static ext::map < std::string, ext::list < ext::pair < std::string, std::shared_ptr < Entry > > > > & getEntries ( ) {
-		static ext::map < std::string, ext::list < ext::pair < std::string, std::shared_ptr < Entry > > > > containerGroups;
-		return containerGroups;
-	};
+	static ext::map < std::string, ext::list < ext::pair < std::string, std::shared_ptr < Entry > > > > & getEntries ( );
 
 public:
 	static void unregisterSet ( std::string param ) {
diff --git a/alib2xml/src/registry/XmlParserRegistry.cpp b/alib2xml/src/registry/XmlParserRegistry.cpp
index 7eb4cff9f2..5ecc00d1de 100644
--- a/alib2xml/src/registry/XmlParserRegistry.cpp
+++ b/alib2xml/src/registry/XmlParserRegistry.cpp
@@ -9,6 +9,11 @@
 
 namespace abstraction {
 
+ext::map < std::string, std::unique_ptr < XmlParserRegistry::Entry > > & XmlParserRegistry::getEntries ( ) {
+	static ext::map < std::string, std::unique_ptr < Entry > > parsers;
+	return parsers;
+}
+
 std::shared_ptr < abstraction::OperationAbstraction > XmlParserRegistry::getAbstraction ( const std::string & typeName ) {
 	auto type = getEntries ( ).find ( typeName );
 	if ( type == getEntries ( ).end ( ) )
diff --git a/alib2xml/src/registry/XmlParserRegistry.hpp b/alib2xml/src/registry/XmlParserRegistry.hpp
index e920e20b19..22c470628a 100644
--- a/alib2xml/src/registry/XmlParserRegistry.hpp
+++ b/alib2xml/src/registry/XmlParserRegistry.hpp
@@ -39,10 +39,7 @@ class XmlParserRegistry {
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
 	};
 
-	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) {
-		static ext::map < std::string, std::unique_ptr < Entry > > parsers;
-		return parsers;
-	}
+	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( );
 
 public:
 	static void unregisterXmlParser ( std::string result ) {
-- 
GitLab