From 78533b5752310e064c3d833df951459569c9f12a Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sun, 31 May 2015 15:11:48 +0200
Subject: [PATCH] move semant. in toCNF, toGNF, generateFromGrammar

---
 .../grammar/generate/GenerateUpToLength.cpp   |  8 +++---
 alib2algo/src/grammar/simplify/ToCNF.cpp      | 26 +++++++------------
 alib2algo/src/grammar/simplify/ToGNF.cpp      |  2 +-
 3 files changed, 15 insertions(+), 21 deletions(-)

diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
index 938321c683..33d7d6bdac 100644
--- a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
+++ b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
@@ -40,21 +40,21 @@ std::set<string::LinearString> GenerateUpToLength::generate( const T & grammar,
 		if(rules.find(nonterminal) == rules.end()) continue;
 
 		for(const std::vector<alphabet::Symbol>& rhs : rules.find(nonterminal)->second) {
+			if(item.first.size() + item.second.size() + rhs.size() > length) continue;
+
 			std::vector<alphabet::Symbol> newStack(item.second);
 			std::vector<alphabet::Symbol> newString(item.first);
 			newStack.insert(newStack.end(), rhs.rbegin(), rhs.rend());
 
-			if(newString.size() + newStack.size() > length) continue;
-
 			while(!newStack.empty() && grammar.getTerminalAlphabet().count(newStack.back())) {
-				newString.push_back(newStack.back());
+				newString.push_back(std::move(newStack.back()));
 				newStack.pop_back();
 			}
 
 			if(newStack.empty()) {
 				res.insert(string::LinearString(newString));
 			} else {
-				data.push_back(std::make_pair(newString, newStack));
+				data.push_back(std::make_pair(std::move(newString), std::move(newStack)));
 			}
 		}
 	}
diff --git a/alib2algo/src/grammar/simplify/ToCNF.cpp b/alib2algo/src/grammar/simplify/ToCNF.cpp
index 7c3e60d286..b7dfd0aa1a 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToCNF.cpp
@@ -29,9 +29,9 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
 			createdSymbols.insert(std::make_pair(secondProposal, alphabet::createUniqueSymbol(secondProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
 		}
 		grammar.addNonterminalSymbol(createdSymbols.find(secondProposal)->second);
-		grammar.addRawRule(createdSymbols.find(secondProposal)->second, {second.first, second.second});
+		grammar.addRawRule(createdSymbols.find(secondProposal)->second, {std::move(second.first), std::move(second.second)});
 
-		return std::make_pair(firstLhs, createdSymbols.find(secondProposal)->second);
+		return std::make_pair(std::move(firstLhs), createdSymbols.find(secondProposal)->second);
 	} else {
 		auto first = splitToPairs(grammar, rhs, from, size / 2, createdSymbols);
 		alphabet::Symbol firstProposal{alphabet::SymbolPairSymbol(first)};
@@ -39,7 +39,7 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
 			createdSymbols.insert(std::make_pair(firstProposal, alphabet::createUniqueSymbol(firstProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
 		}
 		grammar.addNonterminalSymbol(createdSymbols.find(firstProposal)->second);
-		grammar.addRawRule(createdSymbols.find(firstProposal)->second, {first.first, first.second});
+		grammar.addRawRule(createdSymbols.find(firstProposal)->second, {std::move(first.first), std::move(first.second)});
 
 		auto second = splitToPairs(grammar, rhs, from + size / 2, size - size / 2, createdSymbols);
 		alphabet::Symbol secondProposal{alphabet::SymbolPairSymbol(second)};
@@ -47,7 +47,7 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
 			createdSymbols.insert(std::make_pair(secondProposal, alphabet::createUniqueSymbol(secondProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
 		}
 		grammar.addNonterminalSymbol(createdSymbols.find(secondProposal)->second);
-		grammar.addRawRule(createdSymbols.find(secondProposal)->second, {second.first, second.second});
+		grammar.addRawRule(createdSymbols.find(secondProposal)->second, {std::move(second.first), std::move(second.second)});
 
 		return std::make_pair(createdSymbols.find(firstProposal)->second, createdSymbols.find(secondProposal)->second);
 	}
@@ -57,11 +57,8 @@ template<class T>
 grammar::CNF convertInternal( const T & origGrammar ) {
 	T grammarTmp(origGrammar.getInitialSymbol());
 
-	for( const auto & symbol : origGrammar.getNonterminalAlphabet() )
-		grammarTmp.addNonterminalSymbol( symbol );
-
-	for( const auto & symbol : origGrammar.getTerminalAlphabet() )
-		grammarTmp.addTerminalSymbol( symbol );
+	grammarTmp.setNonterminalAlphabet(origGrammar.getNonterminalAlphabet() );
+	grammarTmp.setTerminalAlphabet( origGrammar.getTerminalAlphabet() );
 
 	std::map<alphabet::Symbol, alphabet::Symbol> createdSymbols;
 	auto origRules = origGrammar.getRawRules();
@@ -71,7 +68,7 @@ grammar::CNF convertInternal( const T & origGrammar ) {
 				grammarTmp.addRawRule(origRule.first, origRhs);
 			else if(origRhs.size() > 2) {
 				auto second = splitToPairs(grammarTmp, origRhs, 0, origRhs.size(), createdSymbols);
-				grammarTmp.addRawRule(origRule.first, {second.first, second.second});
+				grammarTmp.addRawRule(origRule.first, {std::move(second.first), std::move(second.second)});
 			} else
 				throw exception::AlibException("Invalid rule in grammar");
 		}
@@ -81,18 +78,15 @@ grammar::CNF convertInternal( const T & origGrammar ) {
 
 	grammar::CNF grammar(grammarTmp.getInitialSymbol());
 
-	for( const auto & symbol : grammarTmp.getNonterminalAlphabet() )
-		grammar.addNonterminalSymbol( symbol );
-
-	for( const auto & symbol : grammarTmp.getTerminalAlphabet() )
-		grammar.addTerminalSymbol( symbol );
+	grammar.setNonterminalAlphabet( grammarTmp.getNonterminalAlphabet() );
+	grammar.setTerminalAlphabet( grammarTmp.getTerminalAlphabet() );
 
 	std::map<alphabet::Symbol, alphabet::Symbol> terminalToShadowNonterminal;
 	for( const auto & symbol : grammarTmp.getTerminalAlphabet() ) {
 		alphabet::Symbol shadowSymbol = alphabet::createUniqueSymbol(symbol, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
 		terminalToShadowNonterminal.insert( std::make_pair( symbol, shadowSymbol ));
 		grammar.addNonterminalSymbol( shadowSymbol );
-		grammar.addRule(shadowSymbol, symbol);
+		grammar.addRule(std::move(shadowSymbol), symbol);
 	}
 
 	auto tmpRules = grammarTmp.getRawRules();
diff --git a/alib2algo/src/grammar/simplify/ToGNF.cpp b/alib2algo/src/grammar/simplify/ToGNF.cpp
index 6507b2f5e9..89a3be0f04 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToGNF.cpp
@@ -81,7 +81,7 @@ grammar::GNF convertInternal( const grammar::EpsilonFreeCFG & origGrammar ) {
 				else
 					convertedNonterminals.push_back(terminalToPrimed.find(rhsSymbol)->second);
 			}
-			res.addRule(rule.first, std::make_pair(rhs[0], convertedNonterminals));
+			res.addRule(rule.first, std::make_pair(rhs[0], std::move(convertedNonterminals)));
 		}
 	}
 	return res;
-- 
GitLab