From daabc3bede5b2541a22a27393ad927246b6e26d5 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Thu, 17 Nov 2016 19:01:58 +0100
Subject: [PATCH] template nonlinearVariableSymbol symbol

---
 .../src/tree/generate/RandomTreeFactory.cpp   |  8 +-
 .../src/alphabet/NonlinearVariableSymbol.cpp  | 64 +--------------
 .../src/alphabet/NonlinearVariableSymbol.h    | 80 ++++++++++++++++++-
 alib2data/src/alphabet/SymbolFeatures.h       |  1 +
 .../src/alphabet/SymbolToStringComposer.cpp   |  4 +-
 .../src/alphabet/SymbolToStringComposer.h     |  2 +-
 alib2str/src/tree/TreeFromStringParser.cpp    |  8 +-
 7 files changed, 90 insertions(+), 77 deletions(-)

diff --git a/alib2algo/src/tree/generate/RandomTreeFactory.cpp b/alib2algo/src/tree/generate/RandomTreeFactory.cpp
index 655c0e59c7..b227061de2 100644
--- a/alib2algo/src/tree/generate/RandomTreeFactory.cpp
+++ b/alib2algo/src/tree/generate/RandomTreeFactory.cpp
@@ -165,9 +165,9 @@ struct Node {
 	std::tree < std::ranked_symbol < > > createRankedNonlinearPatternNode ( bool singleNonlinearVariable ) {
 		if ( rank == 0 ) {
 			if ( singleNonlinearVariable )
-				return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( "A" ) ) ), 0 ), { } );
+				return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( "A" ) ) ), 0 ), { } );
 			else
-				return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( symbol ) ), 0 ), { } );
+				return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( symbol ) ), 0 ), { } );
 		} else {
 			std::vector < std::tree < std::ranked_symbol < > > > children;
 			Node * nextChild = child;
@@ -373,10 +373,10 @@ RankedNonlinearPattern < > RandomTreeFactory::generateRankedNonlinearPattern ( i
 			treeRankedAlphabet.insert ( std::ranked_symbol < > ( i, it.first ) );
 
 	if ( singleNonlinearVariable )
-		nonlinearVariables.insert ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( "A" ) ) ), 0 ) );
+		nonlinearVariables.insert ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( "A" ) ) ), 0 ) );
 	else
 		for ( char i : rankedAlphabet [ 0 ] )
-			nonlinearVariables.insert ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( i ) ), 0 ) );
+			nonlinearVariables.insert ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( i ) ), 0 ) );
 
 	std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 );
 	treeRankedAlphabet.insert ( subtreeWildcard );
diff --git a/alib2data/src/alphabet/NonlinearVariableSymbol.cpp b/alib2data/src/alphabet/NonlinearVariableSymbol.cpp
index 0553135e53..b2e025120f 100644
--- a/alib2data/src/alphabet/NonlinearVariableSymbol.cpp
+++ b/alib2data/src/alphabet/NonlinearVariableSymbol.cpp
@@ -6,73 +6,13 @@
  */
 
 #include "NonlinearVariableSymbol.h"
-#include <sax/FromXMLParserHelper.h>
 #include "Symbol.h"
 #include <object/Object.h>
 #include <core/xmlApi.hpp>
