Skip to content
Snippets Groups Projects
Commit cd36ee1d authored by Jan Trávníček's avatar Jan Trávníček
Browse files

ranked tree use components

parent 5523f8f4
No related branches found
No related tags found
No related merge requests found
......@@ -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 > ();
......
......@@ -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 );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment