diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp index 6a5bb110ba7473e0605a2f93f650cee62f92b3b4..d66cf9eaec02fc1169db02280a919ea57eb04561 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp @@ -30,27 +30,21 @@ namespace tree { -PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) { - addSymbolsToAlphabet ( std::move ( alphabet ) ); +PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) + std::set < alphabet::RankedSymbol > { subtreeWildcard } ), std::make_tuple ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) { setContent ( std::move ( data ) ); } -PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) { - arityChecksum ( data ); - - addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) ); - m_Data = std::move ( data ); +PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : PrefixRankedBarPattern ( std::move ( bar ), std::move ( variablesBar ), std::move ( subtreeWildcard ), std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ), std::move ( data ) ) { } -PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, const RankedPattern & tree ) : RankedPatternAlphabet ( tree.getSubtreeWildcard ( ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) { +PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, const RankedPattern & tree ) : std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::make_tuple ( tree.getSubtreeWildcard ( ) ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) { toPrefixRankedBar ( tree.getRoot ( ) ); for ( const alphabet::RankedSymbol & symbol : tree.getAlphabet ( ) ) { - addSymbolToAlphabet ( symbol ); - addSymbolToAlphabet ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), symbol.getRank ( ) ) ); + accessComponent < GeneralAlphabet > ( ).add ( alphabet::RankedSymbol ( this->bar, symbol.getRank ( ) ) ); } - addSymbolToAlphabet ( alphabet::RankedSymbol ( this->variablesBar, tree.getSubtreeWildcard ( ).getRank ( ) ) ); + accessComponent < GeneralAlphabet > ( ).add ( alphabet::RankedSymbol ( this->variablesBar, tree.getSubtreeWildcard ( ).getRank ( ) ) ); } PrefixRankedBarPattern::PrefixRankedBarPattern ( const PrefixRankedBarTree & tree ) : PrefixRankedBarPattern ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), alphabet::Symbol ( alphabet::VariablesBarSymbol::BAR ), alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ), tree.getAlphabet ( ), tree.getContent ( ) ) { @@ -60,7 +54,7 @@ PrefixRankedBarPattern::PrefixRankedBarPattern ( const RankedPattern & tree ) : } void PrefixRankedBarPattern::toPrefixRankedBar ( const RankedNode & node ) { - if ( node.getSymbol ( ) == subtreeWildcard ) { + if ( node.getSymbol ( ) == accessElement < tree::SubtreeWildcard > ( ).get ( ) ) { m_Data.push_back ( node.getSymbol ( ) ); m_Data.push_back ( alphabet::RankedSymbol ( variablesBar, node.getSymbol ( ).getRank ( ) ) ); } else { @@ -81,18 +75,6 @@ RankedTreeBase * PrefixRankedBarPattern::plunder ( ) && { return new PrefixRankedBarPattern ( std::move ( * this ) ); } -bool PrefixRankedBarPattern::removeSymbolFromAlphabet ( const alphabet::RankedSymbol & symbol ) { - if ( std::any_of ( m_Data.begin ( ), m_Data.end ( ), [&] ( const alphabet::RankedSymbol & s ) { - return s == symbol; - } ) ) - throw TreeException ( "Input symbol \"" + ( std::string ) symbol + "\" is used." ); - - if ( this->subtreeWildcard == symbol ) - throw TreeException ( "Input symbol \"" + ( std::string ) symbol + "\" is subtreeWildcard." ); - - return alphabet.erase ( symbol ); -} - const std::vector < alphabet::RankedSymbol > & PrefixRankedBarPattern::getContent ( ) const { return this->m_Data; } @@ -102,7 +84,7 @@ void PrefixRankedBarPattern::setContent ( std::vector < alphabet::RankedSymbol > std::set < alphabet::RankedSymbol > minimalAlphabet ( data.begin ( ), data.end ( ) ); std::set < alphabet::RankedSymbol > unknownSymbols; - std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), alphabet.begin ( ), alphabet.end ( ), std::inserter ( unknownSymbols, unknownSymbols.end ( ) ) ); + 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." ); @@ -138,7 +120,8 @@ void PrefixRankedBarPattern::arityChecksum ( const std::vector < alphabet::Ranke if ( ( arityChecksumTerminals != 0 ) || ( arityChecksumBars != 0 ) || ( arityChecksumTypes != 0 ) ) throw TreeException ( "The string does not form a tree" ); for ( unsigned i = 0; i < data.size ( ); ++i ) - if ( ( data[i] == subtreeWildcard ) && ( ( ( i + 1 ) == data.size ( ) ) || ( data[i + 1].getSymbol ( ) != variablesBar ) ) ) throw TreeException ( "Inconsystency of SubtreeWildcard and variablesBar" ); + if ( ( data[i] == accessElement < tree::SubtreeWildcard > ( ).get ( ) ) && ( ( ( i + 1 ) == data.size ( ) ) || ( data[i + 1].getSymbol ( ) != variablesBar ) ) ) + throw TreeException ( "Inconsystency of SubtreeWildcard and variablesBar" ); } @@ -147,8 +130,8 @@ bool PrefixRankedBarPattern::isEmpty ( ) const { } int PrefixRankedBarPattern::compare ( const PrefixRankedBarPattern & other ) const { - auto first = std::tie ( m_Data, alphabet ); - auto second = std::tie ( other.m_Data, other.alphabet ); + auto first = std::tie ( m_Data, getAlphabet() ); + auto second = std::tie ( other.m_Data, other.getAlphabet() ); std::compare < decltype ( first ) > comp; @@ -193,14 +176,44 @@ void PrefixRankedBarPattern::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( PrefixRankedBarPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); TreeToXMLComposer::composeBar ( out, bar ); TreeToXMLComposer::composeVariablesBar ( out, variablesBar ); - TreeToXMLComposer::composeSubtreeWildcard ( out, subtreeWildcard ); - TreeToXMLComposer::composeAlphabet ( out, alphabet ); + TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard() ); + TreeToXMLComposer::composeAlphabet ( out, getAlphabet() ); TreeToXMLComposer::composeContent ( out, m_Data ); out.emplace_back ( PrefixRankedBarPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); } } /* 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::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::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 & ) const { +} + +} /* 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 d44afefe1ac4f4b62056bbd6ad2fbb44ef525f1d..12f716fd6d3807aebb54b1d73c4a5175bd82a5f8 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h @@ -10,22 +10,24 @@ #include <set> #include <vector> +#include <core/components.hpp> #include "../../alphabet/RankedSymbol.h" #include "../RankedTreeBase.h" -#include "../common/RankedPatternAlphabet.h" #include "RankedNode.h" namespace tree { class RankedPattern; class PrefixRankedBarTree; +class GeneralAlphabet; +class SubtreeWildcard; /** * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of LinearStringElement. */ -class PrefixRankedBarPattern : public RankedTreeBase, public RankedPatternAlphabet { +class PrefixRankedBarPattern : public RankedTreeBase, public std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > { std::vector < alphabet::RankedSymbol > m_Data; alphabet::Symbol bar; @@ -43,19 +45,21 @@ public: virtual RankedTreeBase * clone ( ) const; virtual RankedTreeBase * plunder ( ) &&; - virtual bool removeSymbolFromAlphabet ( const alphabet::RankedSymbol & symbol ); - /** * @return List of symbols forming tree (const version). */ const std::vector < alphabet::RankedSymbol > & getContent ( ) const; const std::set < alphabet::RankedSymbol > & getAlphabet ( ) const { - return RankedPatternAlphabet::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 ( ); } void setContent ( std::vector < alphabet::RankedSymbol > data );