From 36e3b1dd5f423f1ff4db626da9932cc1b59a34a7 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Fri, 13 Apr 2018 16:59:58 +0200 Subject: [PATCH] drop appendElement from rte symbol alphabet --- .../src/rte/glushkov/GlushkovIndexate.cpp | 7 ++-- .../src/regexp/formal/FormalRegExpElement.h | 4 ++ .../regexp/unbounded/UnboundedRegExpElement.h | 4 ++ alib2data/src/rte/formal/FormalRTEElement.h | 4 ++ .../src/rte/formal/FormalRTESymbolAlphabet.h | 39 ++++--------------- .../src/rte/xml/common/RTEFromXmlParser.h | 12 ++---- alib2data/test-src/rte/RTETest.cpp | 27 +++++++------ 7 files changed, 41 insertions(+), 56 deletions(-) diff --git a/alib2algo/src/rte/glushkov/GlushkovIndexate.cpp b/alib2algo/src/rte/glushkov/GlushkovIndexate.cpp index 6317772474..dcdc8f599e 100644 --- a/alib2algo/src/rte/glushkov/GlushkovIndexate.cpp +++ b/alib2algo/src/rte/glushkov/GlushkovIndexate.cpp @@ -30,14 +30,13 @@ FormalRTE < > GlushkovIndexate::index ( const rte::FormalRTE < > & rte ) { ext::rvalue_ref < FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > GlushkovIndexate::Formal::visit ( const rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > & node, int & i ) { DefaultSymbolsPairType sps = DefaultSymbolsPairType ( ext::make_pair ( DefaultSymbolType ( node.getSymbol ( ).getSymbol ( ) ), DefaultSymbolType ( i++ ) ) ); - FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > * ns = new FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( common::ranked_symbol < > ( DefaultSymbolType ( sps ), node.getSymbol ( ).getRank ( ) ) ); - + ext::vector < ext::smart_ptr < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > > children; for ( const ext::smart_ptr < const rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > & e : node.getElements ( ) ) { ext::rvalue_ref < FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > child = e->accept < ext::rvalue_ref < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > >, GlushkovIndexate::Formal > ( i ); - ns->appendElement ( child ); + children.push_back ( ext::smart_ptr < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > ( ( ( FormalRTEElement < DefaultSymbolType, primitive::Unsigned > && ) child ).plunder ( ) ) ); } - return ext::rvalue_ref < FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > > ( ns ); + return ext::rvalue_ref < FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > > ( new FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( common::ranked_symbol < > ( DefaultSymbolType ( sps ), node.getSymbol ( ).getRank ( ) ), std::move ( children ) ) ); } ext::rvalue_ref < FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > GlushkovIndexate::Formal::visit ( const rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > & node, int & ) { diff --git a/alib2data/src/regexp/formal/FormalRegExpElement.h b/alib2data/src/regexp/formal/FormalRegExpElement.h index c2835786a2..0ff8d2083d 100644 --- a/alib2data/src/regexp/formal/FormalRegExpElement.h +++ b/alib2data/src/regexp/formal/FormalRegExpElement.h @@ -118,6 +118,10 @@ protected: virtual void accept ( FormalRegExpElement::Visitor & visitor ) const = 0; public: + virtual FormalRegExpElement < SymbolType > * clone ( ) const override = 0; + + virtual FormalRegExpElement < SymbolType > * plunder ( ) && override = 0; + /** * Visitor interface method. * diff --git a/alib2data/src/regexp/unbounded/UnboundedRegExpElement.h b/alib2data/src/regexp/unbounded/UnboundedRegExpElement.h index d367a4cf04..9ecbe87e39 100644 --- a/alib2data/src/regexp/unbounded/UnboundedRegExpElement.h +++ b/alib2data/src/regexp/unbounded/UnboundedRegExpElement.h @@ -118,6 +118,10 @@ protected: virtual void accept ( UnboundedRegExpElement::Visitor & visitor ) const = 0; public: + virtual UnboundedRegExpElement < SymbolType > * clone ( ) const override = 0; + + virtual UnboundedRegExpElement < SymbolType > * plunder ( ) && override = 0; + /** * Visitor interface method. * diff --git a/alib2data/src/rte/formal/FormalRTEElement.h b/alib2data/src/rte/formal/FormalRTEElement.h index 0e53b364fd..035f0e8375 100644 --- a/alib2data/src/rte/formal/FormalRTEElement.h +++ b/alib2data/src/rte/formal/FormalRTEElement.h @@ -121,6 +121,10 @@ protected: virtual void accept ( FormalRTEElement::Visitor & visitor ) const = 0; public: + virtual FormalRTEElement < SymbolType, RankType > * clone ( ) const override = 0; + + virtual FormalRTEElement < SymbolType, RankType > * plunder ( ) && override = 0; + /** * Visitor interface method. * diff --git a/alib2data/src/rte/formal/FormalRTESymbolAlphabet.h b/alib2data/src/rte/formal/FormalRTESymbolAlphabet.h index 22573d22e4..15dc5df7c0 100644 --- a/alib2data/src/rte/formal/FormalRTESymbolAlphabet.h +++ b/alib2data/src/rte/formal/FormalRTESymbolAlphabet.h @@ -58,7 +58,7 @@ public: * * \param symbol the value of the represented symbol */ - explicit FormalRTESymbolAlphabet ( common::ranked_symbol < SymbolType, RankType > symbol ); + explicit FormalRTESymbolAlphabet ( common::ranked_symbol < SymbolType, RankType > symbol, ext::vector < ext::smart_ptr < FormalRTEElement < SymbolType, RankType > > > children ); /** * @copydoc FormalRTEElement::clone() const @@ -99,16 +99,6 @@ public: */ const ext::vector < ext::smart_ptr < FormalRTEElement < SymbolType, RankType > > > & getElements ( ); - /** - * FIXME remove - */ - void appendElement ( const FormalRTEElement < SymbolType, RankType > & element ); - - /** - * FIXME remove - */ - void appendElement ( FormalRTEElement < SymbolType, RankType > && element ); - /** * @copydoc alib::CommonBase < FormalRTEElement < SymbolType, RankType > >::compare ( const FormalRTEElement < SymbolType, RankType > & ) */ @@ -141,17 +131,19 @@ public: * @copydoc regexp::FormalRTEElement < SymbolType, RankType >::normalize ( ) && */ virtual ext::smart_ptr < FormalRTEElement < DefaultSymbolType, DefaultRankType > > normalize ( ) && override { - FormalRTESymbolAlphabet < DefaultSymbolType, DefaultRankType > res ( alphabet::SymbolNormalize::normalizeRankedSymbol ( std::move ( this->m_symbol ) ) ); - + ext::vector < ext::smart_ptr < FormalRTEElement < DefaultSymbolType, DefaultRankType > > > children; for ( const ext::smart_ptr < FormalRTEElement < SymbolType, RankType > > & element : this->getChildren ( ) ) - res.appendElement ( * std::move ( * element ).normalize ( ) ); + children.push_back ( ext::smart_ptr < FormalRTEElement < SymbolType, RankType > > ( std::move ( * element ).normalize ( ) ) ); - return ext::smart_ptr < FormalRTEElement < DefaultSymbolType, DefaultRankType > > ( std::move ( res ).plunder ( ) ); + return ext::smart_ptr < FormalRTEElement < DefaultSymbolType, DefaultRankType > > ( new FormalRTESymbolAlphabet < DefaultSymbolType, DefaultRankType > ( alphabet::SymbolNormalize::normalizeRankedSymbol ( std::move ( this->m_symbol ) ), std::move ( children ) ) ); } }; template < class SymbolType, class RankType > -FormalRTESymbolAlphabet < SymbolType, RankType >::FormalRTESymbolAlphabet ( common::ranked_symbol < SymbolType, RankType > symbol ) : FormalRTESymbol < SymbolType, RankType > ( symbol ) { +FormalRTESymbolAlphabet < SymbolType, RankType >::FormalRTESymbolAlphabet ( common::ranked_symbol < SymbolType, RankType > symbol, ext::vector < ext::smart_ptr < FormalRTEElement < SymbolType, RankType > > > children ) : FormalRTESymbol < SymbolType, RankType > ( symbol ), ext::VararyNode < ext::smart_ptr < FormalRTEElement < SymbolType, RankType > >, ext::smart_ptr < const FormalRTEElement < SymbolType, RankType > >, FormalRTESymbolAlphabet < SymbolType, RankType > > ( std::move ( children ) ) { + if ( this->getChildren ( ).size ( ) != ( size_t ) this->getSymbol ( ).getRank ( ) ) + throw exception::CommonException ( "Symbol's rank and number of children differ. Rank is " + ext::to_string ( this->getSymbol ( ).getRank ( ) ) + ", number of children is " + ext::to_string ( this->getChildren ( ).size ( ) ) + "." ); + } template < class SymbolType, class RankType > @@ -174,21 +166,6 @@ const ext::vector < ext::smart_ptr < FormalRTEElement < SymbolType, RankType > > return this->getChildren ( ); } -template < class SymbolType, class RankType > -void FormalRTESymbolAlphabet < SymbolType, RankType >::appendElement ( const FormalRTEElement < SymbolType, RankType > & element ) { - return appendElement ( ext::move_copy ( element ) ); -} - -template < class SymbolType, class RankType > -void FormalRTESymbolAlphabet < SymbolType, RankType >::appendElement ( FormalRTEElement < SymbolType, RankType > && element ) { - // FIXME: Remove this. Pass vector in constructor. Now an Element can have LESS children that is MUST have. - - if ( this->getChildren ( ).size ( ) >= ( size_t ) this->getSymbol ( ).getRank ( ) ) - throw exception::CommonException ( "Ranked node cannot have more children then its rank" ); - - this->pushBackChild ( ext::smart_ptr < FormalRTEElement < SymbolType, RankType > > ( std::move ( element ).plunder ( ) ) ); -} - template < class SymbolType, class RankType > int FormalRTESymbolAlphabet < SymbolType, RankType >::compare ( const FormalRTESymbolAlphabet < SymbolType, RankType > & other ) const { auto first = ext::tie ( this->getSymbol ( ), this->getChildren ( ) ); diff --git a/alib2data/src/rte/xml/common/RTEFromXmlParser.h b/alib2data/src/rte/xml/common/RTEFromXmlParser.h index ac9983523b..831d360b5c 100644 --- a/alib2data/src/rte/xml/common/RTEFromXmlParser.h +++ b/alib2data/src/rte/xml/common/RTEFromXmlParser.h @@ -138,18 +138,12 @@ template < class SymbolType, class RankType > ext::rvalue_ref < FormalRTESymbolAlphabet < SymbolType, RankType > > RTEFromXmlParser::parseFormalRTESymbolAlphabet ( ext::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "symbol" ); common::ranked_symbol < SymbolType, RankType > symbol = core::xmlApi < common::ranked_symbol < SymbolType, RankType > >::parse ( input ); - ext::vector < ext::rvalue_ref < FormalRTEElement < SymbolType, RankType > > > elements; - - ext::rvalue_ref < FormalRTESymbolAlphabet < SymbolType, RankType > > ret ( new FormalRTESymbolAlphabet < SymbolType, RankType > ( symbol ) ); + ext::vector < ext::smart_ptr < FormalRTEElement < SymbolType, RankType > > > elements; while ( sax::FromXMLParserHelper::isTokenType ( input, sax::Token::TokenType::START_ELEMENT ) ) - elements.push_back ( parseFormalRTEElement < SymbolType, RankType > ( input ) ); - - if ( elements.size() != ( size_t ) symbol.getRank( ) ) - throw exception::CommonException ( "Parsed symbol's rank and number of children differ. Rank is " + ext::to_string ( symbol.getRank ( ) ) + ", number of children is " + ext::to_string ( elements.size ( ) ) + "." ); + elements.push_back ( ext::smart_ptr < FormalRTEElement < SymbolType, RankType > > ( ( ( FormalRTEElement < SymbolType, RankType > && ) parseFormalRTEElement < SymbolType, RankType > ( input ) ).plunder ( ) ) ); - for ( ext::rvalue_ref < FormalRTEElement < SymbolType, RankType > > & element : elements ) - ret->appendElement ( element ); + ext::rvalue_ref < FormalRTESymbolAlphabet < SymbolType, RankType > > ret ( new FormalRTESymbolAlphabet < SymbolType, RankType > ( std::move ( symbol ), std::move ( elements ) ) ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "symbol" ); diff --git a/alib2data/test-src/rte/RTETest.cpp b/alib2data/test-src/rte/RTETest.cpp index 1a027f981f..66f3cb254b 100644 --- a/alib2data/test-src/rte/RTETest.cpp +++ b/alib2data/test-src/rte/RTETest.cpp @@ -62,16 +62,17 @@ void RTETest::testCopyConstruct ( ) { frte.setAlphabetSymbols ( { symb_a2, symb_b0, symb_c0 } ); frte.setConstantSymbols ( { symb_y0, symb_z0 } ); - rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > b = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_b0 ); - rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > c = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_c0 ); + rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > b = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_b0, { } ); + rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > c = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_c0, { } ); rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > y = rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > ( symb_y0 ); rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > z = rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > ( symb_z0 ); rte::FormalRTEAlternation < DefaultSymbolType, primitive::Unsigned > alt = rte::FormalRTEAlternation < DefaultSymbolType, primitive::Unsigned > ( b, c ); - rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > a = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_a2 ); - a.appendElement ( y ); - a.appendElement ( z ); + ext::vector < ext::smart_ptr < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > > children; + children.push_back ( ext::smart_ptr < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > ( std::move ( y ).plunder ( ) ) ); + children.push_back ( ext::smart_ptr < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > ( std::move ( z ).plunder ( ) ) ); + rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > a = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_a2, std::move ( children ) ); rte::FormalRTEIteration < DefaultSymbolType, primitive::Unsigned > iter = rte::FormalRTEIteration < DefaultSymbolType, primitive::Unsigned > ( a, rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > ( symb_y0 ) ); rte::FormalRTESubstitution < DefaultSymbolType, primitive::Unsigned > subst = rte::FormalRTESubstitution < DefaultSymbolType, primitive::Unsigned > ( iter, alt, rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > ( symb_z0 ) ); @@ -98,19 +99,21 @@ void RTETest::testXMLParser ( ) { frte.setAlphabetSymbols ( { symb_a2, symb_b0, symb_c0, symb_d1 } ); frte.setConstantSymbols ( { symb_y0, symb_z0 } ); - rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > b = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_b0 ); - rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > c = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_c0 ); + rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > b = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_b0, { } ); + rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > c = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_c0, { } ); rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > y = rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > ( symb_y0 ); rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > z = rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > ( symb_z0 ); rte::FormalRTEAlternation < DefaultSymbolType, primitive::Unsigned > alt = rte::FormalRTEAlternation < DefaultSymbolType, primitive::Unsigned > ( b, c ); - rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > a = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_a2 ); - a.appendElement ( y ); - a.appendElement ( z ); + ext::vector < ext::smart_ptr < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > > children_a; + children_a.push_back ( ext::smart_ptr < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > ( std::move ( y ).plunder ( ) ) ); + children_a.push_back ( ext::smart_ptr < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > ( std::move ( z ).plunder ( ) ) ); + rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > a = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_a2, std::move ( children_a ) ); - rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > d = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_d1 ); - d.appendElement ( a ); + ext::vector < ext::smart_ptr < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > > children_d; + children_d.push_back ( ext::smart_ptr < rte::FormalRTEElement < DefaultSymbolType, primitive::Unsigned > > ( std::move ( a ).plunder ( ) ) ); + rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > d = rte::FormalRTESymbolAlphabet < DefaultSymbolType, primitive::Unsigned > ( symb_d1, children_d ); rte::FormalRTEIteration < DefaultSymbolType, primitive::Unsigned > iter = rte::FormalRTEIteration < DefaultSymbolType, primitive::Unsigned > ( d, rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > ( symb_y0 ) ); rte::FormalRTESubstitution < DefaultSymbolType, primitive::Unsigned > subst = rte::FormalRTESubstitution < DefaultSymbolType, primitive::Unsigned > ( iter, alt, rte::FormalRTESymbolSubst < DefaultSymbolType, primitive::Unsigned > ( symb_z0 ) ); -- GitLab