diff --git a/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.cpp b/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.cpp deleted file mode 100644 index 63e63ea4dba1162df420338853b2ac5b2fff7a88..0000000000000000000000000000000000000000 --- a/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - * RankedNonlinearAlphabet.cpp - * - * Created on: Mar 13, 2016 - * Author: Jan Travnicek - */ - -#include "RankedNonlinearPatternAlphabet.h" -#include "../TreeException.h" - -#include <algorithm> - -namespace tree { - -RankedNonlinearPatternAlphabet::RankedNonlinearPatternAlphabet ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables ) : RankedPatternAlphabet ( subtreeWildcard ), nonlinearVariables ( nonlinearVariables ) { - for ( const alphabet::RankedSymbol & symbol : nonlinearVariables ) - if ( symbol.getRank ( ).getData ( ) != 0 ) - throw TreeException ( "Subtree nonlinear variable " + ( std::string ) symbol + " has nonzero rank" ); - - alphabet.insert ( std::move ( subtreeWildcard ) ); -} - -bool RankedNonlinearPatternAlphabet::addNonlinearVariable ( alphabet::RankedSymbol symbol ) { - if ( !alphabet.count ( symbol ) ) - throw TreeException ( "Subtree nonlinear variable \"" + ( std::string ) symbol + "\" is not in the alphabet." ); - - if ( symbol.getRank ( ).getData ( ) != 0 ) - throw TreeException ( "Subtree nonlinear variable " + ( std::string ) symbol + " has nonzero rank" ); - - return nonlinearVariables.insert ( symbol ).second; -} - -void RankedNonlinearPatternAlphabet::addNonlinearVariables ( std::set < alphabet::RankedSymbol > symbols ) { - for ( alphabet::RankedSymbol addedSymbol : std::move ( symbols ) ) - addNonlinearVariable ( std::move ( addedSymbol ) ); -} - -void RankedNonlinearPatternAlphabet::setNonlinearVariables ( std::set < alphabet::RankedSymbol > newSymbols ) { - std::set < alphabet::RankedSymbol > removed; - std::set_difference ( nonlinearVariables.begin ( ), nonlinearVariables.end ( ), newSymbols.begin ( ), newSymbols.end ( ), std::inserter ( removed, removed.end ( ) ) ); - - for ( const alphabet::RankedSymbol & removedSymbol : removed ) - removeNonlinearVariable ( removedSymbol ); - - nonlinearVariables = std::move ( newSymbols ); -} - -const std::set < alphabet::RankedSymbol > & RankedNonlinearPatternAlphabet::getNonlinearVariables ( ) const { - return nonlinearVariables; -} - -bool RankedNonlinearPatternAlphabet::removeNonlinearVariable ( const alphabet::RankedSymbol & symbol ) { - return nonlinearVariables.insert ( std::move ( symbol ) ).second; -} - -} /* namespace tree */ diff --git a/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.h b/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.h deleted file mode 100644 index 3b1345a445bf7c3bd7c7b61bf787e2640a843071..0000000000000000000000000000000000000000 --- a/alib2data/src/tree/common/RankedNonlinearPatternAlphabet.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * RankedNonlinearPatternAlphabet.h - * - * Created on: Mar 13, 2016 - * Author: Jan Travnicek - */ - -#ifndef RANKED_NONLINEAR_PATTERN_ALPHABET_H_ -#define RANKED_NONLINEAR_PATTERN_ALPHABET_H_ - -#include "RankedPatternAlphabet.h" - -namespace tree { - -/** - * Abstract base class for all strings. Contains common elements of strings. - */ -class RankedNonlinearPatternAlphabet : public RankedPatternAlphabet { -protected: - std::set < alphabet::RankedSymbol > nonlinearVariables; - -public: - RankedNonlinearPatternAlphabet ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables ); - - /** - * Adds the nonlinear variable = symbol representing subtree substitution place in the pattern - * @param symbol Symbol to set - */ - bool addNonlinearVariable ( alphabet::RankedSymbol symbol ); - - /** - * Adds the nonlinear variables = symbols representing subtree substitution place in the pattern - * @param symbol Symbol to set - */ - void addNonlinearVariables ( std::set < alphabet::RankedSymbol > symbols ); - - /** - * Sets the nonlinear variables = symbol representing subtree substitution place in the pattern - * @param symbol Symbol to set - */ - void setNonlinearVariables ( std::set < alphabet::RankedSymbol > symbols ); - - /** - * @return symbols representing nonlinear variables - */ - const std::set < alphabet::RankedSymbol > & getNonlinearVariables ( ) const; - - /** - * Removes the nonlinear variable = symbol representing subtree substitution place in the pattern - * @param symbol Symbol to set - */ - bool removeNonlinearVariable ( const alphabet::RankedSymbol & symbol ); -}; - -} /* namespace tree */ - -#endif /* RANKED_NONLINEAR_PATTERN_ALPHABET_H_ */ diff --git a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp index 992ebc0488dc8b569abd6994b0c36be585b5d80e..b132197087b9493515c0fd3e917367b146fbd038 100644 --- a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp +++ b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp @@ -25,29 +25,25 @@ namespace tree { -RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables, std::set < alphabet::RankedSymbol > alphabet, RankedNode pattern ) : RankedNonlinearPatternAlphabet ( std::move ( subtreeWildcard ), std::move ( nonlinearVariables ) ) { - setAlphabet ( std::move ( alphabet ) ); - this->pattern = NULL; +RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables, std::set < alphabet::RankedSymbol > alphabet, RankedNode pattern ) : std::Components < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( std::move ( subtreeWildcard ) ) ), pattern ( NULL ) { setTree ( std::move ( pattern ) ); } -RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables, RankedNode pattern ) : RankedNonlinearPatternAlphabet ( std::move ( subtreeWildcard ), std::move ( nonlinearVariables ) ) { - pattern.computeMinimalAlphabet ( alphabet ); - this->pattern = NULL; +RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > nonlinearVariables, RankedNode pattern ) : std::Components < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( nonlinearVariables + std::set < alphabet::RankedSymbol > { subtreeWildcard }, nonlinearVariables ), std::make_tuple ( subtreeWildcard ) ), pattern ( NULL ) { + pattern.computeMinimalAlphabet ( accessComponent < GeneralAlphabet > ( ).get ( ) ); setTree ( std::move ( pattern ) ); } -RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, RankedNode pattern ) : RankedNonlinearPatternAlphabet ( std::move ( subtreeWildcard ), { } ) { - pattern.computeMinimalAlphabet ( alphabet ); - this->pattern = NULL; +RankedNonlinearPattern::RankedNonlinearPattern ( alphabet::RankedSymbol subtreeWildcard, RankedNode pattern ) : std::Components < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > { subtreeWildcard }, std::set < alphabet::RankedSymbol > { } ), std::make_tuple ( subtreeWildcard ) ), pattern ( NULL ) { + pattern.computeMinimalAlphabet ( accessComponent < GeneralAlphabet > ( ).get ( ) ); setTree ( std::move ( pattern ) ); } -RankedNonlinearPattern::RankedNonlinearPattern ( const RankedNonlinearPattern & other ) : RankedNonlinearPatternAlphabet ( other ), pattern ( other.pattern->clone ( ) ) { +RankedNonlinearPattern::RankedNonlinearPattern ( const RankedNonlinearPattern & other ) : std::Components < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( other.getAlphabet ( ), other.getNonlinearVariables ( ) ), std::make_tuple ( other.getSubtreeWildcard ( ) ) ), pattern ( other.pattern->clone ( ) ) { this->pattern->attachAlphabet ( & ( this->getAlphabet() ) ); } -RankedNonlinearPattern::RankedNonlinearPattern ( RankedNonlinearPattern && other ) noexcept : RankedNonlinearPatternAlphabet ( other ), pattern ( other.pattern ) { +RankedNonlinearPattern::RankedNonlinearPattern ( RankedNonlinearPattern && other ) noexcept : std::Components < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( other.accessComponent < GeneralAlphabet > ( ).get ( ) ), std::move ( other.accessComponent < NonlinearAlphabet > ( ).get ( ) ) ), std::make_tuple ( std::move ( other.accessElement < SubtreeWildcard > ( ).get ( ) ) ) ), pattern ( other.pattern ) { this->pattern->attachAlphabet ( & ( this->getAlphabet() ) ); other.pattern = NULL; } @@ -71,9 +67,9 @@ RankedNonlinearPattern & RankedNonlinearPattern::operator =( const RankedNonline RankedNonlinearPattern & RankedNonlinearPattern::operator =( RankedNonlinearPattern && other ) noexcept { std::swap ( this->pattern, other.pattern ); - std::swap ( this->alphabet, other.alphabet ); - std::swap ( this->subtreeWildcard, other.subtreeWildcard ); - std::swap ( this->nonlinearVariables, other.nonlinearVariables ); + std::swap ( accessComponent < GeneralAlphabet > ( ).get ( ), other.accessComponent < GeneralAlphabet > ( ).get ( ) ); + std::swap ( accessComponent < NonlinearAlphabet > ( ).get ( ), other.accessComponent < NonlinearAlphabet > ( ).get ( ) ); + std::swap ( accessElement < SubtreeWildcard > ( ).get ( ), other.accessElement < SubtreeWildcard > ( ).get ( ) ); return * this; } @@ -100,21 +96,6 @@ void RankedNonlinearPattern::setTree ( RankedNode pattern ) { } } -bool RankedNonlinearPattern::removeSymbolFromAlphabet ( const alphabet::RankedSymbol & symbol ) { - if ( this->pattern->testSymbol ( symbol ) ) - throw TreeException ( "Input symbol \"" + ( std::string ) symbol + "\" is used." ); - - if ( this->subtreeWildcard == symbol ) - throw TreeException ( "Input symbol \"" + ( std::string ) symbol + "\" is subtreeWildcard." ); - - if ( std::any_of ( this->nonlinearVariables.begin ( ), this->nonlinearVariables.end ( ), [&] ( const alphabet::RankedSymbol & nonlinearVariable ) { - return nonlinearVariable == symbol; - } ) ) - throw TreeException ( "Input symbol \"" + ( std::string ) symbol + "\" is nonlinearVariable." ); - - return alphabet.erase ( symbol ); -} - void RankedNonlinearPattern::operator >>( std::ostream & out ) const { out << "(RankedNonlinearPattern " << * ( this->pattern ) << ")"; } @@ -124,17 +105,17 @@ int RankedNonlinearPattern::compare ( const RankedNonlinearPattern & other ) con if ( res == 0 ) { std::compare < alphabet::RankedSymbol > comp; - res = comp ( subtreeWildcard, other.subtreeWildcard ); + res = comp ( getSubtreeWildcard ( ), other.getSubtreeWildcard ( ) ); } if ( res == 0 ) { std::compare < std::set < alphabet::RankedSymbol > > comp; - res = comp ( nonlinearVariables, other.nonlinearVariables ); + res = comp ( getNonlinearVariables(), other.getNonlinearVariables() ); } if ( res == 0 ) { std::compare < std::set < alphabet::RankedSymbol > > comp; - res = comp ( alphabet, other.alphabet ); + res = comp ( getAlphabet(), other.getAlphabet() ); } return res; @@ -167,15 +148,70 @@ RankedNonlinearPattern RankedNonlinearPattern::parse ( std::deque < sax::Token > void RankedNonlinearPattern::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( RankedNonlinearPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); - TreeToXMLComposer::composeSubtreeWildcard ( out, subtreeWildcard ); - TreeToXMLComposer::composeNonlinearVariables ( out, nonlinearVariables ); - TreeToXMLComposer::composeAlphabet ( out, alphabet ); + TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard() ); + TreeToXMLComposer::composeNonlinearVariables ( out, getNonlinearVariables() ); + TreeToXMLComposer::composeAlphabet ( out, getAlphabet() ); alib::xmlApi < RankedNode * >::compose ( out, pattern ); out.emplace_back ( RankedNonlinearPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); } } /* namespace tree */ +namespace std { + +template < > +bool tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const { + const tree::RankedNonlinearPattern * pattern = static_cast < const tree::RankedNonlinearPattern * > ( this ); + + return pattern->getRoot ( ).testSymbol ( symbol ) || pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol || pattern->accessComponent < tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ); +} + +template < > +bool tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const { + return true; +} + +template < > +void tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const { +} + +template < > +bool tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::used ( const alphabet::RankedSymbol & ) const { + return false; +} + +template < > +bool tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::available ( const alphabet::RankedSymbol & symbol ) const { + const tree::RankedNonlinearPattern * pattern = static_cast < const tree::RankedNonlinearPattern * > ( this ); + + return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); +} + +template < > +void tree::RankedNonlinearPattern::Component < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::NonlinearAlphabet >::valid ( const alphabet::RankedSymbol & symbol ) const { + const tree::RankedNonlinearPattern * pattern = static_cast < const tree::RankedNonlinearPattern * > ( this ); + + 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::RankedNonlinearPattern::Element < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::available ( const alphabet::RankedSymbol & symbol ) const { + const tree::RankedNonlinearPattern * pattern = static_cast < const tree::RankedNonlinearPattern * > ( this ); + + return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); +} + +template < > +void tree::RankedNonlinearPattern::Element < tree::RankedNonlinearPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & symbol ) const { + const tree::RankedNonlinearPattern * pattern = static_cast < const tree::RankedNonlinearPattern * > ( this ); + + 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" ); +} + +} /* namespace std */ + namespace alib { auto RankedNonlinearPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::RankedNonlinearPattern > ( ); diff --git a/alib2data/src/tree/ranked/RankedNonlinearPattern.h b/alib2data/src/tree/ranked/RankedNonlinearPattern.h index 2c74d1377116932976747be99f6ae88ea6382989..7394fdfd4c3e367af0a3bde6fd7d92b38758c043 100644 --- a/alib2data/src/tree/ranked/RankedNonlinearPattern.h +++ b/alib2data/src/tree/ranked/RankedNonlinearPattern.h @@ -8,24 +8,26 @@ #ifndef RANKED_NONLINEAR_PATTERN_H_ #define RANKED_NONLINEAR_PATTERN_H_ -#include <vector> -#include <list> #include <string> #include <set> +#include <core/components.hpp> + #include "RankedNode.h" #include "../RankedTreeBase.h" -#include "../common/RankedNonlinearPatternAlphabet.h" namespace tree { class RankedNode; class UnrankedPattern; +class GeneralAlphabet; +class SubtreeWildcard; +class NonlinearAlphabet; /** * Represents regular expression parsed from the XML. Regular expression is stored * as a pattern of RegExpElement. */ -class RankedNonlinearPattern : public RankedTreeBase, public RankedNonlinearPatternAlphabet { +class RankedNonlinearPattern : public RankedTreeBase, public std::Components < RankedNonlinearPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > { protected: RankedNode * pattern; @@ -60,11 +62,19 @@ public: const RankedNode & getRoot ( ) const; const std::set < alphabet::RankedSymbol > & getAlphabet ( ) const { - return RankedNonlinearPatternAlphabet::getAlphabet ( ); + return accessComponent < GeneralAlphabet > ( ).get ( ); } void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) { - addSymbolsToAlphabet ( symbols ); + accessComponent < GeneralAlphabet > ( ).add ( symbols ); + } + + const alphabet::RankedSymbol & getSubtreeWildcard ( ) const { + return accessElement < SubtreeWildcard > ( ).get ( ); + } + + const std::set < alphabet::RankedSymbol > & getNonlinearVariables ( ) const { + return accessComponent < NonlinearAlphabet > ( ).get ( ); } /** @@ -78,12 +88,6 @@ public: */ void setTree ( RankedNode pattern ); - /** - * Removes symbol from the alphabet of symbol available in the regular expression - * @param symbol removed symbol from the alphabet - */ - bool removeSymbolFromAlphabet ( const alphabet::RankedSymbol & symbol ); - /** * Prints XML representation of the pattern to the output stream. * @param out output stream to which print the pattern