From 4afbcd17ccfa45629944a94728b0b2b8ced6d8e0 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 2 Aug 2016 09:00:09 +0200
Subject: [PATCH] start updating tree data structures to components2

---
 .../PrefixRankedBarNonlinearPattern.cpp       | 95 +------------------
 .../ranked/PrefixRankedBarNonlinearPattern.h  | 92 +++++++++++++++++-
 .../tree/ranked/PrefixRankedBarPattern.cpp    | 65 +------------
 .../src/tree/ranked/PrefixRankedBarPattern.h  | 69 +++++++++++++-
 4 files changed, 159 insertions(+), 162 deletions(-)

diff --git a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp
index 36908aad28..768b55e8be 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "PrefixRankedBarNonlinearPattern.h"
-#include "../TreeException.h"
 
 #include <sstream>
 #include <algorithm>
@@ -34,7 +33,7 @@
 
 namespace tree {
 
-PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( std::set < alphabet::RankedSymbol > bars, alphabet::RankedSymbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, 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 ) ) ) {
+PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( std::set < alphabet::RankedSymbol > bars, alphabet::RankedSymbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components2 < PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, 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 ) );
 }
 
@@ -195,98 +194,6 @@ void PrefixRankedBarNonlinearPattern::compose ( std::deque < sax::Token > & out
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::PrefixRankedBarNonlinearPattern::Component < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarNonlinearPattern * pattern = static_cast < const tree::PrefixRankedBarNonlinearPattern * > ( this );
-	const std::vector < alphabet::RankedSymbol > & 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;
-}
-
-template < >
-bool tree::PrefixRankedBarNonlinearPattern::Component < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const {
-	return true;
-}
-
-template < >
-void tree::PrefixRankedBarNonlinearPattern::Component < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-template < >
-bool tree::PrefixRankedBarNonlinearPattern::Component < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::BarSymbols >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarNonlinearPattern * pattern = static_cast < const tree::PrefixRankedBarNonlinearPattern * > ( this );
-	const std::vector < alphabet::RankedSymbol > & content = pattern->getContent ( );
-
-	return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern->accessElement < tree::VariablesBarSymbol > ( ).get ( ) == symbol;
-}
-
-template < >
-bool tree::PrefixRankedBarNonlinearPattern::Component < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::BarSymbols >::available ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarNonlinearPattern * pattern = static_cast < const tree::PrefixRankedBarNonlinearPattern * > ( this );
-
-	return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedBarNonlinearPattern::Component < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::BarSymbols >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-template < >
-bool tree::PrefixRankedBarNonlinearPattern::Component < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::used ( const alphabet::RankedSymbol & ) const {
-	return false;
-}
-
-template < >
-bool tree::PrefixRankedBarNonlinearPattern::Component < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::available ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarNonlinearPattern * pattern = static_cast < const tree::PrefixRankedBarNonlinearPattern * > ( this );
-
-	return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedBarNonlinearPattern::Component < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarNonlinearPattern * pattern = static_cast < const tree::PrefixRankedBarNonlinearPattern * > ( this );
-
-	if ( symbol.getRank ( ).getData ( ) != 0 )
-		throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
-
-	if ( pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol )
-		throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as nonlinear variable since it is already subtree wildcard" );
-}
-
-template < >
-bool tree::PrefixRankedBarNonlinearPattern::Element < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::available ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarNonlinearPattern * pattern = static_cast < const tree::PrefixRankedBarNonlinearPattern * > ( this );
-
-	return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedBarNonlinearPattern::Element < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarNonlinearPattern * pattern = static_cast < const tree::PrefixRankedBarNonlinearPattern * > ( this );
-
-	if ( symbol.getRank ( ).getData ( ) != 0 )
-		throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
-
-	if ( pattern->accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
-		throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as subtree wildcard since it is already nonlinear variable" );
-}
-
-template < >
-bool tree::PrefixRankedBarNonlinearPattern::Element < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::VariablesBarSymbol >::available ( const alphabet::RankedSymbol & symbol ) const {
-	return static_cast < const tree::PrefixRankedBarNonlinearPattern * > ( this )->accessComponent < tree::BarSymbols > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedBarNonlinearPattern::Element < tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::VariablesBarSymbol >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	if ( symbol.getRank ( ).getData ( ) != 0 )
-		throw tree::TreeException ( "VariablesBarSymbol has nonzero arity" );
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto prefixRankedBarNonlinearPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedBarNonlinearPattern > ( );
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h
index 2d6a65df55..1f450ea0e1 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h
@@ -10,8 +10,9 @@
 
 #include <set>
 #include <vector>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "../../alphabet/RankedSymbol.h"
 #include "../RankedTreeBase.h"
 #include "RankedNode.h"
@@ -33,7 +34,7 @@ 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, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > {
+class PrefixRankedBarNonlinearPattern : public RankedTreeBase, public std::Components2 < PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
 	static void toPrefixRankedBar ( const RankedNode & node, const alphabet::RankedSymbol & subtreeWildcard, const std::set < alphabet::RankedSymbol > & nonlinearVariables, const alphabet::Symbol & barBase, const alphabet::RankedSymbol & variablesBar, std::vector < alphabet::RankedSymbol > & linearNotation );
@@ -118,4 +119,91 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::PrefixRankedBarNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		const std::vector < alphabet::RankedSymbol > & 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;
+	}
+
+	static bool available ( const tree::PrefixRankedBarNonlinearPattern &, const alphabet::RankedSymbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::PrefixRankedBarNonlinearPattern &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::BarSymbols > {
+public:
+	static bool used ( const tree::PrefixRankedBarNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		const std::vector < alphabet::RankedSymbol > & content = pattern.getContent ( );
+
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.accessElement < tree::VariablesBarSymbol > ( ).get ( ) == symbol;
+	}
+
+	static bool available ( const tree::PrefixRankedBarNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixRankedBarNonlinearPattern &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet > {
+public:
+	static bool used ( const tree::PrefixRankedBarNonlinearPattern &, const alphabet::RankedSymbol & ) {
+		return false;
+	}
+
+	static bool available ( const tree::PrefixRankedBarNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixRankedBarNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol) {
+		if ( symbol.getRank ( ).getData ( ) != 0 )
+			throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
+
+		if ( pattern.accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol )
+			throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as nonlinear variable since it is already subtree wildcard" );
+	}
+};
+
+template < >
+class ElementConstraint2< tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard > {
+public:
+	static bool available ( const tree::PrefixRankedBarNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixRankedBarNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol) {
+		if ( symbol.getRank ( ).getData ( ) != 0 )
+			throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
+
+		if ( pattern.accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
+			throw tree::TreeException ( "Symbol " + ( std::string ) symbol + "cannot be set as subtree wildcard since it is already nonlinear variable" );
+	}
+};
+
+template < >
+class ElementConstraint2< tree::PrefixRankedBarNonlinearPattern, alphabet::RankedSymbol, tree::VariablesBarSymbol > {
+public:
+	static bool available ( const tree::PrefixRankedBarNonlinearPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::BarSymbols > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixRankedBarNonlinearPattern &, const alphabet::RankedSymbol & symbol) {
+		if ( symbol.getRank ( ).getData ( ) != 0 )
+			throw tree::TreeException ( "VariablesBarSymbol has nonzero arity" );
+	}
+};
+
+} /* namespace std */
+
 #endif /* PREFIX_RANKED_BAR_NONLINEAR_PATTERN_H_ */
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
index c00edfa6d6..4e889a3fc9 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
@@ -6,7 +6,6 @@
  */
 
 #include "PrefixRankedBarPattern.h"
-#include "../TreeException.h"
 
 #include <sstream>
 #include <algorithm>
@@ -31,7 +30,7 @@
 
 namespace tree {
 
-PrefixRankedBarPattern::PrefixRankedBarPattern ( std::set < alphabet::RankedSymbol > bars, alphabet::RankedSymbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > ( std::make_tuple ( std::move ( alphabet ), std::move ( bars ) ), std::make_tuple ( std::move ( subtreeWildcard ), std::move ( variablesBar ) ) ) {
+PrefixRankedBarPattern::PrefixRankedBarPattern ( std::set < alphabet::RankedSymbol > bars, alphabet::RankedSymbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components2 < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > ( std::make_tuple ( std::move ( alphabet ), std::move ( bars ) ), std::make_tuple ( std::move ( subtreeWildcard ), std::move ( variablesBar ) ) ) {
 	setContent ( std::move ( data ) );
 }
 
@@ -174,68 +173,6 @@ void PrefixRankedBarPattern::compose ( std::deque < sax::Token > & out ) const {
 
 } /* namespace tree */
 
-namespace std {
-
-template < >
-bool tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarPattern * pattern = static_cast < const tree::PrefixRankedBarPattern * > ( this );
-	const std::vector < alphabet::RankedSymbol > & 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;
-}
-
-template < >
-bool tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const {
-	return true;
-}
-
-template < >
-void tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-template < >
-bool tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::BarSymbols >::used ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarPattern * pattern = static_cast < const tree::PrefixRankedBarPattern * > ( this );
-	const std::vector < alphabet::RankedSymbol > & content = pattern->getContent ( );
-
-	return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern->accessElement < tree::VariablesBarSymbol > ( ).get ( ) == symbol;
-}
-
-template < >
-bool tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::BarSymbols >::available ( const alphabet::RankedSymbol & symbol ) const {
-	const tree::PrefixRankedBarPattern * pattern = static_cast < const tree::PrefixRankedBarPattern * > ( this );
-
-	return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::BarSymbols >::valid ( const alphabet::RankedSymbol & ) const {
-}
-
-template < >
-bool tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::available ( const alphabet::RankedSymbol & symbol ) const {
-	return static_cast < const tree::PrefixRankedBarPattern * > ( this )->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	if( symbol.getRank().getData() != 0 )
-		throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
-}
-
-template < >
-bool tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::VariablesBarSymbol >::available ( const alphabet::RankedSymbol & symbol ) const {
-	return static_cast < const tree::PrefixRankedBarPattern * > ( this )->accessComponent < tree::BarSymbols > ( ).get ( ).count ( symbol );
-}
-
-template < >
-void tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::VariablesBarSymbol >::valid ( const alphabet::RankedSymbol & symbol ) const {
-	if( symbol.getRank().getData() != 0 )
-		throw tree::TreeException ( "VariablesBarSymbol has nonzero arity" );
-}
-
-} /* namespace std */
-
 namespace alib {
 
 auto prefixRankedBarPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedBarPattern > ();
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
index b110139b0e..cb4d4f907b 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
@@ -10,8 +10,9 @@
 
 #include <set>
 #include <vector>
-#include <core/components.hpp>
+#include <core/components2.hpp>
 
+#include "../TreeException.h"
 #include "../../alphabet/RankedSymbol.h"
 #include "../RankedTreeBase.h"
 #include "RankedNode.h"
@@ -29,7 +30,7 @@ class VariablesBarSymbol;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixRankedBarPattern : public RankedTreeBase, public std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > {
+class PrefixRankedBarPattern : public RankedTreeBase, public std::Components2 < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > {
 	std::vector < alphabet::RankedSymbol > m_Data;
 
 	static void toPrefixRankedBar ( const RankedNode & node, const alphabet::RankedSymbol & subtreeWildcard, const alphabet::Symbol & barBase, const alphabet::RankedSymbol & variablesBar, std::vector < alphabet::RankedSymbol > & linearNotation );
@@ -104,4 +105,68 @@ public:
 
 } /* namespace tree */
 
+namespace std {
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::GeneralAlphabet > {
+public:
+	static bool used ( const tree::PrefixRankedBarPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+	const std::vector < alphabet::RankedSymbol > & 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;
+	}
+
+	static bool available ( const tree::PrefixRankedBarPattern &, const alphabet::RankedSymbol & ) {
+		return true;
+	}
+
+	static void valid ( const tree::PrefixRankedBarPattern &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+template < >
+class ComponentConstraint2< tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::BarSymbols > {
+public:
+	static bool used ( const tree::PrefixRankedBarPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		const std::vector < alphabet::RankedSymbol > & content = pattern.getContent ( );
+
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.accessElement < tree::VariablesBarSymbol > ( ).get ( ) == symbol;
+	}
+
+	static bool available ( const tree::PrefixRankedBarPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixRankedBarPattern &, const alphabet::RankedSymbol & ) {
+	}
+};
+
+template < >
+class ElementConstraint2< tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::SubtreeWildcard > {
+public:
+	static bool available ( const tree::PrefixRankedBarPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+}
+
+	static void valid ( const tree::PrefixRankedBarPattern &, const alphabet::RankedSymbol & symbol) {
+		if( symbol.getRank().getData() != 0 )
+			throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
+	}
+};
+
+template < >
+class ElementConstraint2< tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::VariablesBarSymbol > {
+public:
+	static bool available ( const tree::PrefixRankedBarPattern & pattern, const alphabet::RankedSymbol & symbol ) {
+		return pattern.accessComponent < tree::BarSymbols > ( ).get ( ).count ( symbol );
+	}
+
+	static void valid ( const tree::PrefixRankedBarPattern &, const alphabet::RankedSymbol & symbol) {
+		if( symbol.getRank().getData() != 0 )
+			throw tree::TreeException ( "VariablesBarSymbol has nonzero arity" );
+	}
+};
+
+} /* namespace std */
+
 #endif /* PREFIX_RANKED_BAR_PATTERN_H_ */
-- 
GitLab