From a2744e4f4791badbff3c698152567e9de014397b Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 14 Mar 2016 11:35:01 +0100
Subject: [PATCH] add RankedNonlinearPattern

---
 .../common/RankedNonlinearPatternAlphabet.cpp |  60 ++++++
 .../common/RankedNonlinearPatternAlphabet.h   |  59 ++++++
 .../src/tree/common/TreeFromXMLParser.cpp     |  22 +++
 alib2data/src/tree/common/TreeFromXMLParser.h |   5 +
 .../src/tree/common/TreeToXMLComposer.cpp     |  18 ++
 alib2data/src/tree/common/TreeToXMLComposer.h |   3 +
 alib2data/src/tree/ranked/RankedNode.h        |   1 +
 .../tree/ranked/RankedNonlinearPattern.cpp    | 179 ++++++++++++++++++
 .../src/tree/ranked/RankedNonlinearPattern.h  | 126 ++++++++++++
 9 files changed, 473 insertions(+)
 create mode 100644 alib2data/src/tree/common/RankedNonlinearPatternAlphabet.cpp
 create mode 100644 alib2data/src/tree/common/RankedNonlinearPatternAlphabet.h
 create mode 100644 alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
 create mode 100644 alib2data/src/tree/ranked/RankedNonlinearPattern.h

