From 9103d09365114c776dbcd4c67f3271f8ee7194c6 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 2 Aug 2016 08:11:54 +0200
Subject: [PATCH] update strings to components2

---
 alib2data/src/string/CyclicString.cpp         | 21 +----------
 alib2data/src/string/CyclicString.h           | 24 +++++++++++--
 alib2data/src/string/Epsilon.cpp              | 20 +----------
 alib2data/src/string/Epsilon.h                | 23 ++++++++++--
 alib2data/src/string/LinearString.cpp         | 21 +----------
 alib2data/src/string/LinearString.h           | 24 +++++++++++--
 .../string/LinearStringTerminatingSymbol.cpp  | 30 +---------------
 .../string/LinearStringTerminatingSymbol.h    | 35 +++++++++++++++++--
 8 files changed, 102 insertions(+), 96 deletions(-)

diff --git a/alib2data/src/string/CyclicString.cpp b/alib2data/src/string/CyclicString.cpp
index c40c2519dc..447759ae47 100644
--- a/alib2data/src/string/CyclicString.cpp
+++ b/alib2data/src/string/CyclicString.cpp
@@ -23,7 +23,7 @@
 
 namespace string {
 
-CyclicString::CyclicString(std::set<alphabet::Symbol> alphabet, std::vector<alphabet::Symbol> data) : std::Components < CyclicString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
+CyclicString::CyclicString(std::set<alphabet::Symbol> alphabet, std::vector<alphabet::Symbol> data) : std::Components2 < CyclicString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
 	setContent(std::move(data));
 }
 
@@ -111,25 +111,6 @@ void CyclicString::compose(std::deque<sax::Token>& out) const {
 
 } /* namespace string */
 
