From 3cb2723e1f6ed71c0bdb644674aabefc9eb12169 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 11 Oct 2016 11:17:27 +0200
Subject: [PATCH] template PrefixRankedBarNonlinearPattern tree

---
 .../arbology/exact/BadCharacterShiftTable.cpp |   6 +-
 .../arbology/exact/BadCharacterShiftTable.h   |   2 +-
 .../src/arbology/exact/BoyerMooreHorspool.cpp |   4 +-
 .../src/arbology/exact/BoyerMooreHorspool.h   |   2 +-
 .../src/arbology/exact/ExactPatternMatch.cpp  |   4 +-
 .../src/arbology/exact/ExactPatternMatch.h    |   2 +-
 .../exact/ReversedBadCharacterShiftTable.cpp  |   6 +-
 .../exact/ReversedBadCharacterShiftTable.h    |   2 +-
 .../exact/ReversedBoyerMooreHorspool.cpp      |   4 +-
 .../exact/ReversedBoyerMooreHorspool.h        |   2 +-
 alib2data/src/string/LinearString.cpp         |   2 +-
 alib2data/src/string/LinearString.h           |   4 +-
 alib2data/src/tree/TreeFeatures.h             |   1 +
 .../PrefixRankedBarNonlinearPattern.cpp       | 194 +----------
 .../ranked/PrefixRankedBarNonlinearPattern.h  | 314 ++++++++++++++----
 15 files changed, 286 insertions(+), 263 deletions(-)

diff --git a/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp b/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp
index 2020a16611..855ac5eab1 100644
--- a/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp
+++ b/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp
@@ -19,12 +19,12 @@ std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const
 }
 
 std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const tree::PrefixRankedBarPattern < > & pattern ) {
-	return bcs ( tree::PrefixRankedBarNonlinearPattern ( pattern ) );
+	return bcs ( tree::PrefixRankedBarNonlinearPattern < > ( pattern ) );
 }
 
 auto BadCharacterShiftTablePrefixRankedBarPattern = BadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarPattern < > > ( BadCharacterShiftTable::bcs );
 
-std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const tree::PrefixRankedBarNonlinearPattern & pattern ) {
+std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const tree::PrefixRankedBarNonlinearPattern < > & pattern ) {
 	const std::set < std::ranked_symbol < > > & alphabet = pattern.getAlphabet ( );
 
 	std::map < std::ranked_symbol < >, size_t > bcs;
@@ -78,7 +78,7 @@ std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const
 	return bcs;
 }
 
-auto BadCharacterShiftTablePrefixRankedBarNonlinearPattern = BadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern > ( BadCharacterShiftTable::bcs );
+auto BadCharacterShiftTablePrefixRankedBarNonlinearPattern = BadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern < > > ( BadCharacterShiftTable::bcs );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/BadCharacterShiftTable.h b/alib2algo/src/arbology/exact/BadCharacterShiftTable.h
index f33aa278d1..d9fc81adb9 100644
--- a/alib2algo/src/arbology/exact/BadCharacterShiftTable.h
+++ b/alib2algo/src/arbology/exact/BadCharacterShiftTable.h
@@ -33,7 +33,7 @@ public:
 	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::RankedTreeWrapper & pattern );
 
 	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedBarPattern < > & pattern );
-	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedBarNonlinearPattern & pattern );
+	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedBarNonlinearPattern < > & pattern );
 
 };
 
diff --git a/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp b/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp
index 4e65daebb1..90d4d1f7ea 100644
--- a/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp
+++ b/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp
@@ -75,7 +75,7 @@ std::set < unsigned > BoyerMooreHorspool::match ( const tree::PrefixRankedBarTre
 
 auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarPattern = BoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( BoyerMooreHorspool::match );
 
-std::set < unsigned > BoyerMooreHorspool::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern ) {
+std::set < unsigned > BoyerMooreHorspool::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & pattern ) {
 	std::set < unsigned > occ;
 	std::map < std::ranked_symbol < >, size_t > bcs = BadCharacterShiftTable::bcs ( pattern ); //NOTE: the subjects alphabet must be a subset or equal to the pattern
 	std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject );
@@ -131,7 +131,7 @@ std::set < unsigned > BoyerMooreHorspool::match ( const tree::PrefixRankedBarTre
 	return occ;
 }
 
-auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = BoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern > ( BoyerMooreHorspool::match );
+auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = BoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( BoyerMooreHorspool::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/BoyerMooreHorspool.h b/alib2algo/src/arbology/exact/BoyerMooreHorspool.h
index 72d16c5ad6..be6136aead 100644
--- a/alib2algo/src/arbology/exact/BoyerMooreHorspool.h
+++ b/alib2algo/src/arbology/exact/BoyerMooreHorspool.h
@@ -30,7 +30,7 @@ public:
 
 	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarTree < > & pattern );
 	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarPattern < > & pattern );
-	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern );
+	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & pattern );
 
 };
 
diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
index f2ad448336..1d7b5f91a2 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
+++ b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
@@ -234,7 +234,7 @@ std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree
 
 auto ExactPatternMatchPrefixRankedBarPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( ExactPatternMatch::match );
 
-std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern ) {
+std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & pattern ) {
 	std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject );
 	std::map < std::ranked_symbol < >, alphabet::Symbol > variablesSetting;
 
@@ -275,7 +275,7 @@ std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree
 	return occ;
 }
 
