From 0554bd18bee821ec6b203510991132d84529d5b1 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sat, 19 Jan 2019 10:27:41 +0100
Subject: [PATCH] force unique wrapper registration

---
 alib2abstraction/src/common/ParamQualifiers.hpp  | 15 +++++++++++++++
 .../src/registry/AlgorithmRegistry.hpp           |  8 ++++----
 alib2data/src/PrimitiveRegistrator.cpp           |  1 -
 alib2raw/src/registration/RawRegistration.hpp    |  2 +-
 .../src/automaton/string/ObjectGroupRegister.cpp | 16 ++++++++++++++++
 .../src/grammar/string/GrammarGroupRegister.cpp  | 16 ++++++++++++++++
 .../src/object/string/ObjectGroupRegister.cpp    | 16 ++++++++++++++++
 .../src/regexp/string/RegexpGroupRegister.cpp    | 16 ++++++++++++++++
 alib2str/src/registration/StringRegistration.hpp |  7 +++++++
 .../src/string/string/StringGroupRegister.cpp    | 16 ++++++++++++++++
 alib2str/src/tree/string/TreeGroupRegister.cpp   | 16 ++++++++++++++++
 alib2xml/src/PrimitiveRegistrator.cpp            |  1 -
 12 files changed, 123 insertions(+), 7 deletions(-)
 create mode 100644 alib2str/src/automaton/string/ObjectGroupRegister.cpp
 create mode 100644 alib2str/src/grammar/string/GrammarGroupRegister.cpp
 create mode 100644 alib2str/src/object/string/ObjectGroupRegister.cpp
 create mode 100644 alib2str/src/regexp/string/RegexpGroupRegister.cpp
 create mode 100644 alib2str/src/string/string/StringGroupRegister.cpp
 create mode 100644 alib2str/src/tree/string/TreeGroupRegister.cpp

diff --git a/alib2abstraction/src/common/ParamQualifiers.hpp b/alib2abstraction/src/common/ParamQualifiers.hpp
index 01fea43d2b..7975f2f052 100644
--- a/alib2abstraction/src/common/ParamQualifiers.hpp
+++ b/alib2abstraction/src/common/ParamQualifiers.hpp
@@ -29,6 +29,21 @@ public:
 
 		return res;
 	}
+
+	friend std::ostream & operator << ( std::ostream & os, const ParamQualifier & paramQualifier ) {
+		switch ( paramQualifier ) {
+			case ParamQualifier::LREF:
+				os << "LValue reference";
+				break;
+			case ParamQualifier::RREF:
+				os << "RValue reference";
+				break;
+			case ParamQualifier::CONST:
+				os << "Constant";
+				break;
+		}
+		return os;
+	}
 };
 
 } /* namespace abstraction */
diff --git a/alib2abstraction/src/registry/AlgorithmRegistry.hpp b/alib2abstraction/src/registry/AlgorithmRegistry.hpp
index f58dc6bb58..291fdc2f09 100644
--- a/alib2abstraction/src/registry/AlgorithmRegistry.hpp
+++ b/alib2abstraction/src/registry/AlgorithmRegistry.hpp
@@ -130,7 +130,7 @@ public:
 		ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > result = convertReturnType < ReturnType > ( );
 
 		if ( isRegistered ( algorithm, templateParams, category, params ) )
-			throw std::invalid_argument ( "Callback for " + algorithm + " already registered." );
+			throw std::invalid_argument ( "Callback for " + algorithm + " with params " + ext::to_string ( params ) + " already registered." );
 
 		registerInternal ( std::move ( algorithm ), std::move ( templateParams ), category, std::move ( result ), std::move ( params ), std::make_shared < MemberImpl < ObjectType &, ReturnType, ParamTypes ... > > ( callback ) );
 	}
@@ -147,7 +147,7 @@ public:
 		ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > result = convertReturnType < ReturnType > ( );
 
 		if ( isRegistered ( algorithm, templateParams, category, params ) )
-			throw std::invalid_argument ( "Callback for " + algorithm + " already registered." );
+			throw std::invalid_argument ( "Callback for " + algorithm + " with params " + ext::to_string ( params ) + " already registered." );
 
 		registerInternal ( std::move ( algorithm ), std::move ( templateParams ), category, std::move ( result ), std::move ( params ), std::make_shared < MemberImpl < const ObjectType &, ReturnType, ParamTypes ... > > ( callback ) );
 	}
@@ -161,7 +161,7 @@ public:
 		ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > result = convertReturnType < ReturnType > ( );
 
 		if ( isRegistered ( algorithm, templateParams, category, params ) )
