From daabc3bede5b2541a22a27393ad927246b6e26d5 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 17 Nov 2016 19:01:58 +0100 Subject: [PATCH] template nonlinearVariableSymbol symbol --- .../src/tree/generate/RandomTreeFactory.cpp | 8 +- .../src/alphabet/NonlinearVariableSymbol.cpp | 64 +-------------- .../src/alphabet/NonlinearVariableSymbol.h | 80 ++++++++++++++++++- alib2data/src/alphabet/SymbolFeatures.h | 1 + .../src/alphabet/SymbolToStringComposer.cpp | 4 +- .../src/alphabet/SymbolToStringComposer.h | 2 +- alib2str/src/tree/TreeFromStringParser.cpp | 8 +- 7 files changed, 90 insertions(+), 77 deletions(-) diff --git a/alib2algo/src/tree/generate/RandomTreeFactory.cpp b/alib2algo/src/tree/generate/RandomTreeFactory.cpp index 655c0e59c7..b227061de2 100644 --- a/alib2algo/src/tree/generate/RandomTreeFactory.cpp +++ b/alib2algo/src/tree/generate/RandomTreeFactory.cpp @@ -165,9 +165,9 @@ struct Node { std::tree < std::ranked_symbol < > > createRankedNonlinearPatternNode ( bool singleNonlinearVariable ) { if ( rank == 0 ) { if ( singleNonlinearVariable ) - return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( "A" ) ) ), 0 ), { } ); + return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( "A" ) ) ), 0 ), { } ); else - return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( symbol ) ), 0 ), { } ); + return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( symbol ) ), 0 ), { } ); } else { std::vector < std::tree < std::ranked_symbol < > > > children; Node * nextChild = child; @@ -373,10 +373,10 @@ RankedNonlinearPattern < > RandomTreeFactory::generateRankedNonlinearPattern ( i treeRankedAlphabet.insert ( std::ranked_symbol < > ( i, it.first ) ); if ( singleNonlinearVariable ) - nonlinearVariables.insert ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( "A" ) ) ), 0 ) ); + nonlinearVariables.insert ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( "A" ) ) ), 0 ) ); else for ( char i : rankedAlphabet [ 0 ] ) - nonlinearVariables.insert ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( i ) ), 0 ) ); + nonlinearVariables.insert ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( i ) ), 0 ) ); std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); treeRankedAlphabet.insert ( subtreeWildcard ); diff --git a/alib2data/src/alphabet/NonlinearVariableSymbol.cpp b/alib2data/src/alphabet/NonlinearVariableSymbol.cpp index 0553135e53..b2e025120f 100644 --- a/alib2data/src/alphabet/NonlinearVariableSymbol.cpp +++ b/alib2data/src/alphabet/NonlinearVariableSymbol.cpp @@ -6,73 +6,13 @@ */ #include "NonlinearVariableSymbol.h" -#include <sax/FromXMLParserHelper.h> #include "Symbol.h" #include <object/Object.h> #include <core/xmlApi.hpp> -#include "UniqueSymbol.h" - -namespace alphabet { - -NonlinearVariableSymbol::NonlinearVariableSymbol ( int number ) : m_symbol ( alphabet::symbolFrom ( number ) ) { -} - -NonlinearVariableSymbol::NonlinearVariableSymbol ( char character ) : m_symbol ( alphabet::symbolFrom ( character ) ) { -} - -NonlinearVariableSymbol::NonlinearVariableSymbol ( std::string symbol ) : m_symbol ( alphabet::symbolFrom ( std::move ( symbol ) ) ) { -} - -NonlinearVariableSymbol::NonlinearVariableSymbol ( alphabet::Symbol symbol ) : m_symbol ( std::move ( symbol ) ) { -} - -SymbolBase * NonlinearVariableSymbol::clone ( ) const { - return new NonlinearVariableSymbol ( * this ); -} - -SymbolBase * NonlinearVariableSymbol::plunder ( ) && { - return new NonlinearVariableSymbol ( std::move ( * this ) ); -} - -const alphabet::Symbol& NonlinearVariableSymbol::getSymbol() const { - return m_symbol; -} - -int NonlinearVariableSymbol::compare ( const NonlinearVariableSymbol & other ) const { - return this->m_symbol.getData ( ).compare ( other.m_symbol.getData ( ) ); -} - -void NonlinearVariableSymbol::operator >>( std::ostream & out ) const { - out << "(NonlinearVariableSymbol " << m_symbol << ")"; -} - -NonlinearVariableSymbol::operator std::string ( ) const { - return "$" + std::to_string ( m_symbol ); -} - -NonlinearVariableSymbol NonlinearVariableSymbol::parse ( std::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, NonlinearVariableSymbol::getXmlTagName() ); - alphabet::Symbol data = alib::xmlApi < alphabet::Symbol >::parse ( input ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, NonlinearVariableSymbol::getXmlTagName() ); - - return NonlinearVariableSymbol ( data ); -} - -void NonlinearVariableSymbol::compose ( std::deque < sax::Token > & out ) const { - out.emplace_back ( NonlinearVariableSymbol::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - alib::xmlApi < alphabet::Symbol >::compose ( out, m_symbol ); - out.emplace_back ( NonlinearVariableSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); -} - -SymbolBase * NonlinearVariableSymbol::inc ( ) && { - return new UniqueSymbol ( Symbol ( std::move ( * this ) ), primitive::Integer ( 0 ) ); -} - -} /* namespace alphabet */ namespace alib { -auto nonlinearVariableSymbolParserRegister = xmlApi < alphabet::Symbol >::ParserRegister < alphabet::NonlinearVariableSymbol > ( ); -auto nonlinearVariableSymbolParserRegister2 = xmlApi < alib::Object >::ParserRegister < alphabet::NonlinearVariableSymbol > ( ); +auto nonlinearVariableSymbolParserRegister = xmlApi < alphabet::Symbol >::ParserRegister < alphabet::NonlinearVariableSymbol < > > ( ); +auto nonlinearVariableSymbolParserRegister2 = xmlApi < alib::Object >::ParserRegister < alphabet::NonlinearVariableSymbol < > > ( ); } /* namespace alib */ diff --git a/alib2data/src/alphabet/NonlinearVariableSymbol.h b/alib2data/src/alphabet/NonlinearVariableSymbol.h index 4a5a35c149..13a8fb9bca 100644 --- a/alib2data/src/alphabet/NonlinearVariableSymbol.h +++ b/alib2data/src/alphabet/NonlinearVariableSymbol.h @@ -8,21 +8,26 @@ #ifndef NONLINEAR_VARIABLE_SYMBOL_H_ #define NONLINEAR_VARIABLE_SYMBOL_H_ +#include <sax/FromXMLParserHelper.h> + #include "Symbol.h" +#include "SymbolFeatures.h" +#include "UniqueSymbol.h" namespace alphabet { /** * Represents subtreeWildcard symbol for tree linearization. */ +template < class SymbolType > class NonlinearVariableSymbol : public SymbolBase { - alphabet::Symbol m_symbol; + SymbolType m_symbol; public: explicit NonlinearVariableSymbol ( int number ); explicit NonlinearVariableSymbol ( char character ); explicit NonlinearVariableSymbol ( std::string symbol ); - explicit NonlinearVariableSymbol ( alphabet::Symbol symbol ); + explicit NonlinearVariableSymbol ( SymbolType symbol ); /** * Creates a subtreeWildcard symbol. @@ -36,7 +41,7 @@ public: /** * @return name of the symbol */ - const alphabet::Symbol & getSymbol ( ) const; + const SymbolType & getSymbol ( ) const; virtual int compare ( const ObjectBase & other ) const { if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other ); @@ -56,13 +61,80 @@ public: return xmlTagName; } - static NonlinearVariableSymbol parse ( std::deque < sax::Token >::iterator & input ); + static NonlinearVariableSymbol < SymbolType > parse ( std::deque < sax::Token >::iterator & input ); void compose ( std::deque < sax::Token > & out ) const; virtual SymbolBase * inc ( ) &&; }; +template < class SymbolType > +NonlinearVariableSymbol < SymbolType >::NonlinearVariableSymbol ( int number ) : m_symbol ( alphabet::symbolFrom ( number ) ) { +} + +template < class SymbolType > +NonlinearVariableSymbol < SymbolType >::NonlinearVariableSymbol ( char character ) : m_symbol ( alphabet::symbolFrom ( character ) ) { +} + +template < class SymbolType > +NonlinearVariableSymbol < SymbolType >::NonlinearVariableSymbol ( std::string symbol ) : m_symbol ( alphabet::symbolFrom ( std::move ( symbol ) ) ) { +} + +template < class SymbolType > +NonlinearVariableSymbol < SymbolType >::NonlinearVariableSymbol ( SymbolType symbol ) : m_symbol ( std::move ( symbol ) ) { +} + +template < class SymbolType > +SymbolBase * NonlinearVariableSymbol < SymbolType >::clone ( ) const { + return new NonlinearVariableSymbol ( * this ); +} + +template < class SymbolType > +SymbolBase * NonlinearVariableSymbol < SymbolType >::plunder ( ) && { + return new NonlinearVariableSymbol ( std::move ( * this ) ); +} + +template < class SymbolType > +const SymbolType& NonlinearVariableSymbol < SymbolType >::getSymbol() const { + return m_symbol; +} + +template < class SymbolType > +int NonlinearVariableSymbol < SymbolType >::compare ( const NonlinearVariableSymbol & other ) const { + return this->m_symbol.getData ( ).compare ( other.m_symbol.getData ( ) ); +} + +template < class SymbolType > +void NonlinearVariableSymbol < SymbolType >::operator >>( std::ostream & out ) const { + out << "(NonlinearVariableSymbol " << m_symbol << ")"; +} + +template < class SymbolType > +NonlinearVariableSymbol < SymbolType >::operator std::string ( ) const { + return "$" + std::to_string ( m_symbol ); +} + +template < class SymbolType > +NonlinearVariableSymbol < SymbolType > NonlinearVariableSymbol < SymbolType >::parse ( std::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, NonlinearVariableSymbol::getXmlTagName() ); + SymbolType data = alib::xmlApi < SymbolType >::parse ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, NonlinearVariableSymbol::getXmlTagName() ); + + return NonlinearVariableSymbol < SymbolType > ( data ); +} + +template < class SymbolType > +void NonlinearVariableSymbol < SymbolType >::compose ( std::deque < sax::Token > & out ) const { + out.emplace_back ( NonlinearVariableSymbol::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); + alib::xmlApi < SymbolType >::compose ( out, m_symbol ); + out.emplace_back ( NonlinearVariableSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); +} + +template < class SymbolType > +SymbolBase * NonlinearVariableSymbol < SymbolType >::inc ( ) && { + return new UniqueSymbol ( Symbol ( std::move ( * this ) ), primitive::Integer ( 0 ) ); +} + } /* namespace alphabet */ #endif /* NONLINEAR_VARIABLE_SYMBOL_H_ */ diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h index 1f4bf16672..75dfec820b 100644 --- a/alib2data/src/alphabet/SymbolFeatures.h +++ b/alib2data/src/alphabet/SymbolFeatures.h @@ -41,6 +41,7 @@ class RankedSymbol; class BarSymbol; class VariablesBarSymbol; class SubtreeWildcardSymbol; +template < class SymbolType = Symbol > class NonlinearVariableSymbol; class SymbolPairSymbol; class SymbolSetSymbol; diff --git a/alib2str/src/alphabet/SymbolToStringComposer.cpp b/alib2str/src/alphabet/SymbolToStringComposer.cpp index 3cf32e83cf..99a6b65721 100644 --- a/alib2str/src/alphabet/SymbolToStringComposer.cpp +++ b/alib2str/src/alphabet/SymbolToStringComposer.cpp @@ -79,12 +79,12 @@ void SymbolToStringComposer::compose(std::ostream& out, const SubtreeWildcardSym SymbolToStringComposer::RegistratorWrapper<void, SubtreeWildcardSymbol> SymbolToStringComposerSubtreeWildcardSymbol = SymbolToStringComposer::RegistratorWrapper<void, SubtreeWildcardSymbol>(SymbolToStringComposer::compose); -void SymbolToStringComposer::compose(std::ostream& out, const NonlinearVariableSymbol& symbol ) { +void SymbolToStringComposer::compose(std::ostream& out, const NonlinearVariableSymbol < > & symbol ) { out << "$"; alib::stringApi<alphabet::Symbol>::compose(out, symbol.getSymbol()); } -SymbolToStringComposer::RegistratorWrapper<void, NonlinearVariableSymbol> SymbolToStringComposerNonlinearVariableSymbol = SymbolToStringComposer::RegistratorWrapper<void, NonlinearVariableSymbol>(SymbolToStringComposer::compose); +SymbolToStringComposer::RegistratorWrapper<void, NonlinearVariableSymbol < > > SymbolToStringComposerNonlinearVariableSymbol = SymbolToStringComposer::RegistratorWrapper<void, NonlinearVariableSymbol < > >(SymbolToStringComposer::compose); void SymbolToStringComposer::compose(std::ostream& out, const SymbolSetSymbol& symbol) { out << '['; diff --git a/alib2str/src/alphabet/SymbolToStringComposer.h b/alib2str/src/alphabet/SymbolToStringComposer.h index 2930096ed8..fef4a6115c 100644 --- a/alib2str/src/alphabet/SymbolToStringComposer.h +++ b/alib2str/src/alphabet/SymbolToStringComposer.h @@ -29,7 +29,7 @@ public: static void compose(std::ostream& output, const BarSymbol& symbol); static void compose(std::ostream& output, const VariablesBarSymbol& symbol); static void compose(std::ostream& output, const SubtreeWildcardSymbol& symbol); - static void compose(std::ostream& output, const NonlinearVariableSymbol& symbol); + static void compose(std::ostream& output, const NonlinearVariableSymbol < > & symbol); static void compose(std::ostream& output, const SymbolPairSymbol& symbol); static void compose(std::ostream& output, const SymbolSetSymbol& symbol); static void compose(std::ostream& output, const UniqueSymbol& symbol); diff --git a/alib2str/src/tree/TreeFromStringParser.cpp b/alib2str/src/tree/TreeFromStringParser.cpp index 6c57da18cd..2f19e1d38b 100644 --- a/alib2str/src/tree/TreeFromStringParser.cpp +++ b/alib2str/src/tree/TreeFromStringParser.cpp @@ -38,11 +38,11 @@ Tree TreeFromStringParser::parseTree ( std::istream & input, const std::set < FE if ( token.type == TreeFromStringLexer::TokenType::BAR ) { alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); - alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( token.value ) ) ); + alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ); return Tree ( UnrankedNonlinearPattern < > ( subtreeWildcard, { nonlinearVariable }, std::tree < alphabet::Symbol > ( subtreeWildcard, { } ) ) ); } else { std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); - std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( token.value ) ) ), 0 ); + std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ), 0 ); return Tree ( RankedNonlinearPattern < > ( subtreeWildcard, { nonlinearVariable }, std::tree < std::ranked_symbol < > > ( nonlinearVariable, { } ) ) ); } } else { @@ -124,7 +124,7 @@ std::tree < std::ranked_symbol < > > TreeFromStringParser::parseRankedContent ( return std::tree < std::ranked_symbol < > > ( std::move ( subtreeWildcard ), { } ); } else if ( token.type == TreeFromStringLexer::TokenType::NONLINEAR_VARIABLE ) { isPattern = true; - std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( token.value ) ) ), 0 ); + std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ), 0 ); nonlinearVariables.insert ( nonlinearVariable ); return std::tree < std::ranked_symbol < > > ( std::move ( nonlinearVariable ), { } ); } else { @@ -167,7 +167,7 @@ std::tree < alphabet::Symbol > TreeFromStringParser::parseUnrankedContent ( std: throw exception::CommonException ( "Missing bar" ); isPattern = true; - alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( token.value ) ) ); + alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ); nonlinearVariables.insert ( nonlinearVariable ); return std::tree < alphabet::Symbol > ( std::move ( nonlinearVariable ), { } ); } else { -- GitLab