From 5fe9d5cecaf9bcba412618a966261ca25dafea09 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 19 Jul 2016 09:42:15 +0200
Subject: [PATCH] specialize public optimisation methods

---
 .../src/regexp/simplify/RegExpOptimize.h      |  4 +-
 .../simplify/RegExpOptimizeUnboundedPart.cxx  | 79 ++++++++++---------
 2 files changed, 45 insertions(+), 38 deletions(-)

diff --git a/alib2algo/src/regexp/simplify/RegExpOptimize.h b/alib2algo/src/regexp/simplify/RegExpOptimize.h
index 3f56fc47d6..b1335d17ba 100644
--- a/alib2algo/src/regexp/simplify/RegExpOptimize.h
+++ b/alib2algo/src/regexp/simplify/RegExpOptimize.h
@@ -68,7 +68,9 @@ public:
 	static regexp::RegExp optimize( const regexp::RegExp & regexp );
 
 	static regexp::UnboundedRegExp optimize( const regexp::UnboundedRegExp & regexp );
-	static void optimize( regexp::UnboundedRegExpElement & regexp );
+	static void optimize( regexp::UnboundedRegExpAlternation & regexp );
+	static void optimize( regexp::UnboundedRegExpConcatenation & regexp );
+	static void optimize( regexp::UnboundedRegExpIteration & regexp );
 
 	static regexp::FormalRegExp optimize( const regexp::FormalRegExp & regexp );
 	static void optimize( regexp::FormalRegExpElement & regexp );
diff --git a/alib2algo/src/regexp/simplify/RegExpOptimizeUnboundedPart.cxx b/alib2algo/src/regexp/simplify/RegExpOptimizeUnboundedPart.cxx
index 7d561ed2e7..50ae9dbe0e 100644
--- a/alib2algo/src/regexp/simplify/RegExpOptimizeUnboundedPart.cxx
+++ b/alib2algo/src/regexp/simplify/RegExpOptimizeUnboundedPart.cxx
@@ -9,49 +9,54 @@ namespace regexp {
 
 namespace simplify {
 
-void RegExpOptimize::optimize( UnboundedRegExpElement & element ) {
-	UnboundedRegExpElement* optimized = RegExpOptimize::REG_EXP_OPTIMIZE.optimizeInner( & element );
-
-	UnboundedRegExpAlternation * alternation = dynamic_cast<UnboundedRegExpAlternation *>( & element );
-	if( alternation ) {
-		UnboundedRegExpAlternation * alternationOptimized = dynamic_cast<UnboundedRegExpAlternation *>( optimized );
-		if( alternationOptimized ) {
-			* alternation = std::move( * alternationOptimized );
-			delete alternationOptimized;
-		} else {
-			* alternation = UnboundedRegExpAlternation { };
-			alternation->appendElement( std::manage_move ( optimized ) );
-		}
-		return;
+void RegExpOptimize::optimize( UnboundedRegExpAlternation & alt ) {
+	//while( A1( alt ) || A2( alt ) || A3( alt ) || A4( alt ) || A10( alt ) || V2( alt ) || V5( alt ) || V6( alt ) || X1( alt ) );
+	UnboundedRegExpElement* optimized = RegExpOptimize::REG_EXP_OPTIMIZE.optimizeInner( & alt );
+
+	UnboundedRegExpAlternation * alternationOptimized = dynamic_cast<UnboundedRegExpAlternation *>( optimized );
+	if( alternationOptimized ) {
+		alt = std::move( * alternationOptimized );
+		delete alternationOptimized;
+	} else {
+		alt = UnboundedRegExpAlternation { };
+		alt.appendElement( std::manage_move ( optimized ) );
 	}
+}
 
-	UnboundedRegExpConcatenation * concatenation = dynamic_cast<UnboundedRegExpConcatenation *>( & element );
-	if( concatenation ) {
-		UnboundedRegExpConcatenation * concatenationOptimized = dynamic_cast<UnboundedRegExpConcatenation *>( optimized );
-		if( concatenationOptimized ) {
-			* concatenation = std::move( * concatenationOptimized );
-			delete concatenationOptimized;
-		} else {
-			* concatenation = UnboundedRegExpConcatenation { };
-			concatenation->appendElement( std::manage_move ( optimized ) );
-		}
-		return;
+void RegExpOptimize::optimize( UnboundedRegExpConcatenation & concat ) {
+	//while( A5( concat ) || A6( concat ) || A7( concat ) || A8( concat ) || A9( concat ) || V8( concat ) );//|| V9( concat ) );
+	UnboundedRegExpElement* optimized = RegExpOptimize::REG_EXP_OPTIMIZE.optimizeInner( & concat );
+
+	UnboundedRegExpConcatenation * concatenationOptimized = dynamic_cast<UnboundedRegExpConcatenation *>( optimized );
+	if( concatenationOptimized ) {
+		concat = std::move( * concatenationOptimized );
+		delete concatenationOptimized;
+	} else {
+		concat = UnboundedRegExpConcatenation { };
+		concat.appendElement( std::manage_move ( optimized ) );
 	}
+}
 
-	UnboundedRegExpIteration * iteration = dynamic_cast<UnboundedRegExpIteration *>( & element );
-	if( iteration ) {
-		UnboundedRegExpIteration * iterationOptimized = dynamic_cast<UnboundedRegExpIteration *>( optimized );
-		if( iterationOptimized ) {
-			* iteration = std::move( * iterationOptimized );
-			delete iterationOptimized;
-		} else {
-			* iteration = UnboundedRegExpIteration { std::manage_move ( optimized ) };
+void RegExpOptimize::optimize( UnboundedRegExpIteration & iter ) {
+	/*do {
+		// V1 is implemented right here
+		if( dynamic_cast<UnboundedRegExpEmpty*>( iter.getChild ( ).get() ) ) {
+			return;
 		}
-		return;
+		// T1 is implemented right here \e* = \e
+		if( dynamic_cast<UnboundedRegExpEpsilon*>( iter.getChild ( ).get() ) ) {
+			return;
+		}
+	} while( A11( iter ) || V1( iter ) || V3( iter ) || V4( iter ) || V10( iter ) );*/
+	UnboundedRegExpElement* optimized = RegExpOptimize::REG_EXP_OPTIMIZE.optimizeInner( & iter );
+
+	UnboundedRegExpIteration * iterationOptimized = dynamic_cast<UnboundedRegExpIteration *>( optimized );
+	if( iterationOptimized ) {
+		iter = std::move( * iterationOptimized );
+		delete iterationOptimized;
+	} else {
+		iter = UnboundedRegExpIteration { std::manage_move ( optimized ) };
 	}
-
-	// Nothing to optimize original element was UnboundedRegExpSymbol, UnboundedRegExpEpsilon, or UnboundedRegExpEmpty
-	return;
 }
 
 UnboundedRegExpElement* RegExpOptimize::optimizeInner( UnboundedRegExpElement const * const & node ) const {
-- 
GitLab