-			throw std::invalid_argument ( "Callback for " + algorithm + " already registered." );
+			throw std::invalid_argument ( "Callback for " + algorithm + " with params " + ext::to_string ( params ) + " already registered." );
 
 		registerInternal ( std::move ( algorithm ), std::move ( templateParams ), category, std::move ( result ), std::move ( params ), std::make_shared < EntryImpl < ReturnType, ParamTypes ... > > ( callback ) );
 	}
@@ -178,7 +178,7 @@ public:
 		ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > > result = convertReturnType < ReturnType > ( );
 
 		if ( isRegistered ( algorithm, templateParams, category, params ) )
-			return;
+			throw std::invalid_argument ( "Callback for " + algorithm + " with params " + ext::to_string ( params ) + " already registered." );
 
 		registerInternal ( std::move ( algorithm ), std::move ( templateParams ), category, std::move ( result ), std::move ( params ), std::make_shared < WrapperImpl < ReturnType, ParamTypes ... > > ( callback ) );
 	}
diff --git a/alib2data/src/PrimitiveRegistrator.cpp b/alib2data/src/PrimitiveRegistrator.cpp
index d1e5bbd2d2..a72f94cb60 100644
--- a/alib2data/src/PrimitiveRegistrator.cpp
+++ b/alib2data/src/PrimitiveRegistrator.cpp
@@ -34,7 +34,6 @@ public:
 		abstraction::XmlContainerParserRegistry::registerSet < common::ranked_symbol < object::Object, unsigned > > ( "RankedSymbol" );
 
 		registration::XmlWriterRegister < ext::set < common::ranked_symbol < object::Object, unsigned > > > ( );
-		registration::XmlWriterRegister < common::ranked_symbol < object::Object, unsigned > > ( );
 		registration::XmlWriterRegister < ext::vector < ext::map < std::pair < object::Object, object::Object >, ext::map < object::Object, object::Object > > > > ( );
 		registration::XmlWriterRegister < ext::vector < ext::vector < ext::set < object::Object > > > > ( );
 		registration::XmlWriterRegister < ext::map < common::ranked_symbol < object::Object, unsigned >, size_t > > ( );
diff --git a/alib2raw/src/registration/RawRegistration.hpp b/alib2raw/src/registration/RawRegistration.hpp
index bbb5bebf6b..f72486a3bd 100644
--- a/alib2raw/src/registration/RawRegistration.hpp
+++ b/alib2raw/src/registration/RawRegistration.hpp
@@ -37,7 +37,7 @@ class RawReaderRegister {
 public:
 	RawReaderRegister ( ) {
 		abstraction::RawReaderRegistry::registerRawReader < Type > ( );
-		abstraction::AlgorithmRegistry::registerWrapper < raw::Parse < Type >, abstraction::UnspecifiedType, const std::string & > ( raw::Parse < Type >::abstractionFromString, std::array < std::string, 1 > { { "arg0" } } );
+		abstraction::AlgorithmRegistry::registerWrapper < raw::Parse < Type >, Type, const std::string & > ( raw::Parse < Type >::abstractionFromString, std::array < std::string, 1 > { { "arg0" } } );
 	}
 };
 