diff --git a/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.cpp b/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.cpp
new file mode 100644
index 0000000000..a57e7db2d4
--- /dev/null
+++ b/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.cpp
@@ -0,0 +1,60 @@
+/*
+ * RankedNonlinearAlphabet.cpp
+ *
+ *  Created on: Mar 13, 2016
+ *      Author: Jan Travnicek
+ */
+
+#include "RankedNonlinearPatternAlphabet.h"
+#include "../TreeException.h"
+
+#include <algorithm>
+
+namespace tree {
+
+RankedNonlinearPatternAlphabet::RankedNonlinearPatternAlphabet(alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> nonlinearVariables) : RankedPatternAlphabet(subtreeWildcard), nonlinearVariables(nonlinearVariables) {
+	for(const alphabet::RankedSymbol& symbol : nonlinearVariables) {
+		if(symbol.getRank().getData() != 0)
+			throw TreeException("Subtree wildcard symbol " + (std::string) symbol + " has nonzero rank");
+	}
+	alphabet.insert(std::move(subtreeWildcard));
+}
+
+bool RankedNonlinearPatternAlphabet::addNonlinearVariable(alphabet::RankedSymbol symbol) {
+	if (!alphabet.count(symbol))
+		throw TreeException("Subtree wildcard symbol \"" + (std::string) symbol + "\" is not in the alphabet.");
+
+	if(symbol.getRank().getData() != 0)
+		throw TreeException("Subtree wildcard symbol " + (std::string) symbol + " has nonzero rank");
+
+	return nonlinearVariables.insert(symbol).second;
+
+}
+
+void RankedNonlinearPatternAlphabet::addNonlinearVariables(std::set<alphabet::RankedSymbol> symbols) {
+	for(alphabet::RankedSymbol addedSymbol : std::move(symbols)) {
+		addSymbolToAlphabet(std::move(addedSymbol));
+	}
+}
+
+void RankedNonlinearPatternAlphabet::setNonlinearVariables(std::set<alphabet::RankedSymbol> newSymbols) {
+	std::set<alphabet::RankedSymbol> removed;
+	std::set_difference(nonlinearVariables.begin(), nonlinearVariables.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
+
+	for(const alphabet::RankedSymbol& removedSymbol : removed) {
+		removeNonlinearVariable(removedSymbol);
+	}
+
+	alphabet = std::move(newSymbols);
+}
+
+const std::set<alphabet::RankedSymbol>& RankedNonlinearPatternAlphabet::getNonlinearVariables() const {
+	return nonlinearVariables;
+}
+
+bool RankedNonlinearPatternAlphabet::removeNonlinearVariable(const alphabet::RankedSymbol& symbol) {
+	return alphabet.insert(std::move(symbol)).second;
+}
+
+} /* namespace tree */
+
diff --git a/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.h b/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.h
new file mode 100644
index 0000000000..61134e7ab2
--- /dev/null
+++ b/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.h
@@ -0,0 +1,59 @@
+/*
+ * RankedNonlinearPatternAlphabet.h
+ *
+ *  Created on: Mar 13, 2016
+ *      Author: Jan Travnicek
+ */
+
+#ifndef RANKED_NONLINEAR_PATTERN_ALPHABET_H_
+#define RANKED_NONLINEAR_PATTERN_ALPHABET_H_
+
+#include "RankedPatternAlphabet.h"
+
+namespace tree {
+
+/**
+ * Abstract base class for all strings. Contains common elements of strings.
+ */
+class RankedNonlinearPatternAlphabet : public RankedPatternAlphabet {
+protected:
+	std::set<alphabet::RankedSymbol> nonlinearVariables;
+
+public:
+	RankedNonlinearPatternAlphabet(alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> nonlinearVariables);
+
+	/**
+	 * Adds the nonlinear variable = symbol representing subtree substitution place in the pattern
+	 * @param symbol Symbol to set
+	 */
+	bool addNonlinearVariable(alphabet::RankedSymbol symbol);
+
+	/**
+	 * Adds the nonlinear variables = symbols representing subtree substitution place in the pattern
+	 * @param symbol Symbol to set
+	 */
+	void addNonlinearVariables(std::set<alphabet::RankedSymbol> symbols);
+
+	/**
+	 * Sets the nonlinear variables = symbol representing subtree substitution place in the pattern
+	 * @param symbol Symbol to set
+	 */
+	void setNonlinearVariables(std::set<alphabet::RankedSymbol> symbols);
+
+	/**
+	 * @return symbols representing nonlinear variables
+	 */
+	const std::set<alphabet::RankedSymbol> & getNonlinearVariables() const;
+
+	/**
+	 * Removes the nonlinear variable = symbol representing subtree substitution place in the pattern
+	 * @param symbol Symbol to set
+	 */
+	bool removeNonlinearVariable(const alphabet::RankedSymbol& symbol);
+
+};
+
+} /* namespace tree */
+
+#endif /* RANKED_NONLINEAR_PATTERN_ALPHABET_H_ */
+
diff --git a/alib2data/src/tree/common/TreeFromXMLParser.cpp b/alib2data/src/tree/common/TreeFromXMLParser.cpp
index 3ae21204f7..3b42f2b95c 100644
--- a/alib2data/src/tree/common/TreeFromXMLParser.cpp
+++ b/alib2data/src/tree/common/TreeFromXMLParser.cpp
@@ -117,4 +117,26 @@ UnrankedNode * TreeFromXMLParser::parseUnrankedNode ( std::deque < sax::Token >:
 	return new UnrankedNode ( symbol, children );
 }
 
+std::set < alphabet::RankedSymbol > TreeFromXMLParser::parseRankedNonlinearVariables ( std::deque < sax::Token >::iterator & input ) {
+	std::set < alphabet::RankedSymbol > rankedSymbols;
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "rankedNonlinearVariables" );
+
+	while ( sax::FromXMLParserHelper::isTokenType ( input, sax::Token::TokenType::START_ELEMENT ) )
+		rankedSymbols.insert ( alib::xmlApi < alphabet::RankedSymbol >::parse ( input ) );
+
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "rankedNonlinearVariables" );
+	return rankedSymbols;
+}
+
+std::set < alphabet::Symbol > TreeFromXMLParser::parseUnrankedNonlinearVariables ( std::deque < sax::Token >::iterator & input ) {
+	std::set < alphabet::Symbol > symbols;
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "nonlinearVariables" );
+
+	while ( sax::FromXMLParserHelper::isTokenType ( input, sax::Token::TokenType::START_ELEMENT ) )
+		symbols.insert ( alib::xmlApi < alphabet::Symbol >::parse ( input ) );
+
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "nonlinearVariables" );
+	return symbols;
+}
+
 } /* namespace tree */
