diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.cpp b/alib2data/src/tree/ranked/PrefixRankedTree.cpp index 3f7dd58365e3f968552c32d80adffb7ed3f6541b..b1fbf3207367a64b595bb6e2a1517dfa86beb28c 100644 --- a/alib2data/src/tree/ranked/PrefixRankedTree.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedTree.cpp @@ -25,21 +25,16 @@ namespace tree { -PrefixRankedTree::PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) { - setAlphabet ( std::move ( alphabet ) ); +PrefixRankedTree::PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ) { setContent ( std::move ( data ) ); } -PrefixRankedTree::PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data ) { - arityChecksum ( data ); - - setAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) ); - m_Data = std::move ( data ); +PrefixRankedTree::PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedTree, 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 ) ) { + arityChecksum ( m_Data ); } -PrefixRankedTree::PrefixRankedTree ( const RankedTree & tree ) { +PrefixRankedTree::PrefixRankedTree ( const RankedTree & tree ) : std::Components < PrefixRankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::tuple < > ( ) ) { toPrefixRanked ( tree.getRoot ( ) ); - setAlphabet ( tree.getAlphabet ( ) ); } void PrefixRankedTree::toPrefixRanked ( const RankedNode & node ) { @@ -57,15 +52,6 @@ RankedTreeBase * PrefixRankedTree::plunder ( ) && { return new PrefixRankedTree ( std::move ( * this ) ); } -bool PrefixRankedTree::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 > & PrefixRankedTree::getContent ( ) const { return this->m_Data; } @@ -75,7 +61,7 @@ void PrefixRankedTree::setContent ( std::vector < alphabet::RankedSymbol > data 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." ); @@ -99,8 +85,8 @@ bool PrefixRankedTree::isEmpty ( ) const { } int PrefixRankedTree::compare ( const PrefixRankedTree & 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; @@ -140,13 +126,33 @@ PrefixRankedTree PrefixRankedTree::parse ( std::deque < sax::Token >::iterator & void PrefixRankedTree::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( PrefixRankedTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); - TreeToXMLComposer::composeAlphabet ( out, alphabet ); + TreeToXMLComposer::composeAlphabet ( out, getAlphabet() ); TreeToXMLComposer::composeContent ( out, m_Data ); out.emplace_back ( PrefixRankedTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); } } /* namespace tree */ +namespace std { + +template < > +bool tree::PrefixRankedTree::Component < tree::PrefixRankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const { + const std::vector < alphabet::RankedSymbol > & content = static_cast < const tree::PrefixRankedTree * > ( this )->getContent ( ); + + return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ); +} + +template < > +bool tree::PrefixRankedTree::Component < tree::PrefixRankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const { + return true; +} + +template < > +void tree::PrefixRankedTree::Component < tree::PrefixRankedTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const { +} + +} /* namespace std */ + namespace alib { auto prefixRankedTreeParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedTree > (); diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.h b/alib2data/src/tree/ranked/PrefixRankedTree.h index e9b7ba31010037e0f0b295f5bb080a03a8f836c8..d1ac5be6fd5e59a3d04228155651eca036b88793 100644 --- a/alib2data/src/tree/ranked/PrefixRankedTree.h +++ b/alib2data/src/tree/ranked/PrefixRankedTree.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 PrefixRankedTree : public RankedTreeBase, public RankedAlphabet { +class PrefixRankedTree : public RankedTreeBase, public std::Components < PrefixRankedTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > { std::vector < alphabet::RankedSymbol > m_Data; void toPrefixRanked ( const RankedNode & node ); @@ -37,19 +38,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 ); } void setContent ( std::vector < alphabet::RankedSymbol > data );