diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp index faa6b5e59941e6dade6063d92effea8ae44b9f7a..f96b0c828a5c6e1cf9dec2342ffe93092f856dff 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp @@ -27,24 +27,19 @@ namespace tree { -PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) { - addSymbolsToAlphabet ( std::move ( alphabet ) ); +PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ), bar ( std::move ( bar ) ) { setContent ( std::move ( data ) ); } -PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) { +PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) ), std::tuple < > ( ) ), m_Data ( std::move ( data ) ), bar ( std::move ( bar ) ) { arityChecksum ( data ); - - addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) ); - m_Data = std::move ( data ); } -PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree ) : bar ( std::move ( bar ) ) { +PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree ) : std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::tuple < > ( ) ), bar ( std::move ( bar ) ) { 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 ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), symbol.getRank ( ) ) ); } } @@ -68,15 +63,6 @@ RankedTreeBase * PrefixRankedBarTree::plunder ( ) && { return new PrefixRankedBarTree ( std::move ( * this ) ); } -bool PrefixRankedBarTree::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." ); - - return alphabet.erase ( symbol ); -} - const std::vector < alphabet::RankedSymbol > & PrefixRankedBarTree::getContent ( ) const { return this->m_Data; } @@ -90,7 +76,7 @@ void PrefixRankedBarTree::setContent ( std::vector < alphabet::RankedSymbol > da 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." ); @@ -166,13 +152,33 @@ PrefixRankedBarTree PrefixRankedBarTree::parse ( std::deque < sax::Token >::iter void PrefixRankedBarTree::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( PrefixRankedBarTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); TreeToXMLComposer::composeBar ( out, bar ); - TreeToXMLComposer::composeAlphabet ( out, alphabet ); + TreeToXMLComposer::composeAlphabet ( out, getAlphabet() ); TreeToXMLComposer::composeContent ( out, m_Data ); out.emplace_back ( PrefixRankedBarTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); } } /* namespace tree */ +namespace std { + +template < > +bool tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const { + const std::vector < alphabet::RankedSymbol > & content = static_cast < const tree::PrefixRankedBarTree * > ( this )->getContent ( ); + + return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ); +} + +template < > +bool tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const { + return true; +} + +template < > +void tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const { +} + +} /* namespace std */ + namespace alib { auto prefixRankedBarTreeParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedBarTree > (); diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.h b/alib2data/src/tree/ranked/PrefixRankedBarTree.h index 25e2e6bae3bcdceaa9c9404853af3e900845f837..6a0431cfb987d771ca3f49b57eb784f2a53237cc 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarTree.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.h @@ -10,21 +10,22 @@ #include <set> #include <vector> +#include <core/components.hpp> #include "../../alphabet/RankedSymbol.h" #include "../RankedTreeBase.h" -#include "../common/RankedAlphabet.h" #include "RankedNode.h" namespace tree { class RankedTree; +class GeneralAlphabet; /** * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of LinearStringElement. */ -class PrefixRankedBarTree : public RankedTreeBase, public RankedAlphabet { +class PrefixRankedBarTree : public RankedTreeBase, public std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > { std::vector < alphabet::RankedSymbol > m_Data; alphabet::Symbol bar; @@ -40,19 +41,17 @@ 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 RankedAlphabet::getAlphabet ( ); + return accessComponent < GeneralAlphabet > ( ).get ( ); } void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) { - addSymbolsToAlphabet ( symbols ); + accessComponent < GeneralAlphabet > ( ).add ( symbols ); } const alphabet::Symbol & getBarSymbol ( ) const;