From f2b45629cf24296892038c1332aeca9d3d0c83e0 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 28 Apr 2016 18:08:41 +0200 Subject: [PATCH] PrefixRankedPattern use components --- alib2data/src/tree/common/RankedAlphabet.cpp | 40 ----------- alib2data/src/tree/common/RankedAlphabet.h | 60 ----------------- .../src/tree/common/RankedPatternAlphabet.cpp | 37 ---------- .../src/tree/common/RankedPatternAlphabet.h | 41 ------------ .../src/tree/ranked/PrefixRankedPattern.cpp | 67 +++++++++++-------- .../src/tree/ranked/PrefixRankedPattern.h | 16 +++-- alib2data/src/tree/ranked/RankedNode.h | 1 - 7 files changed, 50 insertions(+), 212 deletions(-) delete mode 100644 alib2data/src/tree/common/RankedAlphabet.cpp delete mode 100644 alib2data/src/tree/common/RankedAlphabet.h delete mode 100644 alib2data/src/tree/common/RankedPatternAlphabet.cpp delete mode 100644 alib2data/src/tree/common/RankedPatternAlphabet.h diff --git a/alib2data/src/tree/common/RankedAlphabet.cpp b/alib2data/src/tree/common/RankedAlphabet.cpp deleted file mode 100644 index 1e63249760..0000000000 --- a/alib2data/src/tree/common/RankedAlphabet.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * RankedAlphabet.cpp - * - * Created on: Apr 16, 2013 - * Author: Stepan Plachy - */ - -#include "RankedAlphabet.h" - -#include <algorithm> - -namespace tree { - -const std::set<alphabet::RankedSymbol>& RankedAlphabet::getAlphabet() const { - return alphabet; -} - -bool RankedAlphabet::addSymbolToAlphabet(alphabet::RankedSymbol symbol) { - return alphabet.insert(std::move(symbol)).second; -} - -void RankedAlphabet::addSymbolsToAlphabet(const std::set<alphabet::RankedSymbol>& symbols) { - for(const alphabet::RankedSymbol& addedSymbol : symbols) { - addSymbolToAlphabet(addedSymbol); - } -} - -void RankedAlphabet::setAlphabet(std::set<alphabet::RankedSymbol> newSymbols) { - std::set<alphabet::RankedSymbol> removed; - std::set_difference(alphabet.begin(), alphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end())); - - for(const alphabet::RankedSymbol& removedSymbol : removed) { - removeSymbolFromAlphabet(removedSymbol); - } - - alphabet = std::move(newSymbols); -} - -} /* namespace tree */ - diff --git a/alib2data/src/tree/common/RankedAlphabet.h b/alib2data/src/tree/common/RankedAlphabet.h deleted file mode 100644 index d976d3371e..0000000000 --- a/alib2data/src/tree/common/RankedAlphabet.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * RankedAlphabet.h - * - * Created on: Apr 10, 2013 - * Author: Stepan Plachy - */ - -#ifndef RANKED_ALPHABET_H_ -#define RANKED_ALPHABET_H_ - -#include <set> -#include "../../alphabet/RankedSymbol.h" - -namespace tree { - -/** - * Abstract base class for all strings. Contains common elements of strings. - */ -class RankedAlphabet { -protected: - std::set<alphabet::RankedSymbol> alphabet; - -public: - /** - * Adds input symbol to input alphabet. - * @param symbol Symbol to add - */ - bool addSymbolToAlphabet(alphabet::RankedSymbol symbol); - - /** - * Adds input symbols to input alphabet. - * @param symbols Symbol to add - */ - void addSymbolsToAlphabet(const std::set<alphabet::RankedSymbol>& symbols); - - /** - * Sets input symbols of the tree. - * @param symbols Symbols to set - */ - void setAlphabet(std::set<alphabet::RankedSymbol> symbols); - - /** - * Removes input symbol from the input alphabet. - * @param symbol Symbol to remove - * @throws AutomatonException when symbol is not present in input alphabet - * or when symbol is part of the transition - */ - virtual bool removeSymbolFromAlphabet(const alphabet::RankedSymbol& symbol) = 0; - - /** - * @return the input alphabet - */ - const std::set<alphabet::RankedSymbol>& getAlphabet() const; - -}; - -} /* namespace tree */ - -#endif /* RANKED_ALPHABET_H_ */ - diff --git a/alib2data/src/tree/common/RankedPatternAlphabet.cpp b/alib2data/src/tree/common/RankedPatternAlphabet.cpp deleted file mode 100644 index eb567a40a7..0000000000 --- a/alib2data/src/tree/common/RankedPatternAlphabet.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - * RankedAlphabet.cpp - * - * Created on: Apr 16, 2013 - * Author: Jan Travnicek - */ - -#include "RankedPatternAlphabet.h" -#include "../TreeException.h" - -#include <algorithm> - -namespace tree { - -RankedPatternAlphabet::RankedPatternAlphabet(alphabet::RankedSymbol subtreeWildcard) : subtreeWildcard(subtreeWildcard) { - if(subtreeWildcard.getRank().getData() != 0) - throw TreeException("Subtree wildcard symbol " + (std::string) subtreeWildcard + " has nonzero rank"); - alphabet.insert(std::move(subtreeWildcard)); -} - -void RankedPatternAlphabet::setSubtreeWildcard(alphabet::RankedSymbol symbol) { - if (!alphabet.count(symbol)) - throw TreeException("Subtree wildcard symbol \"" + (std::string) symbol + "\" is not in the alphabet."); - - if(subtreeWildcard.getRank().getData() != 0) - throw TreeException("Subtree wildcard symbol " + (std::string) symbol + " has nonzero rank"); - - subtreeWildcard = std::move(symbol); - -} - -const alphabet::RankedSymbol& RankedPatternAlphabet::getSubtreeWildcard() const { - return subtreeWildcard; -} - -} /* namespace tree */ - diff --git a/alib2data/src/tree/common/RankedPatternAlphabet.h b/alib2data/src/tree/common/RankedPatternAlphabet.h deleted file mode 100644 index 7be0404602..0000000000 --- a/alib2data/src/tree/common/RankedPatternAlphabet.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * RankedPatternAlphabet.h - * - * Created on: Apr 10, 2013 - * Author: Jan Travnicek - */ - -#ifndef RANKED_PATTERN_ALPHABET_H_ -#define RANKED_PATTERN_ALPHABET_H_ - -#include "RankedAlphabet.h" - -namespace tree { - -/** - * Abstract base class for all strings. Contains common elements of strings. - */ -class RankedPatternAlphabet : public RankedAlphabet { -protected: - alphabet::RankedSymbol subtreeWildcard; - -public: - RankedPatternAlphabet(alphabet::RankedSymbol subtreeWildcard); - - /** - * Sets the subtree variable = symbol representing subtree substitution place in the pattern - * @param symbol Symbol to set - */ - void setSubtreeWildcard(alphabet::RankedSymbol symbol); - - /** - * @return symbol representing subtree variable - */ - const alphabet::RankedSymbol& getSubtreeWildcard() const; - -}; - -} /* namespace tree */ - -#endif /* RANKED_PATTERN_ALPHABET_H_ */ - diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp index 63ac7e1b5e..c500ddedb0 100644 --- a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp @@ -28,28 +28,22 @@ namespace tree { -PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) { - addSymbolsToAlphabet ( std::move ( alphabet ) ); +PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) + std::set < alphabet::RankedSymbol > { subtreeWildcard } ), std::make_tuple ( subtreeWildcard ) ) { setContent ( std::move ( data ) ); } -PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) { - arityChecksum ( data ); - - addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) ); - m_Data = std::move ( data ); +PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : PrefixRankedPattern ( std::move ( subtreeWildcard ), std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ), std::move ( data ) ) { } PrefixRankedPattern::PrefixRankedPattern ( const PrefixRankedTree & tree ) : PrefixRankedPattern ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ), tree.getAlphabet ( ), tree.getContent ( ) ) { } -PrefixRankedPattern::PrefixRankedPattern ( const RankedPattern & tree ) : RankedPatternAlphabet ( tree.getSubtreeWildcard ( ) ) { +PrefixRankedPattern::PrefixRankedPattern ( const RankedPattern & tree ) : std::Components < PrefixRankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::make_tuple ( tree.getSubtreeWildcard ( ) ) ) { toPrefixRanked ( tree.getRoot ( ) ); - addSymbolsToAlphabet ( tree.getAlphabet ( ) ); } void PrefixRankedPattern::toPrefixRanked ( const RankedNode & node ) { - if ( node.getSymbol ( ) == subtreeWildcard ) { + if ( node.getSymbol ( ) == accessElement < tree::SubtreeWildcard > ( ).get ( ) ) { m_Data.push_back ( node.getSymbol ( ) ); } else { m_Data.push_back ( node.getSymbol ( ) ); @@ -67,18 +61,6 @@ RankedTreeBase * PrefixRankedPattern::plunder ( ) && { return new PrefixRankedPattern ( std::move ( * this ) ); } -bool PrefixRankedPattern::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 > & PrefixRankedPattern::getContent ( ) const { return this->m_Data; } @@ -88,7 +70,7 @@ void PrefixRankedPattern::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." ); @@ -112,8 +94,8 @@ bool PrefixRankedPattern::isEmpty ( ) const { } int PrefixRankedPattern::compare ( const PrefixRankedPattern & 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; @@ -154,14 +136,45 @@ PrefixRankedPattern PrefixRankedPattern::parse ( std::deque < sax::Token >::iter void PrefixRankedPattern::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( PrefixRankedPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); - TreeToXMLComposer::composeSubtreeWildcard ( out, subtreeWildcard ); - TreeToXMLComposer::composeAlphabet ( out, alphabet ); + TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard() ); + TreeToXMLComposer::composeAlphabet ( out, getAlphabet() ); TreeToXMLComposer::composeContent ( out, m_Data ); out.emplace_back ( PrefixRankedPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); } } /* namespace tree */ +namespace std { + +template < > +bool tree::PrefixRankedPattern::Component < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::used ( const alphabet::RankedSymbol & symbol ) const { + const tree::PrefixRankedPattern * pattern = static_cast < const tree::PrefixRankedPattern * > ( 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::PrefixRankedPattern::Component < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::available ( const alphabet::RankedSymbol & ) const { + return true; +} + +template < > +void tree::PrefixRankedPattern::Component < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const { +} + +template < > +bool tree::PrefixRankedPattern::Element < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::available ( const alphabet::RankedSymbol & symbol ) const { + return static_cast < const tree::PrefixRankedPattern * > ( this )->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); +} + +template < > +void tree::PrefixRankedPattern::Element < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & ) const { +} + +} /* namespace std */ + + namespace alib { auto prefixRankedPatternParserRegister = xmlApi < tree::Tree >::ParserRegister < tree::PrefixRankedPattern > (); diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.h b/alib2data/src/tree/ranked/PrefixRankedPattern.h index c43e98bf59..d252f4e3a0 100644 --- a/alib2data/src/tree/ranked/PrefixRankedPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedPattern.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 PrefixRankedTree; +class GeneralAlphabet; +class SubtreeWildcard; /** * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of LinearStringElement. */ -class PrefixRankedPattern : public RankedTreeBase, public RankedPatternAlphabet { +class PrefixRankedPattern : public RankedTreeBase, public std::Components < PrefixRankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > { std::vector < alphabet::RankedSymbol > m_Data; void toPrefixRanked ( const RankedNode & node ); @@ -39,19 +41,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 ); diff --git a/alib2data/src/tree/ranked/RankedNode.h b/alib2data/src/tree/ranked/RankedNode.h index f967ae40a6..83146a9830 100644 --- a/alib2data/src/tree/ranked/RankedNode.h +++ b/alib2data/src/tree/ranked/RankedNode.h @@ -12,7 +12,6 @@ #include "../../alphabet/RankedSymbol.h" #include <vector> #include <set> -#include "../common/RankedAlphabet.h" namespace tree { -- GitLab