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