-namespace std {
-
-template < >
-bool ::string::CyclicString::Component < ::string::CyclicString, alphabet::Symbol, ::string::GeneralAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const std::vector<alphabet::Symbol>& content = static_cast < const ::string::CyclicString * > ( this )->getContent ( );
-	return std::find(content.begin(), content.end(), symbol) != content.end();
-}
-
-template < >
-bool ::string::CyclicString::Component < ::string::CyclicString, alphabet::Symbol, ::string::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void ::string::CyclicString::Component < ::string::CyclicString, alphabet::Symbol, ::string::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto cyclicStringParserRegister = xmlApi<string::String>::ParserRegister<string::CyclicString>();
diff --git a/alib2data/src/string/CyclicString.h b/alib2data/src/string/CyclicString.h
index 2dc7b101b2..907e97ca8c 100644
--- a/alib2data/src/string/CyclicString.h
+++ b/alib2data/src/string/CyclicString.h
@@ -13,7 +13,7 @@
 #include <vector>
 
 #include "../alphabet/Symbol.h"
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
 namespace string {
 
@@ -24,7 +24,7 @@ class GeneralAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of CyclicStringElement.
  */
-class CyclicString : public StringBase, public std::Components < CyclicString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
+class CyclicString : public StringBase, public std::Components2 < CyclicString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 	std::vector < alphabet::Symbol > m_Data;
 
 public:
@@ -83,4 +83,24 @@ public:
 
 } /* namespace string */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< ::string::CyclicString, alphabet::Symbol, ::string::GeneralAlphabet > {
+public:
+	static bool used ( const ::string::CyclicString & string, const alphabet::Symbol & symbol ) {
+		const std::vector<alphabet::Symbol>& content = string.getContent ( );
+		return std::find(content.begin(), content.end(), symbol) != content.end();
+	}
+
+	static bool available ( const ::string::CyclicString &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const ::string::CyclicString &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* CYCLIC_STRING_H_ */
diff --git a/alib2data/src/string/Epsilon.cpp b/alib2data/src/string/Epsilon.cpp
index 6c88ae1802..c7022f7fa7 100644
--- a/alib2data/src/string/Epsilon.cpp
+++ b/alib2data/src/string/Epsilon.cpp
@@ -16,7 +16,7 @@
 
 namespace string {
 
-Epsilon::Epsilon(std::set<alphabet::Symbol> alphabet) : std::Components < Epsilon, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
+Epsilon::Epsilon(std::set<alphabet::Symbol> alphabet) : std::Components2 < Epsilon, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
 }
 
 Epsilon::Epsilon() : Epsilon ( std::set< alphabet::Symbol > ( ) ) {
@@ -70,24 +70,6 @@ void Epsilon::compose(std::deque<sax::Token>& out) const {
 
 } /* namespace string */
 
-namespace std {
-
-template < >
-bool ::string::Epsilon::Component < ::string::Epsilon, alphabet::Symbol, ::string::GeneralAlphabet >::used ( const alphabet::Symbol & ) const {
-	return false;
-}
-
-template < >
-bool ::string::Epsilon::Component < ::string::Epsilon, alphabet::Symbol, ::string::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void ::string::Epsilon::Component < ::string::Epsilon, alphabet::Symbol, ::string::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto epsilonParserRegister = xmlApi<string::String>::ParserRegister<string::Epsilon>();
diff --git a/alib2data/src/string/Epsilon.h b/alib2data/src/string/Epsilon.h
index b173a22a01..ede29924e8 100644
--- a/alib2data/src/string/Epsilon.h
+++ b/alib2data/src/string/Epsilon.h
@@ -13,7 +13,7 @@
 #include <vector>
 
 #include "../alphabet/Symbol.h"
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
 namespace string {
 
@@ -23,7 +23,7 @@ class GeneralAlphabet;
  * Represents epsilon. Regular expression is stored
  * as a tree of EpsilonElement.
  */
-class Epsilon : public StringBase, public std::Components < Epsilon, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
+class Epsilon : public StringBase, public std::Components2 < Epsilon, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 public:
 	Epsilon ( );
 
@@ -79,4 +79,23 @@ public:
 
 } /* namespace string */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< ::string::Epsilon, alphabet::Symbol, ::string::GeneralAlphabet > {
+public:
+	static bool used ( const ::string::Epsilon &, const alphabet::Symbol & ) {
+		return false;
+	}
+
+	static bool available ( const ::string::Epsilon &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const ::string::Epsilon &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* EPSILON_H_ */
diff --git a/alib2data/src/string/LinearString.cpp b/alib2data/src/string/LinearString.cpp
index 5b5fbc2e5d..3f87b65df4 100644
--- a/alib2data/src/string/LinearString.cpp
+++ b/alib2data/src/string/LinearString.cpp
@@ -31,7 +31,7 @@
 
 namespace string {
 
-LinearString::LinearString(std::set<alphabet::Symbol> alphabet, std::vector<alphabet::Symbol> data) : std::Components < LinearString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
+LinearString::LinearString(std::set<alphabet::Symbol> alphabet, std::vector<alphabet::Symbol> data) : std::Components2 < LinearString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) {
 	setContent(std::move(data));
 }
 
@@ -152,25 +152,6 @@ void LinearString::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace string */
 
-namespace std {
-
-template < >
-bool ::string::LinearString::Component < ::string::LinearString, alphabet::Symbol, ::string::GeneralAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const std::vector<alphabet::Symbol>& content = static_cast < const ::string::LinearString * > ( this )->getContent ( );
-	return std::find(content.begin(), content.end(), symbol) != content.end();
-}
-
-template < >
-bool ::string::LinearString::Component < ::string::LinearString, alphabet::Symbol, ::string::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void ::string::LinearString::Component < ::string::LinearString, alphabet::Symbol, ::string::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto linearStringParserRegister = xmlApi < string::String >::ParserRegister < string::LinearString > ();
diff --git a/alib2data/src/string/LinearString.h b/alib2data/src/string/LinearString.h
index 13bd6c5d09..f38569014f 100644
--- a/alib2data/src/string/LinearString.h
+++ b/alib2data/src/string/LinearString.h
@@ -13,7 +13,7 @@
 #include <vector>
 
 #include "../alphabet/Symbol.h"
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
 namespace tree {
 
@@ -36,7 +36,7 @@ class GeneralAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class LinearString : public StringBase, public std::Components < LinearString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
+class LinearString : public StringBase, public std::Components2 < LinearString, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > {
 	std::vector < alphabet::Symbol > m_Data;
 
 public:
@@ -107,4 +107,24 @@ public:
 
 } /* namespace string */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< ::string::LinearString, alphabet::Symbol, ::string::GeneralAlphabet > {
+public:
+	static bool used ( const ::string::LinearString & string, const alphabet::Symbol & symbol ) {
+		const std::vector<alphabet::Symbol>& content = string.getContent ( );
+		return std::find(content.begin(), content.end(), symbol) != content.end();
+	}
+
+	static bool available ( const ::string::LinearString &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const ::string::LinearString &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* LINEAR_STRING_H_ */
diff --git a/alib2data/src/string/LinearStringTerminatingSymbol.cpp b/alib2data/src/string/LinearStringTerminatingSymbol.cpp
index 498803f88a..598b75188a 100644
--- a/alib2data/src/string/LinearStringTerminatingSymbol.cpp
+++ b/alib2data/src/string/LinearStringTerminatingSymbol.cpp
@@ -22,7 +22,7 @@
 
 namespace string {
 
-LinearStringTerminatingSymbol::LinearStringTerminatingSymbol ( std::set < alphabet::Symbol > alphabet, alphabet::Symbol terminatingSymbol, std::vector < alphabet::Symbol > data ) : std::Components < LinearStringTerminatingSymbol, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < TerminatingSymbol > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( terminatingSymbol ) ) ) {
+LinearStringTerminatingSymbol::LinearStringTerminatingSymbol ( std::set < alphabet::Symbol > alphabet, alphabet::Symbol terminatingSymbol, std::vector < alphabet::Symbol > data ) : std::Components2 < LinearStringTerminatingSymbol, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < TerminatingSymbol > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( terminatingSymbol ) ) ) {
 	setContent ( std::move ( data ) );
 }
 
@@ -118,34 +118,6 @@ void LinearStringTerminatingSymbol::compose ( std::deque < sax::Token > & out )
 
 } /* namespace string */
 
-namespace std {
-
-template < >
-bool ::string::LinearStringTerminatingSymbol::Component < ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::GeneralAlphabet >::used ( const alphabet::Symbol & symbol ) const {
-	const std::vector<alphabet::Symbol>& content = static_cast < const ::string::LinearStringTerminatingSymbol * > ( this )->getContent ( );
-	return std::find(content.begin(), content.end(), symbol) != content.end();
-}
-
-template < >
-bool ::string::LinearStringTerminatingSymbol::Component < ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::GeneralAlphabet >::available ( const alphabet::Symbol & ) const {
-	return true;
-}
-
-template < >
-void ::string::LinearStringTerminatingSymbol::Component < ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const {
-}
-
-template < >
-bool ::string::LinearStringTerminatingSymbol::Element < ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::TerminatingSymbol >::available ( const alphabet::Symbol & symbol ) const {
-	return static_cast < const ::string::LinearStringTerminatingSymbol * > ( this )->getAlphabet ( ).count ( symbol );
-}
-
-template < >
-void ::string::LinearStringTerminatingSymbol::Element < ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::TerminatingSymbol >::valid ( const alphabet::Symbol & ) const {
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto linearStringTerminatingSymbolParserRegister = xmlApi < string::String >::ParserRegister < string::LinearStringTerminatingSymbol > ();
diff --git a/alib2data/src/string/LinearStringTerminatingSymbol.h b/alib2data/src/string/LinearStringTerminatingSymbol.h
index b7d087f251..e2f9ef56ba 100644
--- a/alib2data/src/string/LinearStringTerminatingSymbol.h
+++ b/alib2data/src/string/LinearStringTerminatingSymbol.h
@@ -14,7 +14,7 @@
 #include <vector>
 
 #include "../alphabet/Symbol.h"
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
 namespace string {
 
@@ -26,7 +26,7 @@ class TerminatingSymbol;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class LinearStringTerminatingSymbol : public StringBase, public std::Components < LinearStringTerminatingSymbol, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < TerminatingSymbol > > {
+class LinearStringTerminatingSymbol : public StringBase, public std::Components2 < LinearStringTerminatingSymbol, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < TerminatingSymbol > > {
 	std::vector < alphabet::Symbol > m_Data;
 
 public:
@@ -92,4 +92,35 @@ public:
 
 } /* namespace string */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::GeneralAlphabet > {
+public:
+	static bool used ( const ::string::LinearStringTerminatingSymbol & string, const alphabet::Symbol & symbol ) {
+		const std::vector<alphabet::Symbol>& content = string.getContent ( );
+		return std::find(content.begin(), content.end(), symbol) != content.end();
+	}
+
+	static bool available ( const ::string::LinearStringTerminatingSymbol &, const alphabet::Symbol & ) {
+		return true;
+	}
+
+	static void valid ( const ::string::LinearStringTerminatingSymbol &, const alphabet::Symbol & ) {
+	}
+};
+
+template < >
+class ElementConstraint2< ::string::LinearStringTerminatingSymbol, alphabet::Symbol, ::string::TerminatingSymbol > {
+public:
+	static bool available ( const ::string::LinearStringTerminatingSymbol & string, const alphabet::Symbol & symbol ) {
+		return string.getAlphabet ( ).count ( symbol );
+	}
+
+	static void valid ( const ::string::LinearStringTerminatingSymbol &, const alphabet::Symbol & ) {
+	}
+};
+
+} /* namespace std */
+
 #endif /* LINEAR_STRING_TERMINATING_SYMBOL_H_ */
-- 
GitLab