diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp index 938321c6830855b834e73fbde6d650ad753d6485..33d7d6bdac8ce48c5f82728fe621466abd7713a1 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 7c3e60d286d5212fe44922b439c9239bccef652b..b7dfd0aa1ab20589fdd98df5218d2838b744a466 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 6507b2f5e91cb8b71a2d340afbd888f67fd28b3a..89a3be0f0458ecdbaf51691ef554e0b22db5810b 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;