diff --git a/alib2data/src/tree/common/TreeFromXMLParser.h b/alib2data/src/tree/common/TreeFromXMLParser.h
index 3a0b174d8e..400758941e 100644
--- a/alib2data/src/tree/common/TreeFromXMLParser.h
+++ b/alib2data/src/tree/common/TreeFromXMLParser.h
@@ -26,8 +26,10 @@ class TreeFromXMLParser {
 public:
 	static RankedNode * parseRankedNode ( std::deque < sax::Token >::iterator & input );
 	static UnrankedNode * parseUnrankedNode ( std::deque < sax::Token >::iterator & input );
+
 	static std::vector < alphabet::RankedSymbol > parseRankedContent ( std::deque < sax::Token >::iterator & input );
 	static std::vector < alphabet::Symbol > parseUnrankedContent ( std::deque < sax::Token >::iterator & input );
+
 	static std::set < alphabet::RankedSymbol > parseRankedAlphabet ( std::deque < sax::Token >::iterator & input );
 	static std::set < alphabet::Symbol > parseUnrankedAlphabet ( std::deque < sax::Token >::iterator & input );
 
@@ -36,6 +38,9 @@ public:
 
 	static alphabet::Symbol parseSubtreeWildcardSymbol ( std::deque < sax::Token >::iterator & input );
 	static alphabet::RankedSymbol parseSubtreeWildcardRankedSymbol ( std::deque < sax::Token >::iterator & input );
+
+	static std::set < alphabet::RankedSymbol > parseRankedNonlinearVariables ( std::deque < sax::Token >::iterator & input );
+	static std::set < alphabet::Symbol > parseUnrankedNonlinearVariables ( std::deque < sax::Token >::iterator & input );
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/common/TreeToXMLComposer.cpp b/alib2data/src/tree/common/TreeToXMLComposer.cpp
index b0bec827c0..89bee9d20f 100644
--- a/alib2data/src/tree/common/TreeToXMLComposer.cpp
+++ b/alib2data/src/tree/common/TreeToXMLComposer.cpp
@@ -90,4 +90,22 @@ void TreeToXMLComposer::composeContent ( std::deque < sax::Token > & out, const
 	out.emplace_back ( "content", sax::Token::TokenType::END_ELEMENT );
 }
 
+void TreeToXMLComposer::composeNonlinearVariables ( std::deque < sax::Token > & out, const std::set < alphabet::RankedSymbol > & symbols ) {
+	out.emplace_back ( sax::Token ( "rankedNonlinearVariables", sax::Token::TokenType::START_ELEMENT ) );
+
+	for ( const auto & symbol : symbols )
+		alib::xmlApi < alphabet::RankedSymbol >::compose ( out, symbol );
+
+	out.emplace_back ( sax::Token ( "rankedNonlinearVariables", sax::Token::TokenType::END_ELEMENT ) );
+}
+
+void TreeToXMLComposer::composeNonlinearVariables ( std::deque < sax::Token > & out, const std::set < alphabet::Symbol > & symbols ) {
+	out.emplace_back ( sax::Token ( "nonlinearVariables", sax::Token::TokenType::START_ELEMENT ) );
+
+	for ( const auto & symbol : symbols )
+		alib::xmlApi < alphabet::Symbol >::compose ( out, symbol );
+
+	out.emplace_back ( sax::Token ( "nonlinearVariables", sax::Token::TokenType::END_ELEMENT ) );
+}
+
 } /* namespace tree */
diff --git a/alib2data/src/tree/common/TreeToXMLComposer.h b/alib2data/src/tree/common/TreeToXMLComposer.h
index 8629a79ccd..8fc8e13322 100644
--- a/alib2data/src/tree/common/TreeToXMLComposer.h
+++ b/alib2data/src/tree/common/TreeToXMLComposer.h
@@ -37,6 +37,9 @@ public:
 
 	static void composeContent(std::deque<sax::Token>& out, const std::vector<alphabet::Symbol>& content);
 	static void composeContent(std::deque<sax::Token>& out, const std::vector<alphabet::RankedSymbol>& content);