-#include "UniqueSymbol.h"
-
-namespace alphabet {
-
-NonlinearVariableSymbol::NonlinearVariableSymbol ( int number ) : m_symbol ( alphabet::symbolFrom ( number ) ) {
-}
-
-NonlinearVariableSymbol::NonlinearVariableSymbol ( char character ) : m_symbol ( alphabet::symbolFrom ( character ) ) {
-}
-
-NonlinearVariableSymbol::NonlinearVariableSymbol ( std::string symbol ) : m_symbol ( alphabet::symbolFrom ( std::move ( symbol ) ) ) {
-}
-
-NonlinearVariableSymbol::NonlinearVariableSymbol ( alphabet::Symbol symbol ) : m_symbol ( std::move ( symbol ) ) {
-}
-
-SymbolBase * NonlinearVariableSymbol::clone ( ) const {
-	return new NonlinearVariableSymbol ( * this );
-}
-
-SymbolBase * NonlinearVariableSymbol::plunder ( ) && {
-	return new NonlinearVariableSymbol ( std::move ( * this ) );
-}
-
-const alphabet::Symbol& NonlinearVariableSymbol::getSymbol() const {
-	return m_symbol;
-}
-
-int NonlinearVariableSymbol::compare ( const NonlinearVariableSymbol & other ) const {
-	return this->m_symbol.getData ( ).compare ( other.m_symbol.getData ( ) );
-}
-
-void NonlinearVariableSymbol::operator >>( std::ostream & out ) const {
-	out << "(NonlinearVariableSymbol " << m_symbol << ")";
-}
-
-NonlinearVariableSymbol::operator std::string ( ) const {
-	return "$" + std::to_string ( m_symbol );
-}
-
-NonlinearVariableSymbol NonlinearVariableSymbol::parse ( std::deque < sax::Token >::iterator & input ) {
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, NonlinearVariableSymbol::getXmlTagName() );
-	alphabet::Symbol data = alib::xmlApi < alphabet::Symbol >::parse ( input );
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, NonlinearVariableSymbol::getXmlTagName() );
-
-	return NonlinearVariableSymbol ( data );
-}
-
-void NonlinearVariableSymbol::compose ( std::deque < sax::Token > & out ) const {
-	out.emplace_back ( NonlinearVariableSymbol::getXmlTagName(), sax::Token::TokenType::START_ELEMENT );
-	alib::xmlApi < alphabet::Symbol >::compose ( out, m_symbol );
-	out.emplace_back ( NonlinearVariableSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
-}
-
-SymbolBase * NonlinearVariableSymbol::inc ( ) && {
-	return new UniqueSymbol ( Symbol ( std::move ( * this ) ), primitive::Integer ( 0 ) );
-}
-
-} /* namespace alphabet */
 
 namespace alib {
 
-auto nonlinearVariableSymbolParserRegister = xmlApi < alphabet::Symbol >::ParserRegister < alphabet::NonlinearVariableSymbol > ( );
-auto nonlinearVariableSymbolParserRegister2 = xmlApi < alib::Object >::ParserRegister < alphabet::NonlinearVariableSymbol > ( );
+auto nonlinearVariableSymbolParserRegister = xmlApi < alphabet::Symbol >::ParserRegister < alphabet::NonlinearVariableSymbol < > > ( );
+auto nonlinearVariableSymbolParserRegister2 = xmlApi < alib::Object >::ParserRegister < alphabet::NonlinearVariableSymbol < > > ( );
 
 } /* namespace alib */
diff --git a/alib2data/src/alphabet/NonlinearVariableSymbol.h b/alib2data/src/alphabet/NonlinearVariableSymbol.h
index 4a5a35c149..13a8fb9bca 100644
--- a/alib2data/src/alphabet/NonlinearVariableSymbol.h
+++ b/alib2data/src/alphabet/NonlinearVariableSymbol.h
@@ -8,21 +8,26 @@
 #ifndef NONLINEAR_VARIABLE_SYMBOL_H_
 #define NONLINEAR_VARIABLE_SYMBOL_H_
 
+#include <sax/FromXMLParserHelper.h>
+
 #include "Symbol.h"
+#include "SymbolFeatures.h"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
 /**
  * Represents subtreeWildcard symbol for tree linearization.
  */
+template < class SymbolType >
 class NonlinearVariableSymbol : public SymbolBase {
-	alphabet::Symbol m_symbol;
+	SymbolType m_symbol;
 
 public:
 	explicit NonlinearVariableSymbol ( int number );
 	explicit NonlinearVariableSymbol ( char character );
 	explicit NonlinearVariableSymbol ( std::string symbol );
-	explicit NonlinearVariableSymbol ( alphabet::Symbol symbol );
+	explicit NonlinearVariableSymbol ( SymbolType symbol );
 
 	/**
 	 * Creates a subtreeWildcard symbol.
@@ -36,7 +41,7 @@ public:
 	/**
 	 * @return name of the symbol
 	 */
-	const alphabet::Symbol & getSymbol ( ) const;
+	const SymbolType & getSymbol ( ) const;
 
 	virtual int compare ( const ObjectBase & other ) const {
 		if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other );
@@ -56,13 +61,80 @@ public:
 		return xmlTagName;
 	}
 
-	static NonlinearVariableSymbol parse ( std::deque < sax::Token >::iterator & input );
+	static NonlinearVariableSymbol < SymbolType > parse ( std::deque < sax::Token >::iterator & input );
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
 	virtual SymbolBase * inc ( ) &&;
 };
 
