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

PrefixRankedBarPattern use components

parent 0859a962
No related branches found
No related tags found
No related merge requests found
...@@ -30,27 +30,21 @@ ...@@ -30,27 +30,21 @@
   
namespace tree { 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 ) ) { 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 ) ) {
addSymbolsToAlphabet ( std::move ( alphabet ) );
setContent ( std::move ( data ) ); 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 ) ) { 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 ) ) {
arityChecksum ( data );
addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
m_Data = 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 ( ) ); toPrefixRankedBar ( tree.getRoot ( ) );
   
for ( const alphabet::RankedSymbol & symbol : tree.getAlphabet ( ) ) { for ( const alphabet::RankedSymbol & symbol : tree.getAlphabet ( ) ) {
addSymbolToAlphabet ( symbol ); accessComponent < GeneralAlphabet > ( ).add ( alphabet::RankedSymbol ( this->bar, symbol.getRank ( ) ) );
addSymbolToAlphabet ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::BarSymbol::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 ( ) ) { 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 ) : ...@@ -60,7 +54,7 @@ PrefixRankedBarPattern::PrefixRankedBarPattern ( const RankedPattern & tree ) :
} }
   
void PrefixRankedBarPattern::toPrefixRankedBar ( const RankedNode & node ) { 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 ( node.getSymbol ( ) );
m_Data.push_back ( alphabet::RankedSymbol ( variablesBar, node.getSymbol ( ).getRank ( ) ) ); m_Data.push_back ( alphabet::RankedSymbol ( variablesBar, node.getSymbol ( ).getRank ( ) ) );
} else { } else {
...@@ -81,18 +75,6 @@ RankedTreeBase * PrefixRankedBarPattern::plunder ( ) && { ...@@ -81,18 +75,6 @@ RankedTreeBase * PrefixRankedBarPattern::plunder ( ) && {
return new PrefixRankedBarPattern ( std::move ( * this ) ); 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 { const std::vector < alphabet::RankedSymbol > & PrefixRankedBarPattern::getContent ( ) const {
return this->m_Data; return this->m_Data;
} }
...@@ -102,7 +84,7 @@ void PrefixRankedBarPattern::setContent ( std::vector < alphabet::RankedSymbol > ...@@ -102,7 +84,7 @@ void PrefixRankedBarPattern::setContent ( std::vector < alphabet::RankedSymbol >
   
std::set < alphabet::RankedSymbol > minimalAlphabet ( data.begin ( ), data.end ( ) ); std::set < alphabet::RankedSymbol > minimalAlphabet ( data.begin ( ), data.end ( ) );
std::set < alphabet::RankedSymbol > unknownSymbols; 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 ) if ( unknownSymbols.size ( ) > 0 )
throw TreeException ( "Input symbols not in the alphabet." ); throw TreeException ( "Input symbols not in the alphabet." );
...@@ -138,7 +120,8 @@ void PrefixRankedBarPattern::arityChecksum ( const std::vector < alphabet::Ranke ...@@ -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" ); if ( ( arityChecksumTerminals != 0 ) || ( arityChecksumBars != 0 ) || ( arityChecksumTypes != 0 ) ) throw TreeException ( "The string does not form a tree" );
   
for ( unsigned i = 0; i < data.size ( ); ++i ) 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 { ...@@ -147,8 +130,8 @@ bool PrefixRankedBarPattern::isEmpty ( ) const {
} }
   
int PrefixRankedBarPattern::compare ( const PrefixRankedBarPattern & other ) const { int PrefixRankedBarPattern::compare ( const PrefixRankedBarPattern & other ) const {
auto first = std::tie ( m_Data, alphabet ); auto first = std::tie ( m_Data, getAlphabet() );
auto second = std::tie ( other.m_Data, other.alphabet ); auto second = std::tie ( other.m_Data, other.getAlphabet() );
   
std::compare < decltype ( first ) > comp; std::compare < decltype ( first ) > comp;
   
...@@ -193,14 +176,44 @@ void PrefixRankedBarPattern::compose ( std::deque < sax::Token > & out ) const { ...@@ -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 ); out.emplace_back ( PrefixRankedBarPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT );
TreeToXMLComposer::composeBar ( out, bar ); TreeToXMLComposer::composeBar ( out, bar );
TreeToXMLComposer::composeVariablesBar ( out, variablesBar ); TreeToXMLComposer::composeVariablesBar ( out, variablesBar );
TreeToXMLComposer::composeSubtreeWildcard ( out, subtreeWildcard ); TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard() );
TreeToXMLComposer::composeAlphabet ( out, alphabet ); TreeToXMLComposer::composeAlphabet ( out, getAlphabet() );
TreeToXMLComposer::composeContent ( out, m_Data ); TreeToXMLComposer::composeContent ( out, m_Data );
out.emplace_back ( PrefixRankedBarPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); out.emplace_back ( PrefixRankedBarPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT );
} }
   
} /* namespace tree */ } /* 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 { namespace alib {
   
auto prefixRankedBarPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedBarPattern > (); auto prefixRankedBarPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedBarPattern > ();
......
...@@ -10,22 +10,24 @@ ...@@ -10,22 +10,24 @@
   
#include <set> #include <set>
#include <vector> #include <vector>
#include <core/components.hpp>
   
#include "../../alphabet/RankedSymbol.h" #include "../../alphabet/RankedSymbol.h"
#include "../RankedTreeBase.h" #include "../RankedTreeBase.h"
#include "../common/RankedPatternAlphabet.h"
#include "RankedNode.h" #include "RankedNode.h"
   
namespace tree { namespace tree {
   
class RankedPattern; class RankedPattern;
class PrefixRankedBarTree; class PrefixRankedBarTree;
class GeneralAlphabet;
class SubtreeWildcard;
   
/** /**
* Represents regular expression parsed from the XML. Regular expression is stored * Represents regular expression parsed from the XML. Regular expression is stored
* as a tree of LinearStringElement. * 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; std::vector < alphabet::RankedSymbol > m_Data;
   
alphabet::Symbol bar; alphabet::Symbol bar;
...@@ -43,19 +45,21 @@ public: ...@@ -43,19 +45,21 @@ public:
virtual RankedTreeBase * clone ( ) const; virtual RankedTreeBase * clone ( ) const;
virtual RankedTreeBase * plunder ( ) &&; virtual RankedTreeBase * plunder ( ) &&;
   
virtual bool removeSymbolFromAlphabet ( const alphabet::RankedSymbol & symbol );
/** /**
* @return List of symbols forming tree (const version). * @return List of symbols forming tree (const version).
*/ */
const std::vector < alphabet::RankedSymbol > & getContent ( ) const; const std::vector < alphabet::RankedSymbol > & getContent ( ) const;
   
const std::set < alphabet::RankedSymbol > & getAlphabet ( ) const { const std::set < alphabet::RankedSymbol > & getAlphabet ( ) const {
return RankedPatternAlphabet::getAlphabet ( ); return accessComponent < GeneralAlphabet > ( ).get ( );
} }
   
void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) { 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 ); 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