-auto ExactPatternMatchPrefixRankedBarNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern > ( ExactPatternMatch::match );
+auto ExactPatternMatchPrefixRankedBarNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( ExactPatternMatch::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.h b/alib2algo/src/arbology/exact/ExactPatternMatch.h
index 09a9ea162a..41c5ac054f 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatch.h
+++ b/alib2algo/src/arbology/exact/ExactPatternMatch.h
@@ -37,7 +37,7 @@ public:
 	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern < > & pattern );
 
 	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarPattern < > & pattern );
-	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern );
+	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & pattern );
 
 private:
 	static bool matchHelper ( const std::tree < alphabet::Symbol > & subject, const std::tree < alphabet::Symbol > & pattern, const alphabet::Symbol & subtreeVariable );
diff --git a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp
index 4fb5eebb81..056b9fa245 100644
--- a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp
+++ b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp
@@ -21,12 +21,12 @@ std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs
 }
 
 std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedBarPattern < > & pattern ) {
-	return bcs ( tree::PrefixRankedBarNonlinearPattern ( pattern ) );
+	return bcs ( tree::PrefixRankedBarNonlinearPattern < > ( pattern ) );
 }
 
 auto ReversedBadCharacterShiftTablePrefixRankedBarPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarPattern < > > ( ReversedBadCharacterShiftTable::bcs );
 
-std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedBarNonlinearPattern & pattern ) {
+std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedBarNonlinearPattern < > & pattern ) {
 	const std::set < std::ranked_symbol < > > & alphabet = pattern.getAlphabet ( );
 
 	std::map < std::ranked_symbol < >, size_t > bcs;
@@ -80,7 +80,7 @@ std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs
 	return bcs;
 }
 
-auto ReversedBadCharacterShiftTablePrefixRankedBarNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern > ( ReversedBadCharacterShiftTable::bcs );
+auto ReversedBadCharacterShiftTablePrefixRankedBarNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern < > > ( ReversedBadCharacterShiftTable::bcs );
 
 std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedPattern < > & pattern ) {
 	return bcs ( tree::PrefixRankedNonlinearPattern < > ( pattern ) );
diff --git a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h
index df1e9df914..4bd37d117b 100644
--- a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h
+++ b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h
@@ -33,7 +33,7 @@ public:
 	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::RankedTreeWrapper & pattern );
 
 	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedBarPattern < > & pattern );
-	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedBarNonlinearPattern & pattern );
+	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedBarNonlinearPattern < > & pattern );
 	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedPattern < > & pattern );
 	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedNonlinearPattern < > & pattern );
 
diff --git a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp
index 9feef4ebe9..7d7574f9c4 100644
--- a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp
+++ b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp
@@ -78,7 +78,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRank
 
 auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( ReversedBoyerMooreHorspool::match );
 
-std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern ) {
+std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & pattern ) {
 	std::set < unsigned > occ;
 	std::map < std::ranked_symbol < >, size_t > bcs = ReversedBadCharacterShiftTable::bcs ( pattern ); // NOTE: the subjects alphabet must be a subset or equal to the pattern
 	std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject );
@@ -134,7 +134,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRank
 	return occ;
 }
 
-auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern > ( ReversedBoyerMooreHorspool::match );
+auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( ReversedBoyerMooreHorspool::match );
 
 std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedTree < > & pattern ) {
 	return match ( subject, tree::PrefixRankedPattern < > ( pattern ) );
diff --git a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h
index 51028ea72f..2d2f0d3c6e 100644
--- a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h
+++ b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h
@@ -30,7 +30,7 @@ public:
 
 	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarTree < > & pattern );
 	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarPattern < > & pattern );
-	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern );
+	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & pattern );
 	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedTree < > & pattern );
 	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedPattern < > & pattern );
 	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern < > & pattern );
diff --git a/alib2data/src/string/LinearString.cpp b/alib2data/src/string/LinearString.cpp
index 4ce1aa42fd..86e5bf6112 100644
--- a/alib2data/src/string/LinearString.cpp
+++ b/alib2data/src/string/LinearString.cpp
@@ -23,7 +23,7 @@ auto LinearStringFromPrefixRankedPattern = castApi::CastRegister < string::Linea
 auto LinearStringFromPrefixRankedNonlinearPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedNonlinearPattern < > > ( );
 auto LinearStringFromPrefixRankedBarTree = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarTree < > > ( );
 auto LinearStringFromPrefixRankedBarPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarPattern < > > ( );
-auto LinearStringFromPrefixRankedBarNonlinearPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarNonlinearPattern > ( );
+auto LinearStringFromPrefixRankedBarNonlinearPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarNonlinearPattern < > > ( );
 auto LinearStringFromPrefixBarTree = castApi::CastRegister < string::LinearString < >, tree::PrefixBarTree < > > ( );
 auto LinearStringCastBinder = castApi::CastPoolStringBinder < string::LinearString < > > ( string::LinearString < >::getXmlTagName() );
 
diff --git a/alib2data/src/string/LinearString.h b/alib2data/src/string/LinearString.h
index 1d1523d297..c24ec7dec1 100644
--- a/alib2data/src/string/LinearString.h
+++ b/alib2data/src/string/LinearString.h
@@ -44,7 +44,7 @@ public:
 	explicit LinearString ( const tree::PrefixRankedNonlinearPattern < > & tree );
 	explicit LinearString ( const tree::PrefixRankedBarTree < > & tree );
 	explicit LinearString ( const tree::PrefixRankedBarPattern < > & tree );
-	explicit LinearString ( const tree::PrefixRankedBarNonlinearPattern & tree );
+	explicit LinearString ( const tree::PrefixRankedBarNonlinearPattern < > & tree );
 	explicit LinearString ( const tree::PrefixBarTree < SymbolType > & tree );
 	explicit LinearString ( std::set < SymbolType > alphabet, std::vector < SymbolType > data );
 	explicit LinearString ( std::vector < SymbolType > data );
