From 1316f85edd36823172534ac5c92d1ada1cf99576 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 21 Apr 2017 13:40:34 +0200
Subject: [PATCH] + missing str callbacks for AnyObject set/unsigned

---
 .../src/object/ObjectToStringComposer.cpp     | 43 +++-------
 alib2str/src/object/ObjectToStringComposer.h  | 81 +++++++++++++++++++
 2 files changed, 90 insertions(+), 34 deletions(-)

diff --git a/alib2str/src/object/ObjectToStringComposer.cpp b/alib2str/src/object/ObjectToStringComposer.cpp
index 955e1d22bd..8ade7fa43d 100644
--- a/alib2str/src/object/ObjectToStringComposer.cpp
+++ b/alib2str/src/object/ObjectToStringComposer.cpp
@@ -52,33 +52,16 @@ void ObjectToStringComposer::compose(std::ostream& out, const Void&) {
 
 auto ObjectToStringComposerVoid = ObjectBaseDispatcher::RegistratorWrapper<void, Void>(ObjectToStringComposer::compose);
 
-template < class T, class R >
-void ObjectToStringComposer::compose(std::ostream& out, const container::ObjectsPair < T, R > & object) {
-	out << '<';
-	compose(out, object.first);
-	out << ", ";
-	compose(out, object.second);
-	out << '>';
-}
+auto ObjectToStringComposerAnyObjectSet = ObjectBaseDispatcher::RegistratorWrapper<void, AnyObject < std::set < Object > > >(ObjectToStringComposer::compose);
 
-auto ObjectToStringComposerObjectsPair = ObjectBaseDispatcher::RegistratorWrapper<void, container::ObjectsPair < Object, Object > >(ObjectToStringComposer::compose);
+auto ObjectToStringComposerAnyObjectUnsigned = ObjectBaseDispatcher::RegistratorWrapper<void, AnyObject < unsigned > >(ObjectToStringComposer::compose);
 
-template < class T >
-void ObjectToStringComposer::compose(std::ostream& out, const container::ObjectsSet < T > & object) {
-	out << '[';
-	bool first = true;
-	for(const T & innerObject : object) {
-		if(!first)
-			out << ", ";
-		else
-			first = false;
-		compose(out, innerObject);
-	}
-	out << ']';
-}
+auto ObjectToStringComposerObjectsPair = ObjectBaseDispatcher::RegistratorWrapper<void, container::ObjectsPair < Object, Object > >(ObjectToStringComposer::compose);
 
 auto ObjectToStringComposerObjectsSet = ObjectBaseDispatcher::RegistratorWrapper<void, container::ObjectsSet < Object > >(ObjectToStringComposer::compose);
 
+auto ObjectToStringComposerObjectsVector = ObjectBaseDispatcher::RegistratorWrapper<void, container::ObjectsVector < Object > >(ObjectToStringComposer::compose);
+
 // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
 void ObjectToStringComposer::compose(std::ostream& out, const primitive::String& primitive) {
@@ -105,6 +88,10 @@ void ObjectToStringComposer::compose(std::ostream& out, const primitive::Unsigne
 
 auto ObjectToStringComposerUnsigned = ObjectBaseDispatcher::RegistratorWrapper<void, primitive::Unsigned>(ObjectToStringComposer::compose);
 
+void ObjectToStringComposer::compose(std::ostream& out, unsigned primitive) {
+	out << primitive;
+}
+
 void ObjectToStringComposer::compose(std::ostream& out, const primitive::Bool& primitive) {
 	out << (primitive.getData() ? "true" : "false");
 }
@@ -191,12 +178,6 @@ void ObjectToStringComposer::compose(std::ostream& out, const alphabet::StartSym
 
 auto ObjectToStringComposerStartSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::StartSymbol>(ObjectToStringComposer::compose);
 
-template < class SymbolType, class RankType >
-void ObjectToStringComposer::compose(std::ostream& out, const alphabet::RankedSymbol < SymbolType, RankType > & symbol) {
-	compose(out, symbol.getSymbol());
-	compose(out, symbol.getRank());
-}
-
 auto ObjectToStringComposerRankedSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::RankedSymbol < > >(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::BarSymbol&) {
@@ -217,12 +198,6 @@ void ObjectToStringComposer::compose(std::ostream& out, const alphabet::SubtreeW
 
 auto ObjectToStringComposerSubtreeWildcardSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::SubtreeWildcardSymbol>(ObjectToStringComposer::compose);
 
-template < class SymbolType >
-void ObjectToStringComposer::compose(std::ostream& out, const alphabet::NonlinearVariableSymbol < SymbolType > & symbol ) {
-	out << "$";
-	compose(out, symbol.getSymbol());
-}
-
 auto ObjectToStringComposerNonlinearVariableSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::NonlinearVariableSymbol < > >(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::UniqueSymbol& symbol) {
diff --git a/alib2str/src/object/ObjectToStringComposer.h b/alib2str/src/object/ObjectToStringComposer.h
index 5cc79d1933..0ca79aff1e 100644
--- a/alib2str/src/object/ObjectToStringComposer.h
+++ b/alib2str/src/object/ObjectToStringComposer.h
@@ -14,6 +14,7 @@
 #include <object/Void.h>
 #include <container/ObjectsPair.h>
 #include <container/ObjectsSet.h>
+#include <container/ObjectsVector.h>
 
 #include "alphabet/LabeledSymbol.h"
 #include "alphabet/StartSymbol.h"
@@ -59,6 +60,7 @@ public:
 	static void compose(std::ostream& output, const primitive::String& primitive);
 	static void compose(std::ostream& output, const primitive::Character& primitive);
 	static void compose(std::ostream& output, const primitive::Unsigned& primitive);
+	static void compose(std::ostream& output, unsigned primitive);
 	static void compose(std::ostream& output, const primitive::Bool& primitive);
 
 	/**
@@ -111,15 +113,94 @@ public:
 	 */
 	static void compose(std::ostream& output, const Object& object);
 	static void compose(std::ostream& output, const Void& object);
+	template < class T >
+	static void compose(std::ostream& output, const AnyObject < T > & object);
 	template < class T, class R >
 	static void compose(std::ostream& output, const container::ObjectsPair < T, R > & object);
+	template < class T, class R >
+	static void compose(std::ostream& output, const std::pair < T, R > & object);
 	template < class T >
 	static void compose(std::ostream& output, const container::ObjectsSet < T > & object);
+	template < class T >
+	static void compose(std::ostream& output, const std::set < T > & object);
+	template < class T >
+	static void compose(std::ostream& output, const container::ObjectsVector < T > & object);
+	template < class T >
+	static void compose(std::ostream& output, const std::vector < T > & object);
 
 	static void compose(std::ostream& output, const CommonBaseBase& object);
 	static void compose(std::ostream& output, const WrapperBaseBase& object);
 };
 
+template < class SymbolType, class RankType >
+void ObjectToStringComposer::compose(std::ostream& out, const alphabet::RankedSymbol < SymbolType, RankType > & symbol) {
+	compose(out, symbol.getSymbol());
+	compose(out, symbol.getRank());
+}
+
+template < class SymbolType >
+void ObjectToStringComposer::compose(std::ostream& out, const alphabet::NonlinearVariableSymbol < SymbolType > & symbol ) {
+	out << "$";
+	compose(out, symbol.getSymbol());
+}
+
+template < class T >
+void ObjectToStringComposer::compose(std::ostream& out, const AnyObject < T > & object) {
+	compose ( out, object.getData ( ) );
+}
+
+template < class T, class R >
+void ObjectToStringComposer::compose(std::ostream& out, const container::ObjectsPair < T, R > & object) {
+	compose ( out, static_cast < const std::pair < T, R > > ( object ) );
+}
+
+template < class T, class R >
+void ObjectToStringComposer::compose(std::ostream& out, const std::pair < T, R > & object) {
+	out << '<';
+	compose(out, object.first);
+	out << ", ";
+	compose(out, object.second);
+	out << '>';
+}
+
+template < class T >
+void ObjectToStringComposer::compose(std::ostream& out, const container::ObjectsSet < T > & object) {
+	compose ( out, static_cast < const std::set < T > > ( object ) );
+}
+
+template < class T >
+void ObjectToStringComposer::compose(std::ostream& out, const std::set < T > & object) {
+	out << '[';
+	bool first = true;
+	for(const T & innerObject : object) {
+		if(!first)
+			out << ", ";
+		else
+			first = false;
+		compose(out, innerObject);
+	}
+	out << ']';
+}
+
+template < class T >
+void ObjectToStringComposer::compose(std::ostream& out, const container::ObjectsVector < T > & object) {
+	compose ( out, static_cast < const std::vector < T > > ( object ) );
+}
+
+template < class T >
+void ObjectToStringComposer::compose(std::ostream& out, const std::vector < T > & object) {
+	out << '[';
+	bool first = true;
+	for(const T & innerObject : object) {
+		if(!first)
+			out << ", ";
+		else
+			first = false;
+		compose(out, innerObject);
+	}
+	out << ']';
+}
+
 } /* namespace alib */
 
 #endif /* OBJECT_TO_STRING_COMPOSER_H_ */
-- 
GitLab