+template < class SymbolType >
+NonlinearVariableSymbol < SymbolType >::NonlinearVariableSymbol ( int number ) : m_symbol ( alphabet::symbolFrom ( number ) ) {
+}
+
+template < class SymbolType >
+NonlinearVariableSymbol < SymbolType >::NonlinearVariableSymbol ( char character ) : m_symbol ( alphabet::symbolFrom ( character ) ) {
+}
+
+template < class SymbolType >
+NonlinearVariableSymbol < SymbolType >::NonlinearVariableSymbol ( std::string symbol ) : m_symbol ( alphabet::symbolFrom ( std::move ( symbol ) ) ) {
+}
+
+template < class SymbolType >
+NonlinearVariableSymbol < SymbolType >::NonlinearVariableSymbol ( SymbolType symbol ) : m_symbol ( std::move ( symbol ) ) {
+}
+
+template < class SymbolType >
+SymbolBase * NonlinearVariableSymbol < SymbolType >::clone ( ) const {
+	return new NonlinearVariableSymbol ( * this );
+}
+
+template < class SymbolType >
+SymbolBase * NonlinearVariableSymbol < SymbolType >::plunder ( ) && {
+	return new NonlinearVariableSymbol ( std::move ( * this ) );
+}
+
+template < class SymbolType >
+const SymbolType& NonlinearVariableSymbol < SymbolType >::getSymbol() const {
+	return m_symbol;
+}
+
+template < class SymbolType >
+int NonlinearVariableSymbol < SymbolType >::compare ( const NonlinearVariableSymbol & other ) const {
+	return this->m_symbol.getData ( ).compare ( other.m_symbol.getData ( ) );
+}
+
+template < class SymbolType >
+void NonlinearVariableSymbol < SymbolType >::operator >>( std::ostream & out ) const {
+	out << "(NonlinearVariableSymbol " << m_symbol << ")";
+}
+
+template < class SymbolType >
+NonlinearVariableSymbol < SymbolType >::operator std::string ( ) const {
+	return "$" + std::to_string ( m_symbol );
+}
+
+template < class SymbolType >
+NonlinearVariableSymbol < SymbolType > NonlinearVariableSymbol < SymbolType >::parse ( std::deque < sax::Token >::iterator & input ) {
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, NonlinearVariableSymbol::getXmlTagName() );
+	SymbolType data = alib::xmlApi < SymbolType >::parse ( input );
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, NonlinearVariableSymbol::getXmlTagName() );
+
+	return NonlinearVariableSymbol < SymbolType > ( data );
+}
+
+template < class SymbolType >
+void NonlinearVariableSymbol < SymbolType >::compose ( std::deque < sax::Token > & out ) const {
+	out.emplace_back ( NonlinearVariableSymbol::getXmlTagName(), sax::Token::TokenType::START_ELEMENT );
+	alib::xmlApi < SymbolType >::compose ( out, m_symbol );
+	out.emplace_back ( NonlinearVariableSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
+}
+
+template < class SymbolType >
+SymbolBase * NonlinearVariableSymbol < SymbolType >::inc ( ) && {
+	return new UniqueSymbol ( Symbol ( std::move ( * this ) ), primitive::Integer ( 0 ) );
+}
+
 } /* namespace alphabet */
 
 #endif /* NONLINEAR_VARIABLE_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h
index 1f4bf16672..75dfec820b 100644
--- a/alib2data/src/alphabet/SymbolFeatures.h
+++ b/alib2data/src/alphabet/SymbolFeatures.h
@@ -41,6 +41,7 @@ class RankedSymbol;
 class BarSymbol;
 class VariablesBarSymbol;
 class SubtreeWildcardSymbol;
+template < class SymbolType = Symbol >
 class NonlinearVariableSymbol;
 class SymbolPairSymbol;
 class SymbolSetSymbol;