@@ -163,7 +163,7 @@ LinearString < SymbolType >::LinearString ( const tree::PrefixRankedBarPattern <
 }
 
 template < class SymbolType >
-LinearString < SymbolType >::LinearString ( const tree::PrefixRankedBarNonlinearPattern & tree ) : LinearString ( StringAuxiliary::wrapSymbols ( tree.getAlphabet ( ) ), StringAuxiliary::wrapSymbols ( tree.getContent ( ) ) ) {
+LinearString < SymbolType >::LinearString ( const tree::PrefixRankedBarNonlinearPattern < > & tree ) : LinearString ( StringAuxiliary::wrapSymbols ( tree.getAlphabet ( ) ), StringAuxiliary::wrapSymbols ( tree.getContent ( ) ) ) {
 }
 
 template < class SymbolType >
diff --git a/alib2data/src/tree/TreeFeatures.h b/alib2data/src/tree/TreeFeatures.h
index 838b1e8f14..5d36e7e644 100644
--- a/alib2data/src/tree/TreeFeatures.h
+++ b/alib2data/src/tree/TreeFeatures.h
@@ -47,6 +47,7 @@ template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsi
 class PrefixRankedNonlinearPattern;
 template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned >
 class PrefixRankedBarPattern;
+template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned >
 class PrefixRankedBarNonlinearPattern;
 template < class SymbolType = alphabet::Symbol >
 class UnrankedTree;
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp
index b93b0e4913..eb0ff1e9d4 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp
@@ -6,199 +6,23 @@
  */
 
 #include "PrefixRankedBarNonlinearPattern.h"
-
-#include <sstream>
-#include <algorithm>
-#include <deque>
-
-#include "PrefixRankedBarTree.h"
-#include "PrefixRankedBarPattern.h"
-#include "RankedTree.h"
-#include "RankedPattern.h"
-#include "RankedNonlinearPattern.h"
-
-#include <sax/FromXMLParserHelper.h>
-#include "../common/TreeFromXMLParser.h"
-#include "../common/TreeToXMLComposer.h"
-#include "../common/TreeAuxiliary.h"
 #include "../Tree.h"
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <core/xmlApi.hpp>
 #include <core/castApi.hpp>
 
-#include "../../alphabet/BarSymbol.h"
-#include "../../alphabet/VariablesBarSymbol.h"
-#include "../../alphabet/SubtreeWildcardSymbol.h"
-
-namespace tree {
-
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < > > bars, std::ranked_symbol < > variablesBar, std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::set < std::ranked_symbol < > > alphabet, std::vector < std::ranked_symbol < > > data ) : std::Components < PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, std::tuple < GeneralAlphabet, NonlinearAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ), std::move ( bars ) ), std::make_tuple ( std::move ( subtreeWildcard ), std::move ( variablesBar ) ) ) {
-	setContent ( std::move ( data ) );
-}
-
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < > > bars, std::ranked_symbol < > variablesBar, std::ranked_symbol < > subtreeWildcard, std::vector < std::ranked_symbol < > > data ) : PrefixRankedBarNonlinearPattern ( bars, variablesBar, subtreeWildcard, { }, std::set < std::ranked_symbol < > > ( data.begin ( ), data.end ( ) ) + bars + std::set < std::ranked_symbol < > > { variablesBar, subtreeWildcard }, data ) {
-}
-
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar }, variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, toPrefixRankedBar ( tree.getContent ( ), alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, barBase, variablesBar ) ) {
-}
-
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar }, variablesBar, tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar, tree.getSubtreeWildcard ( ) }, toPrefixRankedBar ( tree.getContent ( ), tree.getSubtreeWildcard ( ), { }, barBase, variablesBar ) ) {
-}
-
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar }, variablesBar, tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar, tree.getSubtreeWildcard ( ) } + tree.getNonlinearVariables ( ), toPrefixRankedBar ( tree.getContent ( ), tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), barBase, variablesBar ) ) {
-}
-
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ) + std::set < std::ranked_symbol < > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL }, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + std::set < std::ranked_symbol < > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) {
-}
-
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ), tree.getVariablesBar ( ), tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), tree.getContent ( ) ) {
-}
-
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) {
-}
-
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) {
-}
-
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) {
-}
-
-std::vector < std::ranked_symbol < > > PrefixRankedBarNonlinearPattern::toPrefixRankedBar ( const std::tree < std::ranked_symbol < > > & tree, const std::ranked_symbol < > & subtreeWildcard, const std::set < std::ranked_symbol < > > & nonlinearVariables, const alphabet::Symbol & barBase, const std::ranked_symbol < > & variablesBar ) {
-	std::vector < std::ranked_symbol < > > res;
-
-	for ( std::tree < std::ranked_symbol < > >::const_structure_iterator iter = tree.structure_begin ( ); iter != tree.structure_end ( ); ++iter )
-		if ( iter.getVirtual ( ) )
-			if ( ( * iter == subtreeWildcard ) || nonlinearVariables.count ( * iter ) )
-				res.push_back ( variablesBar );
-			else
-				res.push_back ( std::ranked_symbol < > ( barBase, iter->getRank ( ) ) );
-		else
-			res.push_back ( * iter );
-
-	return res;
-}
-
-RankedTreeBase * PrefixRankedBarNonlinearPattern::clone ( ) const {
-	return new PrefixRankedBarNonlinearPattern ( * this );
-}
-
-RankedTreeBase * PrefixRankedBarNonlinearPattern::plunder ( ) && {
-	return new PrefixRankedBarNonlinearPattern ( std::move ( * this ) );
-}
-
-const std::vector < std::ranked_symbol < > > & PrefixRankedBarNonlinearPattern::getContent ( ) const {
-	return this->m_Data;
-}
-
-void PrefixRankedBarNonlinearPattern::setContent ( std::vector < std::ranked_symbol < > > data ) {
-	arityChecksum ( data );
-
-	std::set < std::ranked_symbol < > > minimalAlphabet ( data.begin ( ), data.end ( ) );
-	std::set < std::ranked_symbol < > > unknownSymbols;
-	std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet ( ).begin ( ), getAlphabet ( ).end ( ), std::inserter ( unknownSymbols, unknownSymbols.end ( ) ) );
-
-	if ( unknownSymbols.size ( ) > 0 )
-		throw TreeException ( "Input symbols not in the alphabet." );
-
-	this->m_Data = std::move ( data );
-}
-
-void PrefixRankedBarNonlinearPattern::arityChecksum ( const std::vector < std::ranked_symbol < > > & data ) {
-	int arityChecksumTerminals = 1;
-	int arityChecksumBars = 1;
-	int arityChecksumTypes = 0;
-
-	for ( const std::ranked_symbol < > & symbol : data ) {
-		if ( getBars ( ).count ( symbol ) || ( symbol == getVariablesBar ( ) ) ) {
-			arityChecksumBars += symbol.getRank ( ).getData ( );
-			arityChecksumBars -= 1;
-			arityChecksumTypes -= 1;
-		} else {
-			arityChecksumTerminals += symbol.getRank ( ).getData ( );
-			arityChecksumTerminals -= 1;
-			arityChecksumTypes += 1;
-		}
-	}
-
-	if ( ( arityChecksumTerminals != 0 ) || ( arityChecksumBars != 0 ) || ( arityChecksumTypes != 0 ) ) throw TreeException ( "The string does not form a tree" );
-
-	for ( unsigned i = 1; i < data.size ( ); ++i )
-		if ( ( data[i - 1] == getSubtreeWildcard ( ) ) && ( data[i] != getVariablesBar ( ) ) )
-			throw TreeException ( "Inconsystency of SubtreeWildcard and variablesBar" );
-
-}
-
-bool PrefixRankedBarNonlinearPattern::isEmpty ( ) const {
-	return this->m_Data.size ( ) == 0;
-}
-
-int PrefixRankedBarNonlinearPattern::compare ( const PrefixRankedBarNonlinearPattern & other ) const {
-	auto first = std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ), getNonlinearVariables ( ), getBars ( ), getVariablesBar ( ) );
-	auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNonlinearVariables ( ), other.getBars ( ), other.getVariablesBar ( ) );
-
-	std::compare < decltype ( first ) > comp;
-
-	return comp ( first, second );
-}
-
-void PrefixRankedBarNonlinearPattern::operator >>( std::ostream & out ) const {
-	out << "(PrefixRankedBarNonlinearPattern ";
-
-	for ( const std::ranked_symbol < > & symbol : this->m_Data )
-		out << symbol;
-
-	out << ")";
-}
-
-PrefixRankedBarNonlinearPattern::operator std::string ( ) const {
-	std::stringstream ss;
-	ss << "\"";
-
-	for ( const std::ranked_symbol < > & symbol : this->m_Data )
-		ss << symbol;
-
-	ss << "\"";
-	return std::move ( ss ).str ( );
-}
-
-PrefixRankedBarNonlinearPattern PrefixRankedBarNonlinearPattern::parse ( std::deque < sax::Token >::iterator & input ) {
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, PrefixRankedBarNonlinearPattern::getXmlTagName ( ) );
-	std::set < std::ranked_symbol < > > bars = TreeFromXMLParser::parseBars ( input );
-	std::ranked_symbol < > variablesBarSymbol = TreeFromXMLParser::parseRankedVariablesBar ( input );
-	std::ranked_symbol < > subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRawRankedSymbol ( input );
-	std::set < std::ranked_symbol < > > nonlinearVariables = TreeFromXMLParser::parseRankedNonlinearVariables ( input );
-	std::set < std::ranked_symbol < > > rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet ( input );
-	std::vector < std::ranked_symbol < > > data = TreeFromXMLParser::parseRankedLinearContent ( input );
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, PrefixRankedBarNonlinearPattern::getXmlTagName ( ) );
-
-	return PrefixRankedBarNonlinearPattern ( std::move ( bars ), std::move ( variablesBarSymbol ), std::move ( subtreeWildcardSymbol ), std::move ( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( data ) );
-}
-
-void PrefixRankedBarNonlinearPattern::compose ( std::deque < sax::Token > & out ) const {
-	out.emplace_back ( PrefixRankedBarNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::START_ELEMENT );
-	TreeToXMLComposer::composeBars ( out, getBars ( ) );
-	TreeToXMLComposer::composeVariablesBar ( out, getVariablesBar ( ) );
-	TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard ( ) );
-	TreeToXMLComposer::composeNonlinearVariables ( out, getNonlinearVariables ( ) );
-	TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) );
-	TreeToXMLComposer::composeContent ( out, m_Data );
-	out.emplace_back ( PrefixRankedBarNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::END_ELEMENT );
-}
-
-} /* namespace tree */
-
 namespace alib {
 
-auto prefixRankedBarNonlinearPatternParserRegister = xmlApi < ::tree::Tree >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern > ( );
-auto prefixRankedBarNonlinearPatternParserRegister2 = xmlApi < ::tree::RankedTreeWrapper >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern > ( );
-auto prefixRankedBarNonlinearPatternParserRegister3 = xmlApi < alib::Object >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern > ( );
+auto prefixRankedBarNonlinearPatternParserRegister = xmlApi < ::tree::Tree >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern < > > ( );
+auto prefixRankedBarNonlinearPatternParserRegister2 = xmlApi < ::tree::RankedTreeWrapper >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern < > > ( );
+auto prefixRankedBarNonlinearPatternParserRegister3 = xmlApi < alib::Object >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern < > > ( );
 
-auto PrefixRankedBarNonlinearPatternFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern, ::tree::RankedTree < > > ( );
-auto PrefixRankedBarNonlinearPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern, ::tree::RankedPattern < > > ( );
-auto PrefixRankedBarNonlinearPatternFromRankedNonlinearPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern, ::tree::RankedNonlinearPattern < > > ( );
-auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarTree = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern, ::tree::PrefixRankedBarTree < > > ( );
-auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern, ::tree::PrefixRankedBarPattern < > > ( );
-auto PrefixRankedBarNonlinearPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedBarNonlinearPattern > ( ::tree::PrefixRankedBarNonlinearPattern::getXmlTagName ( ) );
+auto PrefixRankedBarNonlinearPatternFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedTree < > > ( );
+auto PrefixRankedBarNonlinearPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedPattern < > > ( );
+auto PrefixRankedBarNonlinearPatternFromRankedNonlinearPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedNonlinearPattern < > > ( );
+auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarTree = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::PrefixRankedBarTree < > > ( );
+auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::PrefixRankedBarPattern < > > ( );
+auto PrefixRankedBarNonlinearPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedBarNonlinearPattern < > > ( ::tree::PrefixRankedBarNonlinearPattern < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h
index 7df108a32c..855b370849 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h
@@ -11,12 +11,24 @@
 #include <set>
 #include <vector>
 #include <tree>
+#include <sstream>
+#include <algorithm>
+#include <deque>
+
+#include <sax/FromXMLParserHelper.h>
 #include <core/components.hpp>
+#include "alphabet/ranked_symbol.hpp"
 
 #include "../TreeFeatures.h"
 #include "../TreeException.h"
-#include "alphabet/ranked_symbol.hpp"
 #include "../RankedTreeBase.h"
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+#include "../common/TreeAuxiliary.h"
+
+#include "../../alphabet/BarSymbol.h"
+#include "../../alphabet/VariablesBarSymbol.h"
+#include "../../alphabet/SubtreeWildcardSymbol.h"
 
 namespace tree {
 
@@ -30,18 +42,19 @@ class NonlinearAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixRankedBarNonlinearPattern : public RankedTreeBase, public std::Components < PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, std::tuple < GeneralAlphabet, NonlinearAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > {
-	std::vector < std::ranked_symbol < > > m_Data;
+template < class SymbolType, class RankType >
+class PrefixRankedBarNonlinearPattern : public RankedTreeBase, public std::Components < PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, std::tuple < GeneralAlphabet, NonlinearAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > {
+	std::vector < std::ranked_symbol < SymbolType, RankType > > m_Data;
 
-	static std::vector < std::ranked_symbol < > > toPrefixRankedBar ( const std::tree < std::ranked_symbol < > > & node, const std::ranked_symbol < > & subtreeWildcard, const std::set < std::ranked_symbol < > > & nonlinearVariables, const alphabet::Symbol & barBase, const std::ranked_symbol < > & variablesBar );
+	static std::vector < std::ranked_symbol < SymbolType, RankType > > toPrefixRankedBar ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & node, const std::ranked_symbol < SymbolType, RankType > & subtreeWildcard, const std::set < std::ranked_symbol < SymbolType, RankType > > & nonlinearVariables, const alphabet::Symbol & barBase, const std::ranked_symbol < SymbolType, RankType > & variablesBar );
 
 public:
-	explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < > > bar, std::ranked_symbol < > variablesBar, std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::set < std::ranked_symbol < > > alphabet, std::vector < std::ranked_symbol < > > data );
-	explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < > > bar, std::ranked_symbol < > variablesBar, std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::vector < std::ranked_symbol < > > data );
-	explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < > > bar, std::ranked_symbol < > variablesBar, std::ranked_symbol < > subtreeWildcard, std::vector < std::ranked_symbol < > > data );
-	explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedTree < > & tree );
-	explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedPattern < > & tree );
-	explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedNonlinearPattern < > & tree );
+	explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < SymbolType, RankType > > bar, std::ranked_symbol < SymbolType, RankType > variablesBar, std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::set < std::ranked_symbol < SymbolType, RankType > > alphabet, std::vector < std::ranked_symbol < SymbolType, RankType > > data );
+	explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < SymbolType, RankType > > bar, std::ranked_symbol < SymbolType, RankType > variablesBar, std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::vector < std::ranked_symbol < SymbolType, RankType > > data );
+	explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < SymbolType, RankType > > bar, std::ranked_symbol < SymbolType, RankType > variablesBar, std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::vector < std::ranked_symbol < SymbolType, RankType > > data );
+	explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedTree < > & tree );
+	explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedPattern < > & tree );
+	explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedNonlinearPattern < > & tree );
 	explicit PrefixRankedBarNonlinearPattern ( const PrefixRankedBarTree < > & tree );
 	explicit PrefixRankedBarNonlinearPattern ( const PrefixRankedBarPattern < > & tree );
 	explicit PrefixRankedBarNonlinearPattern ( const RankedTree < > & tree );
