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