diff --git a/alib2str/src/alphabet/SymbolToStringComposer.cpp b/alib2str/src/alphabet/SymbolToStringComposer.cpp
index 3cf32e83cf..99a6b65721 100644
--- a/alib2str/src/alphabet/SymbolToStringComposer.cpp
+++ b/alib2str/src/alphabet/SymbolToStringComposer.cpp
@@ -79,12 +79,12 @@ void SymbolToStringComposer::compose(std::ostream& out, const SubtreeWildcardSym
 
 SymbolToStringComposer::RegistratorWrapper<void, SubtreeWildcardSymbol> SymbolToStringComposerSubtreeWildcardSymbol = SymbolToStringComposer::RegistratorWrapper<void, SubtreeWildcardSymbol>(SymbolToStringComposer::compose);
 
-void SymbolToStringComposer::compose(std::ostream& out, const NonlinearVariableSymbol& symbol ) {
+void SymbolToStringComposer::compose(std::ostream& out, const NonlinearVariableSymbol < > & symbol ) {
 	out << "$";
 	alib::stringApi<alphabet::Symbol>::compose(out, symbol.getSymbol());
 }
 
-SymbolToStringComposer::RegistratorWrapper<void, NonlinearVariableSymbol> SymbolToStringComposerNonlinearVariableSymbol = SymbolToStringComposer::RegistratorWrapper<void, NonlinearVariableSymbol>(SymbolToStringComposer::compose);
+SymbolToStringComposer::RegistratorWrapper<void, NonlinearVariableSymbol < > > SymbolToStringComposerNonlinearVariableSymbol = SymbolToStringComposer::RegistratorWrapper<void, NonlinearVariableSymbol < > >(SymbolToStringComposer::compose);
 
 void SymbolToStringComposer::compose(std::ostream& out, const SymbolSetSymbol& symbol) {
 	out << '[';
diff --git a/alib2str/src/alphabet/SymbolToStringComposer.h b/alib2str/src/alphabet/SymbolToStringComposer.h
index 2930096ed8..fef4a6115c 100644
--- a/alib2str/src/alphabet/SymbolToStringComposer.h
+++ b/alib2str/src/alphabet/SymbolToStringComposer.h
@@ -29,7 +29,7 @@ public:
 	static void compose(std::ostream& output, const BarSymbol& symbol);
 	static void compose(std::ostream& output, const VariablesBarSymbol& symbol);
 	static void compose(std::ostream& output, const SubtreeWildcardSymbol& symbol);
-	static void compose(std::ostream& output, const NonlinearVariableSymbol& symbol);
+	static void compose(std::ostream& output, const NonlinearVariableSymbol < > & symbol);
 	static void compose(std::ostream& output, const SymbolPairSymbol& symbol);
 	static void compose(std::ostream& output, const SymbolSetSymbol& symbol);
 	static void compose(std::ostream& output, const UniqueSymbol& symbol);
diff --git a/alib2str/src/tree/TreeFromStringParser.cpp b/alib2str/src/tree/TreeFromStringParser.cpp
index 6c57da18cd..2f19e1d38b 100644
--- a/alib2str/src/tree/TreeFromStringParser.cpp
+++ b/alib2str/src/tree/TreeFromStringParser.cpp
@@ -38,11 +38,11 @@ Tree TreeFromStringParser::parseTree ( std::istream & input, const std::set < FE
 
 		if ( token.type == TreeFromStringLexer::TokenType::BAR ) {
 			alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD );
-			alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( token.value ) ) );
+			alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) );
 			return Tree ( UnrankedNonlinearPattern < > ( subtreeWildcard, { nonlinearVariable }, std::tree < alphabet::Symbol > ( subtreeWildcard, { } ) ) );
 		} else {
 			std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 );
-			std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( token.value ) ) ), 0 );
+			std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ), 0 );
 			return Tree ( RankedNonlinearPattern < > ( subtreeWildcard, { nonlinearVariable }, std::tree < std::ranked_symbol < > > ( nonlinearVariable, { } ) ) );
 		}
 	} else {
@@ -124,7 +124,7 @@ std::tree < std::ranked_symbol < > > TreeFromStringParser::parseRankedContent (
 		return std::tree < std::ranked_symbol < > > ( std::move ( subtreeWildcard ), { } );
 	} else if ( token.type == TreeFromStringLexer::TokenType::NONLINEAR_VARIABLE ) {
 		isPattern = true;
-		std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( token.value ) ) ), 0 );
+		std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ), 0 );
 		nonlinearVariables.insert ( nonlinearVariable );
 		return std::tree < std::ranked_symbol < > > ( std::move ( nonlinearVariable ), { } );
 	} else {
@@ -167,7 +167,7 @@ std::tree < alphabet::Symbol > TreeFromStringParser::parseUnrankedContent ( std:
 			throw exception::CommonException ( "Missing bar" );
 
 		isPattern = true;
-		alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( token.value ) ) );
+		alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) );
 		nonlinearVariables.insert ( nonlinearVariable );
 		return std::tree < alphabet::Symbol > ( std::move ( nonlinearVariable ), { } );
 	} else {
-- 
GitLab