@@ -54,35 +67,35 @@ public:
 	/**
 	 * @return List of symbols forming tree (const version).
 	 */
-	const std::vector < std::ranked_symbol < > > & getContent ( ) const;
+	const std::vector < std::ranked_symbol < SymbolType, RankType > > & getContent ( ) const;
 
-	const std::set < std::ranked_symbol < > > & getAlphabet ( ) const {
-		return accessComponent < GeneralAlphabet > ( ).get ( );
+	const std::set < std::ranked_symbol < SymbolType, RankType > > & getAlphabet ( ) const {
+		return this->template accessComponent < GeneralAlphabet > ( ).get ( );
 	}
 
-	void extendAlphabet ( const std::set < std::ranked_symbol < > > & symbols ) {
-		accessComponent < GeneralAlphabet > ( ).add ( symbols );
+	void extendAlphabet ( const std::set < std::ranked_symbol < SymbolType, RankType > > & symbols ) {
+		this->template accessComponent < GeneralAlphabet > ( ).add ( symbols );
 	}
 
-	const std::set < std::ranked_symbol < > > & getBars ( ) const {
-		return accessComponent < BarSymbols > ( ).get ( );
+	const std::set < std::ranked_symbol < SymbolType, RankType > > & getBars ( ) const {
+		return this->template accessComponent < BarSymbols > ( ).get ( );
 	}
 
-	const std::ranked_symbol < > & getSubtreeWildcard ( ) const {
-		return accessElement < SubtreeWildcard > ( ).get ( );
+	const std::ranked_symbol < SymbolType, RankType > & getSubtreeWildcard ( ) const {
+		return this->template accessElement < SubtreeWildcard > ( ).get ( );
 	}
 
-	const std::set < std::ranked_symbol < > > & getNonlinearVariables ( ) const {
-		return accessComponent < NonlinearAlphabet > ( ).get ( );
+	const std::set < std::ranked_symbol < SymbolType, RankType > > & getNonlinearVariables ( ) const {
+		return this->template accessComponent < NonlinearAlphabet > ( ).get ( );
 	}
 
-	const std::ranked_symbol < > & getVariablesBar ( ) const {
-		return accessElement < VariablesBarSymbol > ( ).get ( );
+	const std::ranked_symbol < SymbolType, RankType > & getVariablesBar ( ) const {
+		return this->template accessElement < VariablesBarSymbol > ( ).get ( );
 	}
 
-	void setContent ( std::vector < std::ranked_symbol < > > data );
+	void setContent ( std::vector < std::ranked_symbol < SymbolType, RankType > > data );
 
-	void arityChecksum ( const std::vector < std::ranked_symbol < > > & data );
+	void arityChecksum ( const std::vector < std::ranked_symbol < SymbolType, RankType > > & data );
 
 	/**
 	 * @return true if tree is an empty word (vector length is 0)
@@ -114,86 +127,271 @@ public:
 
 } /* namespace tree */
 
+#include "PrefixRankedBarTree.h"
+#include "PrefixRankedBarPattern.h"
+#include "RankedTree.h"
+#include "RankedPattern.h"
+#include "RankedNonlinearPattern.h"
+
+namespace tree {
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < SymbolType, RankType > > bars, std::ranked_symbol < SymbolType, RankType > variablesBar, std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::set < std::ranked_symbol < SymbolType, RankType > > alphabet, std::vector < std::ranked_symbol < SymbolType, RankType > > data ) : std::Components < PrefixRankedBarNonlinearPattern, std::ranked_symbol < SymbolType, RankType >, std::tuple < GeneralAlphabet, NonlinearAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ), std::move ( bars ) ), std::make_tuple ( std::move ( subtreeWildcard ), std::move ( variablesBar ) ) ) {
+	setContent ( std::move ( data ) );
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < SymbolType, RankType > > bars, std::ranked_symbol < SymbolType, RankType > variablesBar, std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::vector < std::ranked_symbol < SymbolType, RankType > > data ) : PrefixRankedBarNonlinearPattern ( bars, variablesBar, subtreeWildcard, { }, std::set < std::ranked_symbol < SymbolType, RankType > > ( data.begin ( ), data.end ( ) ) + bars + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, subtreeWildcard }, data ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar }, variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, toPrefixRankedBar ( tree.getContent ( ), alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, barBase, variablesBar ) ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar }, variablesBar, tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, tree.getSubtreeWildcard ( ) }, toPrefixRankedBar ( tree.getContent ( ), tree.getSubtreeWildcard ( ), { }, barBase, variablesBar ) ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar }, variablesBar, tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, tree.getSubtreeWildcard ( ) } + tree.getNonlinearVariables ( ), toPrefixRankedBar ( tree.getContent ( ), tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), barBase, variablesBar ) ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL }, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ), tree.getVariablesBar ( ), tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), tree.getContent ( ) ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) {
+}
+
+template < class SymbolType, class RankType >
+std::vector < std::ranked_symbol < SymbolType, RankType > > PrefixRankedBarNonlinearPattern < SymbolType, RankType >::toPrefixRankedBar ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & tree, const std::ranked_symbol < SymbolType, RankType > & subtreeWildcard, const std::set < std::ranked_symbol < SymbolType, RankType > > & nonlinearVariables, const alphabet::Symbol & barBase, const std::ranked_symbol < SymbolType, RankType > & variablesBar ) {
+	std::vector < std::ranked_symbol < SymbolType, RankType > > res;
+
+	for ( typename std::tree < std::ranked_symbol < SymbolType, RankType > >::const_structure_iterator iter = tree.structure_begin ( ); iter != tree.structure_end ( ); ++iter )
+		if ( iter.getVirtual ( ) )
+			if ( ( * iter == subtreeWildcard ) || nonlinearVariables.count ( * iter ) )
+				res.push_back ( variablesBar );
+			else
+				res.push_back ( std::ranked_symbol < SymbolType, RankType > ( barBase, iter->getRank ( ) ) );
+		else
+			res.push_back ( * iter );
+
+	return res;
+}
+
+template < class SymbolType, class RankType >
+RankedTreeBase * PrefixRankedBarNonlinearPattern < SymbolType, RankType >::clone ( ) const {
+	return new PrefixRankedBarNonlinearPattern ( * this );
+}
+
+template < class SymbolType, class RankType >
+RankedTreeBase * PrefixRankedBarNonlinearPattern < SymbolType, RankType >::plunder ( ) && {
+	return new PrefixRankedBarNonlinearPattern ( std::move ( * this ) );
+}
+
+template < class SymbolType, class RankType >
+const std::vector < std::ranked_symbol < SymbolType, RankType > > & PrefixRankedBarNonlinearPattern < SymbolType, RankType >::getContent ( ) const {
+	return this->m_Data;
+}
+
+template < class SymbolType, class RankType >
+void PrefixRankedBarNonlinearPattern < SymbolType, RankType >::setContent ( std::vector < std::ranked_symbol < SymbolType, RankType > > data ) {
+	arityChecksum ( data );
+
+	std::set < std::ranked_symbol < SymbolType, RankType > > minimalAlphabet ( data.begin ( ), data.end ( ) );
+	std::set < std::ranked_symbol < SymbolType, RankType > > unknownSymbols;
+	std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet ( ).begin ( ), getAlphabet ( ).end ( ), std::inserter ( unknownSymbols, unknownSymbols.end ( ) ) );
+
+	if ( unknownSymbols.size ( ) > 0 )
+		throw TreeException ( "Input symbols not in the alphabet." );
+
+	this->m_Data = std::move ( data );
+}
+
+template < class SymbolType, class RankType >
+void PrefixRankedBarNonlinearPattern < SymbolType, RankType >::arityChecksum ( const std::vector < std::ranked_symbol < SymbolType, RankType > > & data ) {
+	int arityChecksumTerminals = 1;
+	int arityChecksumBars = 1;
+	int arityChecksumTypes = 0;
+
+	for ( const std::ranked_symbol < SymbolType, RankType > & symbol : data ) {
+		if ( getBars ( ).count ( symbol ) || ( symbol == getVariablesBar ( ) ) ) {
+			arityChecksumBars += symbol.getRank ( ).getData ( );
+			arityChecksumBars -= 1;
+			arityChecksumTypes -= 1;
+		} else {
+			arityChecksumTerminals += symbol.getRank ( ).getData ( );
+			arityChecksumTerminals -= 1;
+			arityChecksumTypes += 1;
+		}
+	}
+
+	if ( ( arityChecksumTerminals != 0 ) || ( arityChecksumBars != 0 ) || ( arityChecksumTypes != 0 ) ) throw TreeException ( "The string does not form a tree" );
+
+	for ( unsigned i = 1; i < data.size ( ); ++i )
+		if ( ( data[i - 1] == getSubtreeWildcard ( ) ) && ( data[i] != getVariablesBar ( ) ) )
+			throw TreeException ( "Inconsystency of SubtreeWildcard and variablesBar" );
+
+}
+
+template < class SymbolType, class RankType >
+bool PrefixRankedBarNonlinearPattern < SymbolType, RankType >::isEmpty ( ) const {
+	return this->m_Data.size ( ) == 0;
+}
+
+template < class SymbolType, class RankType >
+int PrefixRankedBarNonlinearPattern < SymbolType, RankType >::compare ( const PrefixRankedBarNonlinearPattern & other ) const {
+	auto first = std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ), getNonlinearVariables ( ), getBars ( ), getVariablesBar ( ) );
+	auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNonlinearVariables ( ), other.getBars ( ), other.getVariablesBar ( ) );
+
+	std::compare < decltype ( first ) > comp;
+
+	return comp ( first, second );
+}
+
+template < class SymbolType, class RankType >
+void PrefixRankedBarNonlinearPattern < SymbolType, RankType >::operator >>( std::ostream & out ) const {
+	out << "(PrefixRankedBarNonlinearPattern ";
+
+	for ( const std::ranked_symbol < SymbolType, RankType > & symbol : this->m_Data )
+		out << symbol;
+
+	out << ")";
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::operator std::string ( ) const {
+	std::stringstream ss;
+	ss << "\"";
+
+	for ( const std::ranked_symbol < SymbolType, RankType > & symbol : this->m_Data )
+		ss << symbol;
+
+	ss << "\"";
+	return std::move ( ss ).str ( );
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedBarNonlinearPattern < SymbolType, RankType > PrefixRankedBarNonlinearPattern < SymbolType, RankType >::parse ( std::deque < sax::Token >::iterator & input ) {
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, PrefixRankedBarNonlinearPattern::getXmlTagName ( ) );
+	std::set < std::ranked_symbol < SymbolType, RankType > > bars = TreeFromXMLParser::parseBars ( input );
+	std::ranked_symbol < SymbolType, RankType > variablesBarSymbol = TreeFromXMLParser::parseRankedVariablesBar ( input );
+	std::ranked_symbol < SymbolType, RankType > subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRawRankedSymbol ( input );
+	std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables = TreeFromXMLParser::parseRankedNonlinearVariables ( input );
+	std::set < std::ranked_symbol < SymbolType, RankType > > rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet ( input );
+	std::vector < std::ranked_symbol < SymbolType, RankType > > data = TreeFromXMLParser::parseRankedLinearContent ( input );
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, PrefixRankedBarNonlinearPattern::getXmlTagName ( ) );
+
+	return PrefixRankedBarNonlinearPattern < SymbolType, RankType > ( std::move ( bars ), std::move ( variablesBarSymbol ), std::move ( subtreeWildcardSymbol ), std::move ( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( data ) );
+}
+
+template < class SymbolType, class RankType >
+void PrefixRankedBarNonlinearPattern < SymbolType, RankType >::compose ( std::deque < sax::Token > & out ) const {
+	out.emplace_back ( PrefixRankedBarNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::START_ELEMENT );
+	TreeToXMLComposer::composeBars ( out, getBars ( ) );
+	TreeToXMLComposer::composeVariablesBar ( out, getVariablesBar ( ) );
+	TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard ( ) );
+	TreeToXMLComposer::composeNonlinearVariables ( out, getNonlinearVariables ( ) );
+	TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) );
+	TreeToXMLComposer::composeContent ( out, m_Data );
+	out.emplace_back ( PrefixRankedBarNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::END_ELEMENT );
+}
+
+} /* namespace tree */
+
 namespace std {
 
-template < >
-class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, ::tree::GeneralAlphabet > {
+template < class SymbolType, class RankType >
+class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::GeneralAlphabet > {
 public:
-	static bool used ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) {
-		const std::vector < std::ranked_symbol < > > & content = pattern.getContent ( );
+	static bool used ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) {
+		const std::vector < std::ranked_symbol < SymbolType, RankType > > & content = pattern.getContent ( );
 
-		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.accessElement < ::tree::VariablesBarSymbol > ( ).get ( ) == symbol || pattern.accessComponent < ::tree::BarSymbols > ( ).get ( ).count ( symbol ) || pattern.accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol;
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.template accessElement < ::tree::VariablesBarSymbol > ( ).get ( ) == symbol || pattern.template accessComponent < ::tree::BarSymbols > ( ).get ( ).count ( symbol ) || pattern.template accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol;
 	}
 
-	static bool available ( const ::tree::PrefixRankedBarNonlinearPattern &, const std::ranked_symbol < > & ) {
+	static bool available ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) {
 		return true;
 	}
 
-	static void valid ( const ::tree::PrefixRankedBarNonlinearPattern &, const std::ranked_symbol < > & ) {
+	static void valid ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) {
 	}
 };
 
-template < >
-class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, ::tree::BarSymbols > {
+template < class SymbolType, class RankType >
+class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::BarSymbols > {
 public:
-	static bool used ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) {
-		const std::vector < std::ranked_symbol < > > & content = pattern.getContent ( );
+	static bool used ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) {
+		const std::vector < std::ranked_symbol < SymbolType, RankType > > & content = pattern.getContent ( );
 
-		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.accessElement < ::tree::VariablesBarSymbol > ( ).get ( ) == symbol;
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.template accessElement < ::tree::VariablesBarSymbol > ( ).get ( ) == symbol;
 	}
 
-	static bool available ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) {
-		return pattern.accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	static bool available ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) {
+		return pattern.template accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
 	}
 
-	static void valid ( const ::tree::PrefixRankedBarNonlinearPattern &, const std::ranked_symbol < > & ) {
+	static void valid ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) {
 	}
 };
 