+
+	static void composeNonlinearVariables(std::deque<sax::Token>& out, const std::set<alphabet::RankedSymbol>& symbols);
+	static void composeNonlinearVariables(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& symbols);
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/ranked/RankedNode.h b/alib2data/src/tree/ranked/RankedNode.h
index 99569f1acd..9303af9ec1 100644
--- a/alib2data/src/tree/ranked/RankedNode.h
+++ b/alib2data/src/tree/ranked/RankedNode.h
@@ -113,6 +113,7 @@ public:
 	friend class UnrankedPattern;
 	friend class RankedTree;
 	friend class RankedPattern;
+	friend class RankedNonlinearPattern;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
new file mode 100644
index 0000000000..c126dcc1c0
--- /dev/null
+++ b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
@@ -0,0 +1,179 @@
+/*
+ * RankedNonlinearPattern.cpp
+ *
+ *  Created on: Nov 23, 2013
+ *      Author: Jan Travnicek
+ */
+
+#include "RankedNonlinearPattern.h"
+#include <exception/AlibException.h>
+
+#include <iostream>
+#include <algorithm>
+#include <sstream>
+
+#include "../unranked/UnrankedPattern.h"
+
+#include <sax/FromXMLParserHelper.h>
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+#include "../Tree.h"
+#include "../RankedTreeWrapper.h"
+#include <object/Object.h>
+#include <XmlApi.hpp>
+#include <cast/CastApi.hpp>
+
+namespace tree {
+
+RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> nonlinearVariables, std::set < alphabet::RankedSymbol > alphabet, RankedNode pattern ) : RankedNonlinearPatternAlphabet ( std::move ( subtreeWildcard ), std::move(nonlinearVariables) ) {
+	setAlphabet ( std::move ( alphabet ) );
+	this->pattern = NULL;
+	setTree ( std::move ( pattern ) );
+}
+
+RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, RankedNode pattern ) : RankedNonlinearPatternAlphabet ( std::move ( subtreeWildcard ), {} ) {
+	pattern.computeMinimalAlphabet ( alphabet );
+	this->pattern = NULL;
+	setTree ( std::move ( pattern ) );
+}
+
+RankedNonlinearPattern::RankedNonlinearPattern ( const RankedNonlinearPattern & other ) : RankedNonlinearPatternAlphabet ( other ), pattern ( other.pattern->clone ( ) ) {
+	this->pattern->attachTree ( this );
+}
+
+RankedNonlinearPattern::RankedNonlinearPattern ( RankedNonlinearPattern && other ) noexcept : RankedNonlinearPatternAlphabet ( other ), pattern ( other.pattern ) {
+	this->pattern->attachTree ( this );
+	other.pattern = NULL;
+}
+
+RankedTreeBase * RankedNonlinearPattern::clone ( ) const {
+	return new RankedNonlinearPattern ( * this );
+}
+
+RankedTreeBase * RankedNonlinearPattern::plunder ( ) && {
+	return new RankedNonlinearPattern ( std::move ( * this ) );
+}
+
+RankedNonlinearPattern & RankedNonlinearPattern::operator =( const RankedNonlinearPattern & other ) {
+	if ( this == & other )
+		return * this;
+
+	* this = RankedNonlinearPattern ( other );
+
+	return * this;
+}
+
+RankedNonlinearPattern & RankedNonlinearPattern::operator =( RankedNonlinearPattern && other ) noexcept {
+	std::swap ( this->pattern, other.pattern );
+	std::swap ( this->alphabet, other.alphabet );
+	std::swap ( this->subtreeWildcard, other.subtreeWildcard );
+	std::swap ( this->nonlinearVariables, other.nonlinearVariables );
+
+	return * this;
+}
+
+RankedNonlinearPattern::~RankedNonlinearPattern ( ) noexcept {
+	delete pattern;
+}
+
+const RankedNode & RankedNonlinearPattern::getRoot ( ) const {
+	return * pattern;
+}
+
+RankedNode & RankedNonlinearPattern::getRoot ( ) {
+	return * pattern;
+}
+
+void RankedNonlinearPattern::setTree ( RankedNode pattern ) {
+	delete this->pattern;
+	this->pattern = std::move ( pattern ).plunder ( );
+
+	if ( !this->pattern->attachTree ( this ) ) {
+		delete this->pattern;
+		throw exception::AlibException ( "Input symbols not in the alphabet." );
+	}
+}
+
+bool RankedNonlinearPattern::removeSymbolFromAlphabet ( const alphabet::RankedSymbol & symbol ) {
+	if ( this->pattern->testSymbol ( symbol ) )
+		throw exception::AlibException ( "Input symbol \"" + ( std::string ) symbol + "\" is used." );
+
+	if ( this->subtreeWildcard == symbol )
+		throw exception::AlibException ( "Input symbol \"" + ( std::string ) symbol + "\" is subtreeWildcard." );
+
+	if ( std::any_of(this->nonlinearVariables.begin(), this->nonlinearVariables.end(), [&](const alphabet::RankedSymbol& nonlinearVariable) {
+				return nonlinearVariable == symbol;
+			} ) )
+		throw exception::AlibException ( "Input symbol \"" + ( std::string ) symbol + "\" is nonlinearVariable." );
+
+	return alphabet.erase ( symbol );
+}
+
+void RankedNonlinearPattern::operator >>( std::ostream & out ) const {
+	out << "(RankedNonlinearPattern " << * ( this->pattern ) << ")";
+}
+
+int RankedNonlinearPattern::compare ( const RankedNonlinearPattern & other ) const {
+	int res = pattern->compare ( * other.pattern );
+
+	if ( res == 0 ) {
+		std::compare < alphabet::RankedSymbol > comp;
+		res = comp ( subtreeWildcard, other.subtreeWildcard );
+	}
+
+	if ( res == 0 ) {
+		std::compare < std::set < alphabet::RankedSymbol > > comp;
+		res = comp ( nonlinearVariables, other.nonlinearVariables );
+	}
+
+	if ( res == 0 ) {
+		std::compare < std::set < alphabet::RankedSymbol > > comp;
+		res = comp ( alphabet, other.alphabet );
+	}
+
+	return res;
+}
+
+void RankedNonlinearPattern::nicePrint ( std::ostream & os ) const {
+	pattern->nicePrint ( os );
+}
+
+RankedNonlinearPattern::operator std::string ( ) const {
+	std::stringstream ss;
+	ss << * this;
+	return ss.str ( );
+}
+
+const std::string RankedNonlinearPattern::XML_TAG_NAME = "RankedNonlinearPattern";
+
+RankedNonlinearPattern RankedNonlinearPattern::parse ( std::deque < sax::Token >::iterator & input ) {
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, RankedNonlinearPattern::XML_TAG_NAME );
+	alphabet::RankedSymbol subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRankedSymbol ( input );
+	std::set < alphabet::RankedSymbol > nonlinearVariables = TreeFromXMLParser::parseRankedNonlinearVariables ( input );
+	std::set < alphabet::RankedSymbol > rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet ( input );
+	RankedNode * root = alib::xmlApi < RankedNode * >::parse ( input );
+	RankedNonlinearPattern tree ( std::move ( subtreeWildcardSymbol ), std::move( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( * root ) );
+
+	delete root;
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, RankedNonlinearPattern::XML_TAG_NAME );
+	return tree;
+}
+
+void RankedNonlinearPattern::compose ( std::deque < sax::Token > & out ) const {
+	out.emplace_back ( RankedNonlinearPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT );
+	TreeToXMLComposer::composeSubtreeWildcard ( out, subtreeWildcard );
+	TreeToXMLComposer::composeNonlinearVariables ( out, nonlinearVariables );
+	TreeToXMLComposer::composeAlphabet ( out, alphabet );
+	alib::xmlApi < RankedNode * >::compose ( out, pattern );
+	out.emplace_back ( RankedNonlinearPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT );
+}
+
+} /* namespace tree */
+
+namespace alib {
+
+auto RankedNonlinearPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::RankedNonlinearPattern > ();
+auto RankedNonlinearPatternParserRegister2 = xmlApi < tree::RankedTreeWrapper >::ParserRegister < tree::RankedNonlinearPattern > ();
+auto RankedNonlinearPatternParserRegister3 = xmlApi < alib::Object >::ParserRegister < tree::RankedNonlinearPattern > ();
+
+} /* namespace alib */
diff --git a/alib2data/src/tree/ranked/RankedNonlinearPattern.h b/alib2data/src/tree/ranked/RankedNonlinearPattern.h
new file mode 100644
index 0000000000..e81ac20518
--- /dev/null
+++ b/alib2data/src/tree/ranked/RankedNonlinearPattern.h
@@ -0,0 +1,126 @@
+/*
+ * RankedNonlinearPattern.h
+ *
+ *  Created on: Nov 23, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef RANKED_NONLINEAR_PATTERN_H_
+#define RANKED_NONLINEAR_PATTERN_H_
+
+#include <vector>
+#include <list>
+#include <string>
+#include <set>
+#include "RankedNode.h"
+#include "../RankedTreeBase.h"
+#include "../common/RankedNonlinearPatternAlphabet.h"
+
+namespace tree {
+
+class RankedNode;
+class UnrankedPattern;
+
+/**
+ * Represents regular expression parsed from the XML. Regular expression is stored
+ * as a pattern of RegExpElement.
+ */
+class RankedNonlinearPattern : public RankedTreeBase, public RankedNonlinearPatternAlphabet {
+protected:
+	RankedNode * pattern;
+
+public:
+	/**
+	 * @copydoc RankedNode::clone() const
+	 */
+	virtual RankedTreeBase * clone ( ) const;
+
+	/**
+	 * @copydoc RankedNode::plunder() const
+	 */
+	virtual RankedTreeBase * plunder ( ) &&;
+
+	explicit RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> nonlinearVariables, std::set < alphabet::RankedSymbol > alphabet, RankedNode pattern );
+	explicit RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, RankedNode pattern );
+
+	/**
+	 * Copy constructor.
+	 * @param other pattern to copy
+	 */
+	RankedNonlinearPattern ( const RankedNonlinearPattern & other );
+	RankedNonlinearPattern ( RankedNonlinearPattern && other ) noexcept;
+	RankedNonlinearPattern & operator =( const RankedNonlinearPattern & other );
+	RankedNonlinearPattern & operator =( RankedNonlinearPattern && other ) noexcept;
+	~RankedNonlinearPattern ( ) noexcept;
+
+	/**
+	 * @return Root node of the regular expression pattern
+	 */
+	const RankedNode & getRoot ( ) const;
+
+	const std::set < alphabet::RankedSymbol > & getAlphabet ( ) const {
+		return RankedNonlinearPatternAlphabet::getAlphabet ( );
+	}
+
+	void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
+	/**
+	 * @return Root node of the regular expression pattern
+	 */
+	RankedNode & getRoot ( );
+
+	/**
+	 * Sets the root node of the regular expression pattern
+	 * @param pattern root node to set
+	 */
+	void setTree ( RankedNode pattern );
+
+	/**
+	 * Removes symbol from the alphabet of symbol available in the regular expression
+	 * @param symbol removed symbol from the alphabet
+	 */
+	bool removeSymbolFromAlphabet ( const alphabet::RankedSymbol & symbol );
+
+	/**
+	 * Prints XML representation of the pattern to the output stream.
+	 * @param out output stream to which print the pattern
+	 * @param pattern pattern to print
+	 */
+	virtual void operator >>( std::ostream & out ) 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 );
+
+		return std::type_index ( typeid ( * this ) ) - std::type_index ( typeid ( other ) );
+	}
+
+	virtual int compare ( const RankedNonlinearPattern & other ) const;
+
+	void nicePrint ( std::ostream & os ) const;
+
+	virtual explicit operator std::string ( ) const;
+
+	const static std::string XML_TAG_NAME;
+
+	static RankedNonlinearPattern parse ( std::deque < sax::Token >::iterator & input );
+
+	void compose ( std::deque < sax::Token > & out ) const;
+};
+
+} /* namespace tree */
+
+namespace std {
+
+template < >
+struct compare < tree::RankedNonlinearPattern > {
+	int operator ()( const tree::RankedNonlinearPattern & first, const tree::RankedNonlinearPattern & second ) const {
+		return first.compare ( second );
+	}
+
+};
+
+} /* namespace std */
+
+#endif /* RANKED_NONLINEAR_PATTERN_H_ */
-- 
GitLab