diff --git a/alib2str/src/automaton/string/ObjectGroupRegister.cpp b/alib2str/src/automaton/string/ObjectGroupRegister.cpp
new file mode 100644
index 0000000000..28acf127a6
--- /dev/null
+++ b/alib2str/src/automaton/string/ObjectGroupRegister.cpp
@@ -0,0 +1,16 @@
+/*
+ * AutomatonGroupGegister.cpp
+ *
+ * Created on: Sep 27, 2017
+ * Author: Jan Travnicek
+ */
+
+#include <automaton/Automaton.h>
+
+#include <registration/StringRegistration.hpp>
+
+namespace {
+
+static auto stringReaderGroup = registration::StringReaderGroupRegister < automaton::Automaton > ( );
+
+} /* namespace */
diff --git a/alib2str/src/grammar/string/GrammarGroupRegister.cpp b/alib2str/src/grammar/string/GrammarGroupRegister.cpp
new file mode 100644
index 0000000000..6e76600cd1
--- /dev/null
+++ b/alib2str/src/grammar/string/GrammarGroupRegister.cpp
@@ -0,0 +1,16 @@
+/*
+ * GrammarGroupGegister.cpp
+ *
+ * Created on: Sep 27, 2017
+ * Author: Jan Travnicek
+ */
+
+#include <grammar/Grammar.h>
+
+#include <registration/StringRegistration.hpp>
+
+namespace {
+
+static auto stringReaderGroup = registration::StringReaderGroupRegister < grammar::Grammar > ( );
+
+} /* namespace */
diff --git a/alib2str/src/object/string/ObjectGroupRegister.cpp b/alib2str/src/object/string/ObjectGroupRegister.cpp
new file mode 100644
index 0000000000..5daacc45dd
--- /dev/null
+++ b/alib2str/src/object/string/ObjectGroupRegister.cpp
@@ -0,0 +1,16 @@
+/*
+ * ObjectGroupGegister.cpp
+ *
+ * Created on: Sep 27, 2017
+ * Author: Jan Travnicek
+ */
+
+#include <object/Object.h>
+
+#include <registration/StringRegistration.hpp>
+
+namespace {
+
+static auto stringReaderGroup = registration::StringReaderGroupRegister < object::Object > ( );
+
+} /* namespace */
diff --git a/alib2str/src/regexp/string/RegexpGroupRegister.cpp b/alib2str/src/regexp/string/RegexpGroupRegister.cpp
new file mode 100644
index 0000000000..1b615bfac9
--- /dev/null
+++ b/alib2str/src/regexp/string/RegexpGroupRegister.cpp
@@ -0,0 +1,16 @@
+/*
+ * RegExpGroupGegister.cpp
+ *
+ * Created on: Sep 27, 2017
+ * Author: Jan Travnicek
+ */
+
+#include <regexp/RegExp.h>
+
+#include <registration/StringRegistration.hpp>
+
+namespace {
+
+static auto stringReaderGroup = registration::StringReaderGroupRegister < regexp::RegExp > ( );
+
+} /* namespace */
diff --git a/alib2str/src/registration/StringRegistration.hpp b/alib2str/src/registration/StringRegistration.hpp
index 523f093ec1..38c645fb8f 100644
--- a/alib2str/src/registration/StringRegistration.hpp
+++ b/alib2str/src/registration/StringRegistration.hpp
@@ -37,6 +37,13 @@ class StringReaderRegister {
 public:
 	StringReaderRegister ( ) {
 		abstraction::StringReaderRegistry::registerStringReader < Group, Type > ( );
+	}
+};
+
+template < class Group >
+class StringReaderGroupRegister {
+public:
+	StringReaderGroupRegister ( ) {
 		abstraction::AlgorithmRegistry::registerWrapper < string::Parse < Group >, abstraction::UnspecifiedType, std::string && > ( string::Parse < Group >::abstractionFromString, std::array < std::string, 1 > { { "arg0" } } );
 	}
 };
diff --git a/alib2str/src/string/string/StringGroupRegister.cpp b/alib2str/src/string/string/StringGroupRegister.cpp
new file mode 100644
index 0000000000..bd7d54c5a7
--- /dev/null
+++ b/alib2str/src/string/string/StringGroupRegister.cpp
@@ -0,0 +1,16 @@
+/*
+ * StringGroupGegister.cpp
+ *
+ * Created on: Sep 27, 2017
+ * Author: Jan Travnicek
+ */
+
+#include <string/String.h>
+
+#include <registration/StringRegistration.hpp>
+
+namespace {
+
+static auto stringReaderGroup = registration::StringReaderGroupRegister < string::String > ( );
+
+} /* namespace */
diff --git a/alib2str/src/tree/string/TreeGroupRegister.cpp b/alib2str/src/tree/string/TreeGroupRegister.cpp
new file mode 100644
index 0000000000..128e63e599
--- /dev/null
+++ b/alib2str/src/tree/string/TreeGroupRegister.cpp
@@ -0,0 +1,16 @@
+/*
+ * TreeGroupGegister.cpp
+ *
+ * Created on: Sep 27, 2017
+ * Author: Jan Travnicek
+ */
+
+#include <tree/Tree.h>
+
+#include <registration/StringRegistration.hpp>
+
+namespace {
+
+static auto stringReaderGroup = registration::StringReaderGroupRegister < tree::Tree > ( );
+
+} /* namespace */
diff --git a/alib2xml/src/PrimitiveRegistrator.cpp b/alib2xml/src/PrimitiveRegistrator.cpp
index 5a3b8ff214..cecb0dcae2 100644
--- a/alib2xml/src/PrimitiveRegistrator.cpp
+++ b/alib2xml/src/PrimitiveRegistrator.cpp
@@ -40,7 +40,6 @@ public:
 		registration::XmlWriterRegister < ext::set < int > > ( );
 		registration::XmlWriterRegister < ext::map < object::Object, size_t > > ( );
 		registration::XmlWriterRegister < object::Object > ( );
-		registration::XmlWriterRegister < ext::set < object::Object > > ( );
 
 		abstraction::ContainerRegistry::registerSet < object::Object > ( "Object" );
 		abstraction::XmlContainerParserRegistry::registerSet < object::Object > ( "Object" );
-- 
GitLab