-template < >
-class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, ::tree::NonlinearAlphabet > {
+template < class SymbolType, class RankType >
+class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::NonlinearAlphabet > {
 public:
-	static bool used ( const ::tree::PrefixRankedBarNonlinearPattern &, const std::ranked_symbol < > & ) {
+	static bool used ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) {
 		return false;
 	}
 
-	static bool available ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) {
-		return pattern.accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	static bool available ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) {
+		return pattern.template accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
 	}
 
-	static void valid ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol) {
+	static void valid ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol) {
 		if ( symbol.getRank ( ).getData ( ) != 0 )
 			throw ::tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
 
-		if ( pattern.accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol )
+		if ( pattern.template accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol )
 			throw ::tree::TreeException ( "Symbol " + std::to_string ( symbol ) + "cannot be set as nonlinear variable since it is already subtree wildcard" );
 	}
 };
 
-template < >
-class ElementConstraint< ::tree::PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, ::tree::SubtreeWildcard > {
+template < class SymbolType, class RankType >
+class ElementConstraint< ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::SubtreeWildcard > {
 public:
-	static bool available ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) {
-		return pattern.accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	static bool available ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) {
+		return pattern.template accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
 	}
 
-	static void valid ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol) {
+	static void valid ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol) {
 		if ( symbol.getRank ( ).getData ( ) != 0 )
 			throw ::tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
 
-		if ( pattern.accessComponent < ::tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
+		if ( pattern.template accessComponent < ::tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
 			throw ::tree::TreeException ( "Symbol " + std::to_string ( symbol ) + "cannot be set as subtree wildcard since it is already nonlinear variable" );
 	}
 };
 
-template < >
-class ElementConstraint< ::tree::PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, ::tree::VariablesBarSymbol > {
+template < class SymbolType, class RankType >
+class ElementConstraint< ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::VariablesBarSymbol > {
 public:
-	static bool available ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) {
-		return pattern.accessComponent < ::tree::BarSymbols > ( ).get ( ).count ( symbol );
+	static bool available ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) {
+		return pattern.template accessComponent < ::tree::BarSymbols > ( ).get ( ).count ( symbol );
 	}
 
-	static void valid ( const ::tree::PrefixRankedBarNonlinearPattern &, const std::ranked_symbol < > & symbol) {
+	static void valid ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & symbol) {
 		if ( symbol.getRank ( ).getData ( ) != 0 )
 			throw ::tree::TreeException ( "VariablesBarSymbol has nonzero arity" );
 	}
-- 
GitLab