diff --git a/alib2data/src/alphabet/LabeledSymbol.cpp b/alib2data/src/alphabet/LabeledSymbol.cpp index ddc46cc9e93555b2b625832650e9f386fcbc0d08..2c3617488d2fc8a04692c5a618b32ebcd101c166 100644 --- a/alib2data/src/alphabet/LabeledSymbol.cpp +++ b/alib2data/src/alphabet/LabeledSymbol.cpp @@ -17,15 +17,11 @@ LabeledSymbol::LabeledSymbol(char character) : label(label::labelFrom(character) } -LabeledSymbol::LabeledSymbol(const std::string& label) : label(label::labelFrom(label)) { +LabeledSymbol::LabeledSymbol(std::string label) : label(label::labelFrom(std::move(label))) { } -LabeledSymbol::LabeledSymbol(const label::Label& label) : label(label) { - -} - -LabeledSymbol::LabeledSymbol(label::Label&& label) : label(std::move(label)) { +LabeledSymbol::LabeledSymbol(label::Label label) : label(std::move(label)) { } diff --git a/alib2data/src/alphabet/LabeledSymbol.h b/alib2data/src/alphabet/LabeledSymbol.h index a7bd502ed9259c14ab12ff9aa2b731bd6dc7030b..7a60729ea4b0e0b38f9496f9edb6f3ebb9310b2b 100644 --- a/alib2data/src/alphabet/LabeledSymbol.h +++ b/alib2data/src/alphabet/LabeledSymbol.h @@ -20,18 +20,17 @@ namespace alphabet { class LabeledSymbol : public std::acceptor<LabeledSymbol, VisitableSymbolBase, std::acceptor<LabeledSymbol, alib::VisitableObjectBase, SymbolBase> > { protected: label::Label label; - + public: explicit LabeledSymbol(int number); explicit LabeledSymbol(char character); - explicit LabeledSymbol(const std::string& label); + explicit LabeledSymbol(std::string label); /** * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit LabeledSymbol(const label::Label& label); - explicit LabeledSymbol(label::Label&& label); + explicit LabeledSymbol(label::Label label); virtual SymbolBase* clone() const; virtual SymbolBase* plunder() &&; diff --git a/alib2data/src/alphabet/RankedBarSymbol.cpp b/alib2data/src/alphabet/RankedBarSymbol.cpp index b9ad90876bed298506c8273a5b557c3bc6595505..cc8554e7694ea8ba6110a63188d80f375c2e594e 100644 --- a/alib2data/src/alphabet/RankedBarSymbol.cpp +++ b/alib2data/src/alphabet/RankedBarSymbol.cpp @@ -13,7 +13,7 @@ RankedBarSymbol::RankedBarSymbol(int rank) : rank(primitive::Integer(rank)) { } -RankedBarSymbol::RankedBarSymbol(const primitive::Integer& rank) : rank(rank) { +RankedBarSymbol::RankedBarSymbol(primitive::Integer rank) : rank(std::move(rank)) { } diff --git a/alib2data/src/alphabet/RankedBarSymbol.h b/alib2data/src/alphabet/RankedBarSymbol.h index 4c6479bb3db378f64453d5b306570304fa1833cd..82a5360125a73fda66e42929a332090bca9e5b08 100644 --- a/alib2data/src/alphabet/RankedBarSymbol.h +++ b/alib2data/src/alphabet/RankedBarSymbol.h @@ -24,7 +24,7 @@ public: * @param symbol name of the symbol */ explicit RankedBarSymbol(int rank); - explicit RankedBarSymbol(const primitive::Integer& rank); + explicit RankedBarSymbol(primitive::Integer rank); virtual SymbolBase* clone() const; virtual SymbolBase* plunder() &&; diff --git a/alib2data/src/alphabet/RankedSymbol.cpp b/alib2data/src/alphabet/RankedSymbol.cpp index 32eee892522e03fe076dcae7fbe8bae1e2861896..a0a14968e2be4e10ef6dd8bead780876ed1231a0 100644 --- a/alib2data/src/alphabet/RankedSymbol.cpp +++ b/alib2data/src/alphabet/RankedSymbol.cpp @@ -17,15 +17,11 @@ RankedSymbol::RankedSymbol(char character, int rank) : label(label::labelFrom(ch } -RankedSymbol::RankedSymbol(const std::string& label, int rank) : label(label::labelFrom(label)), rank(primitive::Integer(rank)) { +RankedSymbol::RankedSymbol(std::string label, int rank) : label(label::labelFrom(std::move(label))), rank(primitive::Integer(rank)) { } -RankedSymbol::RankedSymbol(const label::Label& label, const primitive::Integer& rank) : label(label), rank(rank) { - -} - -RankedSymbol::RankedSymbol(label::Label&& label, primitive::Integer&& rank) : label(std::move(label)), rank(std::move(rank)) { +RankedSymbol::RankedSymbol(label::Label label, primitive::Integer rank) : label(std::move(label)), rank(std::move(rank)) { } diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h index aab04969a5d30d7d4135761e9f3090f2e7c8a8dd..96ab7921a6a2dd6018e22e4620be4ddeba2c89cd 100644 --- a/alib2data/src/alphabet/RankedSymbol.h +++ b/alib2data/src/alphabet/RankedSymbol.h @@ -26,15 +26,14 @@ protected: public: explicit RankedSymbol(int number, int rank); explicit RankedSymbol(char character, int rank); - explicit RankedSymbol(const std::string& label, int rank); + explicit RankedSymbol(std::string label, int rank); /** * Creates new symbol with given name and rank. * @param symbol name of the symbol * @param rank of the symbol */ - explicit RankedSymbol(const label::Label& label, const primitive::Integer& rank); - explicit RankedSymbol(label::Label&& label, primitive::Integer&& rank); + explicit RankedSymbol(label::Label label, primitive::Integer rank); virtual SymbolBase* clone() const; virtual SymbolBase* plunder() &&; diff --git a/alib2data/src/alphabet/Symbol.cpp b/alib2data/src/alphabet/Symbol.cpp index 9fd53443cc3609d7fcbf9f25418c1541517c9692..53cc40ceffb5e9be90e6af41c2d7f8279498ba2a 100644 --- a/alib2data/src/alphabet/Symbol.cpp +++ b/alib2data/src/alphabet/Symbol.cpp @@ -36,8 +36,8 @@ alphabet::Symbol symbolFrom( char character ) { return alphabet::Symbol { alphabet::LabeledSymbol { label::labelFrom ( character ) } }; } -alphabet::Symbol symbolFrom( const std::string& string ) { - return alphabet::Symbol { alphabet::LabeledSymbol { label::labelFrom ( string ) } }; +alphabet::Symbol symbolFrom( std::string string ) { + return alphabet::Symbol { alphabet::LabeledSymbol { label::labelFrom ( std::move( string ) ) } }; } alphabet::Symbol symbolFrom( const char* string ) { diff --git a/alib2data/src/alphabet/Symbol.h b/alib2data/src/alphabet/Symbol.h index ec8fddcfd9fb448b7a5249275168be01538cd39c..7ed432233d51056790b6d4b34eec2f5ad0bfb9fb 100644 --- a/alib2data/src/alphabet/Symbol.h +++ b/alib2data/src/alphabet/Symbol.h @@ -34,7 +34,7 @@ alphabet::Symbol createUniqueSymbol(const alphabet::Symbol& base, const std::set alphabet::Symbol symbolFrom(int number); alphabet::Symbol symbolFrom(char character); -alphabet::Symbol symbolFrom(const std::string& string); +alphabet::Symbol symbolFrom(std::string string); alphabet::Symbol symbolFrom(const char* string); } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolPairSymbol.cpp b/alib2data/src/alphabet/SymbolPairSymbol.cpp index 2b920d7052d2643b5b49398add290f971b3c7442..247598e259b369ec33a0b541a81a8e7dbee2f0f5 100644 --- a/alib2data/src/alphabet/SymbolPairSymbol.cpp +++ b/alib2data/src/alphabet/SymbolPairSymbol.cpp @@ -11,11 +11,7 @@ namespace alphabet { -SymbolPairSymbol::SymbolPairSymbol(const std::pair<Symbol, Symbol>& symbol) : symbol(std::move(symbol)) { - -} - -SymbolPairSymbol::SymbolPairSymbol(std::pair<Symbol, Symbol>&& symbol) : symbol(std::move(symbol)) { +SymbolPairSymbol::SymbolPairSymbol(std::pair<Symbol, Symbol> symbol) : symbol(std::move(symbol)) { } diff --git a/alib2data/src/alphabet/SymbolPairSymbol.h b/alib2data/src/alphabet/SymbolPairSymbol.h index eea27dc43b44fc564c3ae30e49682e15d1773af2..66d0b15bf1ce8197da6d7db3365664a4bce6f99c 100644 --- a/alib2data/src/alphabet/SymbolPairSymbol.h +++ b/alib2data/src/alphabet/SymbolPairSymbol.h @@ -29,9 +29,7 @@ public: * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit SymbolPairSymbol(const std::pair<Symbol, Symbol>& symbol); - - explicit SymbolPairSymbol(std::pair<Symbol, Symbol>&& symbol); + explicit SymbolPairSymbol(std::pair<Symbol, Symbol> symbol); virtual SymbolBase* clone() const; diff --git a/alib2data/src/alphabet/SymbolSetSymbol.cpp b/alib2data/src/alphabet/SymbolSetSymbol.cpp index 179bb9d6befe3251c8177303107dc37a44c4b584..ebc35d6eb9e8d0de2085cbbb09fb49b02da50ee4 100644 --- a/alib2data/src/alphabet/SymbolSetSymbol.cpp +++ b/alib2data/src/alphabet/SymbolSetSymbol.cpp @@ -11,11 +11,7 @@ namespace alphabet { -SymbolSetSymbol::SymbolSetSymbol(const std::set<Symbol>& symbol) : symbol(symbol) { - -} - -SymbolSetSymbol::SymbolSetSymbol(std::set<Symbol>&& symbol) : symbol(std::move(symbol)) { +SymbolSetSymbol::SymbolSetSymbol(std::set<Symbol> symbol) : symbol(std::move(symbol)) { } diff --git a/alib2data/src/alphabet/SymbolSetSymbol.h b/alib2data/src/alphabet/SymbolSetSymbol.h index 99596f2254874a1166757abef18d934cf121fb6d..bf13997816fb64c88f116e0bd5539c8c330d1c26 100644 --- a/alib2data/src/alphabet/SymbolSetSymbol.h +++ b/alib2data/src/alphabet/SymbolSetSymbol.h @@ -29,9 +29,7 @@ public: * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit SymbolSetSymbol(const std::set<Symbol>& symbol); - - explicit SymbolSetSymbol(std::set<Symbol>&& symbol); + explicit SymbolSetSymbol(std::set<Symbol> symbol); virtual SymbolBase* clone() const; diff --git a/alib2data/src/alphabet/UniqueSymbol.cpp b/alib2data/src/alphabet/UniqueSymbol.cpp index 50a6c04da3278ca9535ef8c73358bf28cbff50a3..c5ef63b65fa04fb696d8a0e8b6a9a5f1b6414091 100644 --- a/alib2data/src/alphabet/UniqueSymbol.cpp +++ b/alib2data/src/alphabet/UniqueSymbol.cpp @@ -11,7 +11,7 @@ namespace alphabet { -UniqueSymbol::UniqueSymbol(const Symbol& symbol, const primitive::Integer& id) : symbol(symbol), id(id) { +UniqueSymbol::UniqueSymbol(Symbol symbol, primitive::Integer id) : symbol(std::move(symbol)), id(std::move(id)) { } diff --git a/alib2data/src/alphabet/UniqueSymbol.h b/alib2data/src/alphabet/UniqueSymbol.h index e8d75a7887e136e6da6b33a4972ff5531c016ac6..6c33af0d474d27c3a514a256c46e4c639fc29291 100644 --- a/alib2data/src/alphabet/UniqueSymbol.h +++ b/alib2data/src/alphabet/UniqueSymbol.h @@ -31,7 +31,7 @@ public: * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit UniqueSymbol(const Symbol& symbol, const primitive::Integer& id); + explicit UniqueSymbol(Symbol symbol, primitive::Integer id); virtual SymbolBase* clone() const; diff --git a/alib2data/src/automaton/FSM/CompactNFA.cpp b/alib2data/src/automaton/FSM/CompactNFA.cpp index 7de169a84e2ae9c7b6ad8fcc522a70e4f2291cd0..377b2322fa3b0283c2c66e2c54befd9926f079fa 100644 --- a/alib2data/src/automaton/FSM/CompactNFA.cpp +++ b/alib2data/src/automaton/FSM/CompactNFA.cpp @@ -20,7 +20,7 @@ namespace automaton { -CompactNFA::CompactNFA(const State& initialState) : SingleInitialState(initialState) { +CompactNFA::CompactNFA(State initialState) : SingleInitialState(std::move(initialState)) { } @@ -105,11 +105,11 @@ bool CompactNFA::removeInputSymbol(const alphabet::Symbol& symbol) { return inputAlphabet.erase(symbol); } -bool CompactNFA::addTransition(const State& from, const string::LinearString& input, const State& to) { +bool CompactNFA::addTransition(State from, string::LinearString input, State to) { if (states.find(from) == states.end()) throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); - std::set<alphabet::Symbol> inputStringAlphabet = input.getAlphabet(); + const std::set<alphabet::Symbol>& inputStringAlphabet = input.getAlphabet(); // Transition regexp's alphabet must be subset of automaton's alphabet if (inputStringAlphabet.size() > 0 && ! std::includes(inputAlphabet.begin(), inputAlphabet.end(), inputStringAlphabet.begin(), inputStringAlphabet.end())) @@ -118,9 +118,9 @@ bool CompactNFA::addTransition(const State& from, const string::LinearString& in if (states.find(to) == states.end()) throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); - std::pair<State, string::LinearString> key = std::make_pair(from, input); + std::pair<State, string::LinearString> key = std::make_pair(std::move(from), std::move(input)); - return transitions[key].insert(to).second; + return transitions[std::move(key)].insert(std::move(to)).second; } bool CompactNFA::removeTransition(const State& from, const string::LinearString& input, const State& to) { diff --git a/alib2data/src/automaton/FSM/CompactNFA.h b/alib2data/src/automaton/FSM/CompactNFA.h index 0650bf0423b4c74ec1896042f41595d97c7ece4c..bd7560526125ef53897c0bec1c43634914f58f90 100644 --- a/alib2data/src/automaton/FSM/CompactNFA.h +++ b/alib2data/src/automaton/FSM/CompactNFA.h @@ -28,14 +28,14 @@ class CompactNFA : public std::acceptor<CompactNFA, VisitableAutomatonBase, std: protected: std::map<std::pair<State, string::LinearString>, std::set<State> > transitions; public: - explicit CompactNFA(const State& initialState); + explicit CompactNFA(State initialState); explicit CompactNFA(const EpsilonNFA& other); explicit CompactNFA(const MultiInitialStateNFA& other); explicit CompactNFA(const NFA& other); explicit CompactNFA(const DFA& other); - + virtual AutomatonBase* clone() const; - + virtual AutomatonBase* plunder() &&; /** @@ -47,7 +47,7 @@ public: * @copydoc Automaton::removeInputSymbol(const Symbol&) */ virtual bool removeInputSymbol(const alphabet::Symbol& symbol); - + /** * Adds transition defined by parameters to the automaton. * @param current current state @@ -55,7 +55,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition(const State& current, const string::LinearString& input, const State& next); + bool addTransition(State current, string::LinearString input, State next); /** * Removes transition from the automaton. @@ -73,7 +73,7 @@ public: * @return automaton transitions from state */ std::map<std::pair<State, string::LinearString>, std::set<State>> getTransitionsFromState(const State& from) const; - + /** * @return automaton transitions to state */ diff --git a/alib2data/src/automaton/FSM/DFA.cpp b/alib2data/src/automaton/FSM/DFA.cpp index cffffdd7b994d1a08d98f9875aa9541a8b46c761..469d7fbd6e4c8976a642bf2693f42d1b43b3865c 100644 --- a/alib2data/src/automaton/FSM/DFA.cpp +++ b/alib2data/src/automaton/FSM/DFA.cpp @@ -14,7 +14,7 @@ namespace automaton { -DFA::DFA(const State& initialState) : SingleInitialState(initialState) { +DFA::DFA(State initialState) : SingleInitialState(std::move(initialState)) { } @@ -53,7 +53,7 @@ bool DFA::removeInputSymbol(const alphabet::Symbol& symbol) { } -bool DFA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) { +bool DFA::addTransition(State from, alphabet::Symbol input, State to) { if (states.find(from) == states.end()) throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); @@ -63,18 +63,18 @@ bool DFA::addTransition(const State& from, const alphabet::Symbol& input, const if (states.find(to) == states.end()) throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); - std::pair<State, alphabet::Symbol> key = std::make_pair(from, input); + std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input)); if (transitions.find(key) != transitions.end()) { if(transitions.find(key)->second == to) return false; else throw AutomatonException( - "Transition from this state and symbol already exists (\"" + (std::string) from.getName() + "\", \"" + (std::string) input + "\") -> \"" + (std::string) to.getName() + "Transition from this state and symbol already exists (\"" + (std::string) key.first.getName() + "\", \"" + (std::string) key.second + "\") -> \"" + (std::string) to.getName() + "\"."); } - transitions.insert(std::make_pair(key, to)); + transitions.insert(std::make_pair(std::move(key), std::move(to))); return true; } diff --git a/alib2data/src/automaton/FSM/DFA.h b/alib2data/src/automaton/FSM/DFA.h index 3264fd3c7bf1460039bd0690bc4dbd16bd8f4412..b50399469b8ddefcc45e687213c6010037a11611 100644 --- a/alib2data/src/automaton/FSM/DFA.h +++ b/alib2data/src/automaton/FSM/DFA.h @@ -24,7 +24,7 @@ class DFA : public std::acceptor<DFA, VisitableAutomatonBase, std::acceptor<DFA, protected: std::map<std::pair<State, alphabet::Symbol>, State> transitions; public: - explicit DFA(const State& initialState); + explicit DFA(State initialState); virtual AutomatonBase* clone() const; @@ -47,7 +47,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition(const State& current, const alphabet::Symbol& input, const State& next); + bool addTransition(State current, alphabet::Symbol input, const State next); /** * Removes transition from the automaton. diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.cpp b/alib2data/src/automaton/FSM/EpsilonNFA.cpp index 284910659e921d813b2084fad4eabbe786f8a607..7f8f4c2153f52468314c8c14ed894e01020b5763 100644 --- a/alib2data/src/automaton/FSM/EpsilonNFA.cpp +++ b/alib2data/src/automaton/FSM/EpsilonNFA.cpp @@ -17,7 +17,7 @@ namespace automaton { -EpsilonNFA::EpsilonNFA(const State& initialState) : SingleInitialState(initialState) { +EpsilonNFA::EpsilonNFA(State initialState) : SingleInitialState(std::move(initialState)) { } @@ -89,7 +89,7 @@ bool EpsilonNFA::removeInputSymbol(const alphabet::Symbol& symbol) { return inputAlphabet.erase(symbol); } -bool EpsilonNFA::addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to) { +bool EpsilonNFA::addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to) { if (states.find(from) == states.end()) throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); @@ -99,32 +99,32 @@ bool EpsilonNFA::addTransition(const State& from, const std::variant<string::Eps if (states.find(to) == states.end()) throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); - std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> > key = std::make_pair(from, input); + std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> > key = std::make_pair(std::move(from), std::move(input)); - return transitions[key].insert(to).second; + return transitions[std::move(key)].insert(std::move(to)).second; } -bool EpsilonNFA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) { - std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addTransition(from, inputVariant, to); +bool EpsilonNFA::addTransition(State from, alphabet::Symbol input, State to) { + std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input)); + return addTransition(std::move(from), std::move(inputVariant), std::move(to)); } -bool EpsilonNFA::addTransition(const State& from, const State& to) { +bool EpsilonNFA::addTransition(State from, State to) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addTransition(from, inputVariant, to); + return addTransition(std::move(from), std::move(inputVariant), std::move(to)); } bool EpsilonNFA::removeTransition(const State& from, const alphabet::Symbol& input, const State& to) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> > key = std::make_pair(from, inputVariant); - + return transitions[key].erase(to); } bool EpsilonNFA::removeTransition(const State& from, const State& to) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> > key = std::make_pair(from, inputVariant); - + return transitions[key].erase(to); } diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.h b/alib2data/src/automaton/FSM/EpsilonNFA.h index 807727492d54eeb6650192a2715768bd572080b1..b81c21ca578551bbb1d9cbc26e5d185ec69d0520 100644 --- a/alib2data/src/automaton/FSM/EpsilonNFA.h +++ b/alib2data/src/automaton/FSM/EpsilonNFA.h @@ -29,13 +29,13 @@ class EpsilonNFA : public std::acceptor<EpsilonNFA, VisitableAutomatonBase, std: protected: std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> >, std::set<State> > transitions; public: - explicit EpsilonNFA(const State& initialState); + explicit EpsilonNFA(State initialState); explicit EpsilonNFA(const MultiInitialStateNFA& other); explicit EpsilonNFA(const NFA& other); explicit EpsilonNFA(const DFA& other); virtual AutomatonBase* clone() const; - + virtual AutomatonBase* plunder() &&; /** @@ -47,7 +47,7 @@ public: * @copydoc Automaton::removeInputSymbol(const Symbol&) */ virtual bool removeInputSymbol(const alphabet::Symbol& symbol); - + /** * Adds transition defined by parameters to the automaton. * @param current current state @@ -55,7 +55,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to); + bool addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to); /** * Adds transition defined by parameters to the automaton. @@ -64,7 +64,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition(const State& from, const alphabet::Symbol& input, const State& to); + bool addTransition(State from, alphabet::Symbol input, State to); /** * Adds transition defined by parameters to the automaton. @@ -72,7 +72,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition(const State& from, const State& to); + bool addTransition(State from, State to); /** * Removes transition from the automaton. @@ -92,7 +92,7 @@ public: * @return automaton transitions */ const std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> >, std::set<State> >& getTransitions() const; - + /** * @return automaton epsilon transitions */ @@ -108,7 +108,7 @@ public: * @return automaton transitions from state */ std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> >, std::set<State> > getTransitionsFromState(const State& from) const; - + /** * @return automaton epsilon transitions from state */ @@ -118,12 +118,12 @@ public: * @return automaton transitions from state reading some symbols */ std::map<std::pair<State, alphabet::Symbol>, std::set<State> > getSymbolTransitionsFromState(const State& from) const; - + /** * @return automaton transitions to state */ std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> >, std::set<State> > getTransitionsToState(const State& from) const; - + /** * @return automaton epsilon transitions to state */ @@ -139,7 +139,7 @@ public: * @return true when automaton doesn't contain epsilon transitions, false otherwise */ bool isEpsilonFree() const; - + /** * Determines whether NFA is deterministic. * FA is deterministic if and only if: diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.cpp b/alib2data/src/automaton/FSM/ExtendedNFA.cpp index 8f64c22153ef1f1cbfea6ed7e3ce881fc62930fa..cd47758857d83ff96e7ee2ff8dd5bacaeff89a44 100644 --- a/alib2data/src/automaton/FSM/ExtendedNFA.cpp +++ b/alib2data/src/automaton/FSM/ExtendedNFA.cpp @@ -22,7 +22,7 @@ namespace automaton { -ExtendedNFA::ExtendedNFA(const State& initialState) : SingleInitialState(initialState) { +ExtendedNFA::ExtendedNFA(State initialState) : SingleInitialState(std::move(initialState)) { } @@ -117,11 +117,11 @@ bool ExtendedNFA::removeInputSymbol(const alphabet::Symbol& symbol) { return inputAlphabet.erase(symbol); } -bool ExtendedNFA::addTransition(const State& from, const regexp::RegExp& input, const State& to) { +bool ExtendedNFA::addTransition(State from, regexp::RegExp input, State to) { if (states.find(from) == states.end()) throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); - std::set<alphabet::Symbol> inputRegExpAlphabet = regexp::RegExpAlphabetGetter::REG_EXP_ALPHABET_GETTER.getAlphabet(input); + const std::set<alphabet::Symbol>& inputRegExpAlphabet = regexp::RegExpAlphabetGetter::REG_EXP_ALPHABET_GETTER.getAlphabet(input); // Transition regexp's alphabet must be subset of automaton's alphabet if (inputRegExpAlphabet.size() > 0 && ! std::includes(inputAlphabet.begin(), inputAlphabet.end(), inputRegExpAlphabet.begin(), inputRegExpAlphabet.end())) @@ -130,14 +130,14 @@ bool ExtendedNFA::addTransition(const State& from, const regexp::RegExp& input, if (states.find(to) == states.end()) throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); - std::pair<State, regexp::RegExp> key = std::make_pair(from, input); - - return transitions[key].insert(to).second; + std::pair<State, regexp::RegExp> key = std::make_pair(std::move(from), std::move(input)); + + return transitions[std::move(key)].insert(std::move(to)).second; } bool ExtendedNFA::removeTransition(const State& from, const regexp::RegExp& input, const State& to) { std::pair<State, regexp::RegExp> key = std::make_pair(from, input); - + return transitions[key].erase(to); } diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.h b/alib2data/src/automaton/FSM/ExtendedNFA.h index 4bd083357319af6e7cf23982c6b3479e491d7f2b..4ef3b58657daf316f384f76390de9da9eac4cdbe 100644 --- a/alib2data/src/automaton/FSM/ExtendedNFA.h +++ b/alib2data/src/automaton/FSM/ExtendedNFA.h @@ -29,7 +29,7 @@ class ExtendedNFA : public std::acceptor<ExtendedNFA, VisitableAutomatonBase, st protected: std::map<std::pair<State, regexp::RegExp>, std::set<State> > transitions; public: - explicit ExtendedNFA(const State& initialState); + explicit ExtendedNFA(State initialState); explicit ExtendedNFA(const CompactNFA& other); explicit ExtendedNFA(const EpsilonNFA& other); explicit ExtendedNFA(const MultiInitialStateNFA& other); @@ -37,7 +37,7 @@ public: explicit ExtendedNFA(const DFA& other); virtual AutomatonBase* clone() const; - + virtual AutomatonBase* plunder() &&; /** @@ -49,7 +49,7 @@ public: * @copydoc Automaton::removeInputSymbol(const Symbol&) */ virtual bool removeInputSymbol(const alphabet::Symbol& symbol); - + /** * Adds transition defined by parameters to the automaton. * @param current current state @@ -57,7 +57,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition(const State& current, const regexp::RegExp& input, const State& next); + bool addTransition(State current, regexp::RegExp input, State next); /** * Removes transition from the automaton. @@ -75,7 +75,7 @@ public: * @return automaton transitions from state */ std::map<std::pair<State, regexp::RegExp>, std::set<State> > getTransitionsFromState(const State& from) const; - + /** * @return automaton transitions to state */ diff --git a/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp b/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp index 8c13cce3ab0a928fa9f0b232249338b9126b3131..cf76337dfccd8fbe5b92133775a7c5f509021365 100644 --- a/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp +++ b/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp @@ -72,7 +72,7 @@ bool MultiInitialStateNFA::removeInputSymbol(const alphabet::Symbol& symbol) { return inputAlphabet.erase(symbol); } -bool MultiInitialStateNFA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) { +bool MultiInitialStateNFA::addTransition(State from, alphabet::Symbol input, State to) { if (states.find(from) == states.end()) throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); @@ -82,14 +82,14 @@ bool MultiInitialStateNFA::addTransition(const State& from, const alphabet::Symb if (states.find(to) == states.end()) throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); - std::pair<State, alphabet::Symbol> key = std::make_pair(from, input); - - return transitions[key].insert(to).second; + std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input)); + + return transitions[std::move(key)].insert(std::move(to)).second; } bool MultiInitialStateNFA::removeTransition(const State& from, const alphabet::Symbol& input, const State& to) { std::pair<State, alphabet::Symbol> key = std::make_pair(from, input); - + return transitions[key].erase(to); } diff --git a/alib2data/src/automaton/FSM/MultiInitialStateNFA.h b/alib2data/src/automaton/FSM/MultiInitialStateNFA.h index 1bb49a341e5b448959a5090985ae470d94c15d2b..225934266449f7c5e7aac86d72b700b1440023bc 100644 --- a/alib2data/src/automaton/FSM/MultiInitialStateNFA.h +++ b/alib2data/src/automaton/FSM/MultiInitialStateNFA.h @@ -32,7 +32,7 @@ public: explicit MultiInitialStateNFA(const DFA& other); virtual AutomatonBase* clone() const; - + virtual AutomatonBase* plunder() &&; /** @@ -44,7 +44,7 @@ public: * @copydoc Automaton::removeInputSymbol(const Symbol&) */ virtual bool removeInputSymbol(const alphabet::Symbol& symbol); - + /** * Adds transition defined by parameters to the automaton. * @param current current state @@ -52,7 +52,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition(const State& current, const alphabet::Symbol& input, const State& next); + bool addTransition(State current, alphabet::Symbol input, State next); /** * Removes transition from the automaton. @@ -70,12 +70,12 @@ public: * @return automaton transitions from state */ std::map<std::pair<State, alphabet::Symbol>, std::set<State> > getTransitionsFromState(const State& from) const; - + /** * @return automaton transitions to state */ std::map<std::pair<State, alphabet::Symbol>, std::set<State> > getTransitionsToState(const State& from) const; - + /** * Determines whether MultiInitialStateNFA is deterministic. * FA is deterministic if and only if: diff --git a/alib2data/src/automaton/FSM/NFA.cpp b/alib2data/src/automaton/FSM/NFA.cpp index 215aa83490ce9da18eb1a8976e3f15f16b5ef542..5fd342ffe30610fa2455df8cb128fa624f282a65 100644 --- a/alib2data/src/automaton/FSM/NFA.cpp +++ b/alib2data/src/automaton/FSM/NFA.cpp @@ -12,7 +12,7 @@ namespace automaton { -NFA::NFA(const State& initialState) : SingleInitialState(initialState) { +NFA::NFA(State initialState) : SingleInitialState(std::move(initialState)) { } @@ -59,7 +59,7 @@ bool NFA::removeInputSymbol(const alphabet::Symbol& symbol) { return inputAlphabet.erase(symbol); } -bool NFA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) { +bool NFA::addTransition(State from, alphabet::Symbol input, State to) { if (states.find(from) == states.end()) throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); @@ -69,14 +69,14 @@ bool NFA::addTransition(const State& from, const alphabet::Symbol& input, const if (states.find(to) == states.end()) throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); - std::pair<State, alphabet::Symbol> key = std::make_pair(from, input); - - return transitions[key].insert(to).second; + std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input)); + + return transitions[std::move(key)].insert(std::move(to)).second; } bool NFA::removeTransition(const State& from, const alphabet::Symbol& input, const State& to) { std::pair<State, alphabet::Symbol> key = std::make_pair(from, input); - + return transitions[key].erase(to); } diff --git a/alib2data/src/automaton/FSM/NFA.h b/alib2data/src/automaton/FSM/NFA.h index 50c88650e18b891f35edfdff8df2732e44181cd6..29f83698ebd43791253a7c584b07f826170a2162 100644 --- a/alib2data/src/automaton/FSM/NFA.h +++ b/alib2data/src/automaton/FSM/NFA.h @@ -27,11 +27,11 @@ class NFA : public std::acceptor<NFA, VisitableAutomatonBase, std::acceptor<NFA, protected: std::map<std::pair<State, alphabet::Symbol>, std::set<State> > transitions; public: - explicit NFA(const State& initialState); + explicit NFA(State initialState); explicit NFA(const DFA& other); virtual AutomatonBase* clone() const; - + virtual AutomatonBase* plunder() &&; /** @@ -43,7 +43,7 @@ public: * @copydoc Automaton::removeInputSymbol(const Symbol&) */ virtual bool removeInputSymbol(const alphabet::Symbol& symbol); - + /** * Adds transition defined by parameters to the automaton. * @param current current state @@ -51,7 +51,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition(const State& current, const alphabet::Symbol& input, const State& next); + bool addTransition(State current, alphabet::Symbol input, State next); /** * Removes transition from the automaton. @@ -69,12 +69,12 @@ public: * @return automaton transitions from state */ std::map<std::pair<State, alphabet::Symbol>, std::set<State> > getTransitionsFromState(const State& from) const; - + /** * @return automaton transitions to state */ std::map<std::pair<State, alphabet::Symbol>, std::set<State> > getTransitionsToState(const State& from) const; - + /** * Determines whether NFA is deterministic. * FA is deterministic if and only if: diff --git a/alib2data/src/automaton/PDA/DPDA.cpp b/alib2data/src/automaton/PDA/DPDA.cpp index e6d3ad8543e256099ab6c986ed9cb83e05a2acbb..c68924fe3fc8d04975d939704b184b5ef0bd2910 100644 --- a/alib2data/src/automaton/PDA/DPDA.cpp +++ b/alib2data/src/automaton/PDA/DPDA.cpp @@ -13,7 +13,7 @@ namespace automaton { -DPDA::DPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) { +DPDA::DPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) { } @@ -70,7 +70,7 @@ bool DPDA::removeStackSymbol(const alphabet::Symbol& symbol) { return stackAlphabet.erase(symbol); } -bool DPDA::addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) { +bool DPDA::addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -95,25 +95,25 @@ bool DPDA::addTransition(const State& from, const std::variant<string::Epsilon, } } - std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> > key(from, input, pop); - std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push); + std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> > key(std::move(from), std::move(input), std::move(pop)); + std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(std::move(to), std::move(push)); if (transitions.find(key) != transitions.end()) { if(transitions.find(key)->second == value) return false; - else if (input.is<alphabet::Symbol>()) + else if (std::get<1>(key).is<alphabet::Symbol>()) throw AutomatonException( - "Transition (\"" + (std::string) from.getName() + "\", \"" + (std::string) input.get<alphabet::Symbol>() + "\", \"pop\") -> ?? already exists."); + "Transition (\"" + (std::string) std::get<0>(key).getName() + "\", \"" + (std::string) std::get<1>(key).get<alphabet::Symbol>() + "\", \"pop\") -> ?? already exists."); else throw AutomatonException( - "Transition (\"" + (std::string) from.getName() + "\", \"" + (std::string) input.get<string::Epsilon>() + "\", \"pop\") -> ?? already exists."); + "Transition (\"" + (std::string) std::get<0>(key).getName() + "\", \"" + (std::string) std::get<1>(key).get<string::Epsilon>() + "\", \"pop\") -> ?? already exists."); } - if(input.is<string::Epsilon>()) { + if(std::get<1>(key).is<string::Epsilon>()) { if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::pair<automaton::State, std::vector<alphabet::Symbol> > > & transition) { - if(std::get<0>(transition.first) == from) { + if(std::get<0>(transition.first) == std::get<0>(key)) { const std::vector<alphabet::Symbol>& alpha = std::get<2>(transition.first); - const std::vector<alphabet::Symbol>& beta = pop; + const std::vector<alphabet::Symbol>& beta = std::get<2>(key); const std::vector<alphabet::Symbol>& shorter = (alpha.size() < beta.size()) ? alpha : beta; const std::vector<alphabet::Symbol>& longer = (alpha.size() < beta.size()) ? beta : alpha; @@ -128,9 +128,9 @@ bool DPDA::addTransition(const State& from, const std::variant<string::Epsilon, throw exception::AlibException("Conflicting transition"); } else { if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::pair<automaton::State, std::vector<alphabet::Symbol> > > & transition) { - if(std::get<0>(transition.first) == from && ( std::get<1>(transition.first) == input || std::get<1>(transition.first).is<string::Epsilon>() )) { + if(std::get<0>(transition.first) == std::get<0>(key) && ( std::get<1>(transition.first) == std::get<1>(key) || std::get<1>(transition.first).is<string::Epsilon>() )) { const std::vector<alphabet::Symbol>& alpha = std::get<2>(transition.first); - const std::vector<alphabet::Symbol>& beta = pop; + const std::vector<alphabet::Symbol>& beta = std::get<2>(key); const std::vector<alphabet::Symbol>& shorter = (alpha.size() < beta.size()) ? alpha : beta; const std::vector<alphabet::Symbol>& longer = (alpha.size() < beta.size()) ? beta : alpha; @@ -145,18 +145,18 @@ bool DPDA::addTransition(const State& from, const std::variant<string::Epsilon, throw exception::AlibException("Conflicting transition"); } - transitions.insert(std::make_pair(key, value) ); + transitions.insert(std::make_pair(std::move(key), std::move(value)) ); return true; } -bool DPDA::addTransition(const State& from, const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) { - std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addTransition(from, inputVariant, pop, to, push); +bool DPDA::addTransition(State from, alphabet::Symbol input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) { + std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input)); + return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } -bool DPDA::addTransition(const State& from, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) { +bool DPDA::addTransition(State from, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addTransition(from, inputVariant, pop, to, push); + return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } bool DPDA::removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) { diff --git a/alib2data/src/automaton/PDA/DPDA.h b/alib2data/src/automaton/PDA/DPDA.h index 534252094a5cfa538e321ac41bca862c1a581243..9c51d6e5dd75bdd27d182d1ec1e408e0c46d5f5f 100644 --- a/alib2data/src/automaton/PDA/DPDA.h +++ b/alib2data/src/automaton/PDA/DPDA.h @@ -32,10 +32,10 @@ class DPDA : public std::acceptor<DPDA, VisitableAutomatonBase, std::acceptor<DP protected: std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::pair<State, std::vector<alphabet::Symbol> > > transitions; public: - explicit DPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol); + explicit DPDA(State initialState, alphabet::Symbol initialPushdownSymbol); virtual AutomatonBase* clone() const; - + virtual AutomatonBase* plunder() &&; /** @@ -59,11 +59,11 @@ public: * @throws AutomatonException when some part of the transition is not present * in the DPDA (state, input symbol, stack symbol) or when transition already exists */ - bool addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push); + bool addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push); - bool addTransition(const State& from, const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push); + bool addTransition(State from, alphabet::Symbol input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push); - bool addTransition(const State& from, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push); + bool addTransition(State from, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push); /** * Removes the transition from the DPDA. diff --git a/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp b/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp index 989adab4394dc9867cc7014ac0ff153d542069f8..5590aca49e354ce4e5c8789f6e6ac58bc0c23cf5 100644 --- a/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp +++ b/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp @@ -13,7 +13,7 @@ namespace automaton { -InputDrivenDPDA::InputDrivenDPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) { +InputDrivenDPDA::InputDrivenDPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) { } @@ -66,7 +66,7 @@ bool InputDrivenDPDA::removeStackSymbol(const alphabet::Symbol& symbol) { return stackAlphabet.erase(symbol); } -bool InputDrivenDPDA::setPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push) { +void InputDrivenDPDA::checkPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push) { if (inputAlphabet.find(input) == inputAlphabet.end()) { throw AutomatonException("Input symbol \"" + (std::string) input + "\" doesn't exist."); } @@ -82,11 +82,14 @@ bool InputDrivenDPDA::setPushdownStoreOperation(const alphabet::Symbol& input, c throw AutomatonException("Stack symbol \"" + (std::string) pushSymbol + "\" doesn't exist."); } } +} - return inputSymbolToPushdownStoreOperation.insert(std::make_pair(input, std::make_pair(pop, push))).second; +bool InputDrivenDPDA::setPushdownStoreOperation(alphabet::Symbol input, std::vector<alphabet::Symbol> pop, std::vector<alphabet::Symbol> push) { + checkPushdownStoreOperation(input, pop, push); + return inputSymbolToPushdownStoreOperation.insert(std::make_pair(std::move(input), std::make_pair(std::move(pop), std::move(push)))).second; } -void InputDrivenDPDA::setPushdownStoreOperations(const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>>& operations) { +void InputDrivenDPDA::setPushdownStoreOperations(std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> operations) { std::set<alphabet::Symbol> removed; std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), key_begin(operations), key_end(operations), std::inserter(removed, removed.end())); @@ -95,8 +98,10 @@ void InputDrivenDPDA::setPushdownStoreOperations(const std::map<alphabet::Symbol } for(const auto& added : operations) { - setPushdownStoreOperation(added.first, added.second.first, added.second.second); + checkPushdownStoreOperation(added.first, added.second.first, added.second.second); } + + inputSymbolToPushdownStoreOperation = std::move(operations); } bool InputDrivenDPDA::clearPushdownStoreOperation(const alphabet::Symbol& input) { @@ -112,7 +117,7 @@ const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::v return inputSymbolToPushdownStoreOperation; } -bool InputDrivenDPDA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) { +bool InputDrivenDPDA::addTransition(State from, alphabet::Symbol input, State to) { if (states.find(from) == states.end()) throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); @@ -125,18 +130,18 @@ bool InputDrivenDPDA::addTransition(const State& from, const alphabet::Symbol& i if (states.find(to) == states.end()) throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); - std::pair<State, alphabet::Symbol> key = std::make_pair(from, input); + std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input)); if (transitions.find(key) != transitions.end()) { if(transitions.find(key)->second == to) return false; else throw AutomatonException( - "Transition from this state and symbol already exists (\"" + (std::string) from.getName() + "\", \"" + (std::string) input + "\") -> \"" + (std::string) to.getName() + "Transition from this state and symbol already exists (\"" + (std::string) key.first.getName() + "\", \"" + (std::string) key.second + "\") -> \"" + (std::string) to.getName() + "\"."); } - transitions.insert(std::make_pair(key, to)); + transitions.insert(std::make_pair(std::move(key), std::move(to))); return true; } diff --git a/alib2data/src/automaton/PDA/InputDrivenDPDA.h b/alib2data/src/automaton/PDA/InputDrivenDPDA.h index 085931f95e353c587a7116b829663770b4ef7880..97b6d2fceb7d3b4904ae899b2ef0bfc36904dd8e 100644 --- a/alib2data/src/automaton/PDA/InputDrivenDPDA.h +++ b/alib2data/src/automaton/PDA/InputDrivenDPDA.h @@ -25,8 +25,10 @@ class InputDrivenDPDA : public std::acceptor<InputDrivenDPDA, VisitableAutomaton protected: std::map<std::pair<State, alphabet::Symbol>, State> transitions; std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> inputSymbolToPushdownStoreOperation; + + void checkPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push); public: - explicit InputDrivenDPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol); + explicit InputDrivenDPDA(State initialState, alphabet::Symbol initialPushdownSymbol); virtual AutomatonBase* clone() const; @@ -47,9 +49,9 @@ public: */ virtual bool removeStackSymbol(const alphabet::Symbol& symbol); - bool setPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push); + bool setPushdownStoreOperation(alphabet::Symbol input, std::vector<alphabet::Symbol> pop, std::vector<alphabet::Symbol> push); - void setPushdownStoreOperations(const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>>& operations); + void setPushdownStoreOperations(std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> operations); bool clearPushdownStoreOperation(const alphabet::Symbol& input); @@ -62,7 +64,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition(const State& current, const alphabet::Symbol& input, const State& next); + bool addTransition(State current, alphabet::Symbol input, State next); /** * Removes transition from the automaton. diff --git a/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp b/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp index d0fbcfac96b5e9094ab20037fbaa78150c40fc79..5d8754aadb617c3355375e22e2dd432b5c73026b 100644 --- a/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp +++ b/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp @@ -13,7 +13,7 @@ namespace automaton { -InputDrivenNPDA::InputDrivenNPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) { +InputDrivenNPDA::InputDrivenNPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) { } @@ -66,7 +66,7 @@ bool InputDrivenNPDA::removeStackSymbol(const alphabet::Symbol& symbol) { return stackAlphabet.erase(symbol); } -bool InputDrivenNPDA::setPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push) { +void InputDrivenNPDA::checkPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push) { if (inputAlphabet.find(input) == inputAlphabet.end()) { throw AutomatonException("Input symbol \"" + (std::string) input + "\" doesn't exist."); } @@ -82,11 +82,14 @@ bool InputDrivenNPDA::setPushdownStoreOperation(const alphabet::Symbol& input, c throw AutomatonException("Stack symbol \"" + (std::string) pushSymbol + "\" doesn't exist."); } } +} +bool InputDrivenNPDA::setPushdownStoreOperation(alphabet::Symbol input, std::vector<alphabet::Symbol> pop, std::vector<alphabet::Symbol> push) { + checkPushdownStoreOperation(input, pop, push); return inputSymbolToPushdownStoreOperation.insert(std::make_pair(input, std::make_pair(pop, push))).second; } -void InputDrivenNPDA::setPushdownStoreOperations(const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>>& operations) { +void InputDrivenNPDA::setPushdownStoreOperations(std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> operations) { std::set<alphabet::Symbol> removed; std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), key_begin(operations), key_end(operations), std::inserter(removed, removed.end())); @@ -95,8 +98,10 @@ void InputDrivenNPDA::setPushdownStoreOperations(const std::map<alphabet::Symbol } for(const auto& added : operations) { - setPushdownStoreOperation(added.first, added.second.first, added.second.second); + checkPushdownStoreOperation(added.first, added.second.first, added.second.second); } + + inputSymbolToPushdownStoreOperation = std::move(operations); } bool InputDrivenNPDA::clearPushdownStoreOperation(const alphabet::Symbol& input) { @@ -112,7 +117,7 @@ const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::v return inputSymbolToPushdownStoreOperation; } -bool InputDrivenNPDA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) { +bool InputDrivenNPDA::addTransition(State from, alphabet::Symbol input, State to) { if (states.find(from) == states.end()) throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); @@ -125,9 +130,9 @@ bool InputDrivenNPDA::addTransition(const State& from, const alphabet::Symbol& i if (states.find(to) == states.end()) throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); - std::pair<State, alphabet::Symbol> key = std::make_pair(from, input); + std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input)); - return transitions[key].insert(to).second; + return transitions[std::move(key)].insert(std::move(to)).second; } bool InputDrivenNPDA::removeTransition(const State& from, const alphabet::Symbol& input, const State& to) { diff --git a/alib2data/src/automaton/PDA/InputDrivenNPDA.h b/alib2data/src/automaton/PDA/InputDrivenNPDA.h index 2ba69787a79c478afe16dc1053b9b3975eefff9c..1835d1cb1a1f7f54fcc246bd9e607e187501794a 100644 --- a/alib2data/src/automaton/PDA/InputDrivenNPDA.h +++ b/alib2data/src/automaton/PDA/InputDrivenNPDA.h @@ -25,8 +25,10 @@ class InputDrivenNPDA : public std::acceptor<InputDrivenNPDA, VisitableAutomaton protected: std::map<std::pair<State, alphabet::Symbol>, std::set<State> > transitions; std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> inputSymbolToPushdownStoreOperation; + + void checkPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push); public: - explicit InputDrivenNPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol); + explicit InputDrivenNPDA(State initialState, alphabet::Symbol initialPushdownSymbol); virtual AutomatonBase* clone() const; @@ -47,9 +49,9 @@ public: */ virtual bool removeStackSymbol(const alphabet::Symbol& symbol); - bool setPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push); + bool setPushdownStoreOperation(alphabet::Symbol input, std::vector<alphabet::Symbol> pop, std::vector<alphabet::Symbol> push); - void setPushdownStoreOperations(const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>>& operations); + void setPushdownStoreOperations(std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> operations); bool clearPushdownStoreOperation(const alphabet::Symbol& input); @@ -62,7 +64,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition(const State& current, const alphabet::Symbol& input, const State& next); + bool addTransition(State current, alphabet::Symbol input, State next); /** * Removes transition from the automaton. diff --git a/alib2data/src/automaton/PDA/NPDA.cpp b/alib2data/src/automaton/PDA/NPDA.cpp index 52a6a26c83847b2819f19ba74e4f5745bce5f8a3..6c63d114334b22a1d8d3b4226bea365e3eb0e216 100644 --- a/alib2data/src/automaton/PDA/NPDA.cpp +++ b/alib2data/src/automaton/PDA/NPDA.cpp @@ -13,7 +13,7 @@ namespace automaton { -NPDA::NPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) { +NPDA::NPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) { } @@ -34,11 +34,11 @@ bool NPDA::removeState(const State& state) { throw AutomatonException("State \"" + (std::string) state.getName() + "\" is final state."); } - for (std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >::const_iterator transition = transitions.begin(); transition != transitions.end(); transition++) { - if (state == std::get<0>(transition->first)) + for (const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >& transition : transitions) { + if (state == std::get<0>(transition.first)) throw AutomatonException("State \"" + (std::string) state.getName() + "\" is used in transition."); - for(std::set<std::pair<State, std::vector<alphabet::Symbol> > >::iterator target = transition->second.begin(); target != transition->second.end(); target++) { - if(target->first == state) + for(const std::pair<State, std::vector<alphabet::Symbol> >& target : transition.second) { + if(target.first == state) throw AutomatonException("State \"" + (std::string) state.getName() + "\" is used in transition."); } } @@ -47,8 +47,8 @@ bool NPDA::removeState(const State& state) { } bool NPDA::removeInputSymbol(const alphabet::Symbol& symbol) { - for (std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >::const_iterator transition = transitions.begin(); transition != transitions.end(); transition++) { - if (std::get<1>(transition->first).is<alphabet::Symbol>() && symbol == std::get<1>(transition->first).get<alphabet::Symbol>()) + for (const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >& transition : transitions) { + if (std::get<1>(transition.first).is<alphabet::Symbol>() && symbol == std::get<1>(transition.first).get<alphabet::Symbol>()) throw AutomatonException("Symbol \"" + (std::string) symbol + "\" is used in transition."); } @@ -60,14 +60,13 @@ bool NPDA::removeStackSymbol(const alphabet::Symbol& symbol) { throw AutomatonException("Stack symbol \"" + (std::string) symbol + "\" is start symbol."); } - for (std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >::const_iterator transition = transitions.begin(); transition != transitions.end(); transition++) { - for (std::vector<alphabet::Symbol>::const_iterator popSymbol = std::get<2>(transition->first).begin(); popSymbol != std::get<2>(transition->first).end(); - popSymbol++) { - if (symbol == *popSymbol) + for (const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >& transition : transitions) { + for (const alphabet::Symbol& popSymbol : std::get<2>(transition.first)) { + if (symbol == popSymbol) throw AutomatonException("Stack symbol \"" + (std::string) symbol + "\" is used in transition."); } - for (std::set<std::pair<State, std::vector<alphabet::Symbol> > >::const_iterator target = transition->second.begin(); target != transition->second.end(); target++) { - if (std::find(target->second.begin(), target->second.end(), symbol) != target->second.end()) + for (const std::pair<State, std::vector<alphabet::Symbol> >& target : transition.second) { + if (std::find(target.second.begin(), target.second.end(), symbol) != target.second.end()) throw AutomatonException("Stack symbol \"" + (std::string) symbol + "\" is used in transition."); } } @@ -75,7 +74,7 @@ bool NPDA::removeStackSymbol(const alphabet::Symbol& symbol) { return stackAlphabet.erase(symbol); } -bool NPDA::addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) { +bool NPDA::addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -88,38 +87,38 @@ bool NPDA::addTransition(const State& from, const std::variant<string::Epsilon, throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); } - for(std::vector<alphabet::Symbol>::const_iterator popSymbol = pop.begin(); popSymbol != pop.end(); popSymbol++) { - if (stackAlphabet.find(*popSymbol) == stackAlphabet.end()) { - throw AutomatonException("Stack symbol \"" + (std::string) *popSymbol + "\" doesn't exist."); + for(const alphabet::Symbol& popSymbol : pop) { + if (stackAlphabet.find(popSymbol) == stackAlphabet.end()) { + throw AutomatonException("Stack symbol \"" + (std::string) popSymbol + "\" doesn't exist."); } } - for(std::vector<alphabet::Symbol>::const_iterator pushSymbol = push.begin(); pushSymbol != push.end(); pushSymbol++) { - if (stackAlphabet.find(*pushSymbol) == stackAlphabet.end()) { - throw AutomatonException("Stack symbol \"" + (std::string) *pushSymbol + "\" doesn't exist."); + for(const alphabet::Symbol& pushSymbol : push) { + if (stackAlphabet.find(pushSymbol) == stackAlphabet.end()) { + throw AutomatonException("Stack symbol \"" + (std::string) pushSymbol + "\" doesn't exist."); } } - std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> > key(from, input, pop); - std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push); - - return transitions[key].insert(value).second; + std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> > key(std::move(from), std::move(input), std::move(pop)); + std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(std::move(to), std::move(push)); + + return transitions[std::move(key)].insert(std::move(value)).second; } -bool NPDA::addTransition(const State& from, const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) { - std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addTransition(from, inputVariant, pop, to, push); +bool NPDA::addTransition(State from, alphabet::Symbol input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) { + std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input)); + return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } -bool NPDA::addTransition(const State& from, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) { +bool NPDA::addTransition(State from, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addTransition(from, inputVariant, pop, to, push); + return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } bool NPDA::removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) { std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> > key(from, input, pop); std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push); - + return transitions[key].erase(value); } diff --git a/alib2data/src/automaton/PDA/NPDA.h b/alib2data/src/automaton/PDA/NPDA.h index da6e75e17f06aa2b66dc8721099483be2044f3ea..97108702192b33a8090feb043ef462c0482fbe8b 100644 --- a/alib2data/src/automaton/PDA/NPDA.h +++ b/alib2data/src/automaton/PDA/NPDA.h @@ -28,7 +28,7 @@ class NPDA : public std::acceptor<NPDA, VisitableAutomatonBase, std::acceptor<NP protected: std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > > transitions; public: - explicit NPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol); + explicit NPDA(State initialState, alphabet::Symbol initialPushdownSymbol); virtual AutomatonBase* clone() const; @@ -55,11 +55,11 @@ public: * @throws AutomatonException when some part of the transition is not present * in the NPDA (state, input symbol, stack symbol) or when transition already exists */ - bool addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push); + bool addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push); - bool addTransition(const State& from, const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push); + bool addTransition(State from, alphabet::Symbol input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push); - bool addTransition(const State& from, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push); + bool addTransition(State from, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push); /** * Removes the transition from the NPDA. diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp index 969ba37a261acc0c4333bcfc6fc3366603d4843a..62131674432bc5fc2b4e4e1924c1683120b918f0 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp @@ -13,7 +13,7 @@ namespace automaton { -RealTimeHeightDeterministicDPDA::RealTimeHeightDeterministicDPDA(const State& initialState, const alphabet::Symbol& bottomOfTheStackSymbol) : SingleInitialState(initialState), BottomOfTheStackSymbolPushdownStoreAlphabet(bottomOfTheStackSymbol) { +RealTimeHeightDeterministicDPDA::RealTimeHeightDeterministicDPDA(State initialState, alphabet::Symbol bottomOfTheStackSymbol) : SingleInitialState(std::move(initialState)), BottomOfTheStackSymbolPushdownStoreAlphabet(std::move(bottomOfTheStackSymbol)) { } @@ -95,7 +95,7 @@ bool RealTimeHeightDeterministicDPDA::removeStackSymbol(const alphabet::Symbol& return stackAlphabet.erase(symbol); } -bool RealTimeHeightDeterministicDPDA::addCallTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to, const alphabet::Symbol& push) { +bool RealTimeHeightDeterministicDPDA::addCallTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to, alphabet::Symbol push) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -112,53 +112,53 @@ bool RealTimeHeightDeterministicDPDA::addCallTransition(const State& from, const throw AutomatonException("Stack symbol \"" + (std::string) push + "\" doesn't exist."); } - std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(from, input); - std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push); + std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(std::move(from), std::move(input)); + std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(std::move(to), std::move(push)); if(callTransitions.find(key) != callTransitions.end() && callTransitions.find(key)->second == value) return false; - if(input.is<string::Epsilon>()) { + if(key.second.is<string::Epsilon>()) { for(const auto& transition : callTransitions) - if(transition.first.first == from ) - throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present."); + if(transition.first.first == key.first ) + throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) key.first + "\" when other transitions are present."); for(const auto& transition : returnTransitions) - if(std::get<0>(transition.first) == from) - throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present."); + if(std::get<0>(transition.first) == key.first) + throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) key.first + "\" when other transitions are present."); for(const auto& transition : localTransitions) - if(transition.first.first == from) + if(transition.first.first == key.first) throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present."); } else { for(const auto& transition : callTransitions) - if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input)) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == key.first && (transition.first.second.is<string::Epsilon>() || transition.first.second == key.second)) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); for(const auto& transition : returnTransitions) - if(std::get<0>(transition.first) == from && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == input)) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(std::get<0>(transition.first) == key.first && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == key.second)) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); for(const auto& transition : localTransitions) - if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input)) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == key.first && (transition.first.second.is<string::Epsilon>() || transition.first.second == key.second)) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); } - callTransitions.insert(std::make_pair(key, value)); + callTransitions.insert(std::make_pair(std::move(key), std::move(value))); return true; } -bool RealTimeHeightDeterministicDPDA::addCallTransition(const State& from, const State& to, const alphabet::Symbol& push) { +bool RealTimeHeightDeterministicDPDA::addCallTransition(State from, State to, alphabet::Symbol push) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addCallTransition(from, inputVariant, to, push); + return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push)); } -bool RealTimeHeightDeterministicDPDA::addCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) { - std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addCallTransition(from, inputVariant, to, push); +bool RealTimeHeightDeterministicDPDA::addCallTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol push) { + std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input)); + return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push)); } -bool RealTimeHeightDeterministicDPDA::addReturnTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to) { +bool RealTimeHeightDeterministicDPDA::addReturnTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -175,52 +175,52 @@ bool RealTimeHeightDeterministicDPDA::addReturnTransition(const State& from, con throw AutomatonException("Stack symbol \"" + (std::string) pop + "\" doesn't exist."); } - std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, input, pop); + std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop)); if(returnTransitions.find(key) != returnTransitions.end() && returnTransitions.find(key)->second == to) return false; - if(input.is<string::Epsilon>()) { + if(std::get<1>(key).is<string::Epsilon>()) { for(const auto& transition : callTransitions) - if(transition.first.first == from ) - throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present."); + if(transition.first.first == std::get<0>(key) ) + throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) std::get<0>(key) + "\" when other transitions are present."); for(const auto& transition : returnTransitions) - if(std::get<0>(transition.first) == from && std::get<2>(transition.first) == pop) - throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present."); + if(std::get<0>(transition.first) == std::get<0>(key) && std::get<2>(transition.first) == std::get<2>(key)) + throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) std::get<0>(key) + "\" when other transitions are present."); for(const auto& transition : localTransitions) - if(transition.first.first == from) - throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present."); + if(transition.first.first == std::get<0>(key)) + throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) std::get<0>(key) + "\" when other transitions are present."); } else { for(const auto& transition : callTransitions) - if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input)) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == std::get<0>(key) && (transition.first.second.is<string::Epsilon>() || transition.first.second == std::get<1>(key))) + throw AutomatonException("Can't add transition from state \"" + (std::string) std::get<0>(key) + "\" when transition reading \"" + (std::string) std::get<1>(key) + "\" is present."); for(const auto& transition : returnTransitions) - if(std::get<0>(transition.first) == from && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == input) && std::get<2>(transition.first) == pop) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(std::get<0>(transition.first) == std::get<0>(key) && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == std::get<1>(key)) && std::get<2>(transition.first) == std::get<2>(key)) + throw AutomatonException("Can't add transition from state \"" + (std::string) std::get<0>(key) + "\" when transition reading \"" + (std::string) std::get<1>(key) + "\" is present."); for(const auto& transition : localTransitions) - if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input)) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == std::get<0>(key) && (transition.first.second.is<string::Epsilon>() || transition.first.second == std::get<1>(key))) + throw AutomatonException("Can't add transition from state \"" + (std::string) std::get<0>(key) + "\" when transition reading \"" + (std::string) std::get<1>(key) + "\" is present."); } - returnTransitions.insert(std::make_pair(key, to)); + returnTransitions.insert(std::make_pair(std::move(key), std::move(to))); return true; } -bool RealTimeHeightDeterministicDPDA::addReturnTransition(const State& from, const alphabet::Symbol& pop, const State& to) { +bool RealTimeHeightDeterministicDPDA::addReturnTransition(State from, alphabet::Symbol pop, State to) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addReturnTransition(from, inputVariant, pop, to); + return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to)); } -bool RealTimeHeightDeterministicDPDA::addReturnTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to) { - std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addReturnTransition(from, inputVariant, pop, to); +bool RealTimeHeightDeterministicDPDA::addReturnTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to) { + std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input)); + return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to)); } -bool RealTimeHeightDeterministicDPDA::addLocalTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to) { +bool RealTimeHeightDeterministicDPDA::addLocalTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -233,49 +233,49 @@ bool RealTimeHeightDeterministicDPDA::addLocalTransition(const State& from, cons throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); } - std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(from, input); - + std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(std::move(from), std::move(input)); + if(localTransitions.find(key) != localTransitions.end() && localTransitions.find(key)->second == to) return false; - if(input.is<string::Epsilon>()) { + if(key.second.is<string::Epsilon>()) { for(const auto& transition : callTransitions) - if(transition.first.first == from ) - throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present."); + if(transition.first.first == key.first ) + throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) key.first + "\" when other transitions are present."); for(const auto& transition : returnTransitions) - if(std::get<0>(transition.first) == from) - throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present."); + if(std::get<0>(transition.first) == key.first) + throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) key.first + "\" when other transitions are present."); for(const auto& transition : localTransitions) - if(transition.first.first == from) - throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present."); + if(transition.first.first == key.first) + throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) key.first + "\" when other transitions are present."); } else { for(const auto& transition : callTransitions) - if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input)) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == key.first && (transition.first.second.is<string::Epsilon>() || transition.first.second == key.second)) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); for(const auto& transition : returnTransitions) - if(std::get<0>(transition.first) == from && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == input)) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(std::get<0>(transition.first) == key.first && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == key.second)) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); for(const auto& transition : localTransitions) - if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input)) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == key.first && (transition.first.second.is<string::Epsilon>() || transition.first.second == key.second)) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); } - localTransitions.insert(std::make_pair(key, to)); + localTransitions.insert(std::make_pair(std::move(key), std::move(to))); return true; } -bool RealTimeHeightDeterministicDPDA::addLocalTransition(const State& from, const State& to) { +bool RealTimeHeightDeterministicDPDA::addLocalTransition(State from, State to) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addLocalTransition(from, inputVariant, to); + return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to)); } -bool RealTimeHeightDeterministicDPDA::addLocalTransition(const State& from, const alphabet::Symbol& input, const State& to) { - std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addLocalTransition(from, inputVariant, to); +bool RealTimeHeightDeterministicDPDA::addLocalTransition(State from, alphabet::Symbol input, State to) { + std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input)); + return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to)); } bool RealTimeHeightDeterministicDPDA::removeCallTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to, const alphabet::Symbol& push) { @@ -355,15 +355,15 @@ bool RealTimeHeightDeterministicDPDA::removeLocalTransition(const State& from, c } const std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>>, std::pair<State, alphabet::Symbol> >& RealTimeHeightDeterministicDPDA::getCallTransitions() const { - return callTransitions; + return callTransitions; } const std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, State>& RealTimeHeightDeterministicDPDA::getReturnTransitions() const { - return returnTransitions; + return returnTransitions; } const std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>>, State>& RealTimeHeightDeterministicDPDA::getLocalTransitions() const { - return localTransitions; + return localTransitions; } int RealTimeHeightDeterministicDPDA::compare(const RealTimeHeightDeterministicDPDA& other) const { diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h index 37156ecf5dee8e82880412c749dc38b521a8a4b9..fffde3d5bffafc7e81d6a83d4e0a5e24d790f687 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h @@ -31,7 +31,7 @@ protected: std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, State> returnTransitions; std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>>, State> localTransitions; public: - explicit RealTimeHeightDeterministicDPDA(const State& initialState, const alphabet::Symbol& bottomOfTheStackSymbol); + explicit RealTimeHeightDeterministicDPDA(State initialState, alphabet::Symbol bottomOfTheStackSymbol); virtual AutomatonBase* clone() const; @@ -59,9 +59,9 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addCallTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& next, const alphabet::Symbol& push); - bool addCallTransition(const State& current, const State& next, const alphabet::Symbol& push); - bool addCallTransition(const State& current, const alphabet::Symbol& input, const State& next, const alphabet::Symbol& push); + bool addCallTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, State next, alphabet::Symbol push); + bool addCallTransition(State current, State next, alphabet::Symbol push); + bool addCallTransition(State current, alphabet::Symbol input, State next, alphabet::Symbol push); /** * Adds return transition defined by parameters to the automaton. @@ -70,9 +70,9 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addReturnTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& next); - bool addReturnTransition(const State& current, const alphabet::Symbol& pop, const State& next); - bool addReturnTransition(const State& current, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& next); + bool addReturnTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State next); + bool addReturnTransition(State current, alphabet::Symbol pop, State next); + bool addReturnTransition(State current, alphabet::Symbol input, alphabet::Symbol pop, State next); /** * Adds local transition defined by parameters to the automaton. @@ -81,9 +81,9 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addLocalTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& next); - bool addLocalTransition(const State& current, const State& next); - bool addLocalTransition(const State& current, const alphabet::Symbol& input, const State& next); + bool addLocalTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, State next); + bool addLocalTransition(State current, State next); + bool addLocalTransition(State current, alphabet::Symbol input, State next); /** * Removes call transition from the automaton. diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp index c07360133533ae61237b5d9f4a5aba43cae07f01..b4724843e03454c569a664d7cf60f6b653b6da20 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp @@ -13,7 +13,7 @@ namespace automaton { -RealTimeHeightDeterministicNPDA::RealTimeHeightDeterministicNPDA(const alphabet::Symbol& bottomOfTheStackSymbol) : BottomOfTheStackSymbolPushdownStoreAlphabet(bottomOfTheStackSymbol) { +RealTimeHeightDeterministicNPDA::RealTimeHeightDeterministicNPDA(alphabet::Symbol bottomOfTheStackSymbol) : BottomOfTheStackSymbolPushdownStoreAlphabet(std::move(bottomOfTheStackSymbol)) { } @@ -103,7 +103,7 @@ bool RealTimeHeightDeterministicNPDA::removeStackSymbol(const alphabet::Symbol& return stackAlphabet.erase(symbol); } -bool RealTimeHeightDeterministicNPDA::addCallTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to, const alphabet::Symbol& push) { +bool RealTimeHeightDeterministicNPDA::addCallTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to, alphabet::Symbol push) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -120,23 +120,23 @@ bool RealTimeHeightDeterministicNPDA::addCallTransition(const State& from, const throw AutomatonException("Stack symbol \"" + (std::string) push + "\" doesn't exist."); } - std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(from, input); - std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push); - - return callTransitions[key].insert(value).second; + std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(std::move(from), std::move(input)); + std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(std::move(to), std::move(push)); + + return callTransitions[std::move(key)].insert(std::move(value)).second; } -bool RealTimeHeightDeterministicNPDA::addCallTransition(const State& from, const State& to, const alphabet::Symbol& push) { +bool RealTimeHeightDeterministicNPDA::addCallTransition(State from, State to, alphabet::Symbol push) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addCallTransition(from, inputVariant, to, push); + return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push)); } -bool RealTimeHeightDeterministicNPDA::addCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) { +bool RealTimeHeightDeterministicNPDA::addCallTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol push) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addCallTransition(from, inputVariant, to, push); + return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push)); } -bool RealTimeHeightDeterministicNPDA::addReturnTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to) { +bool RealTimeHeightDeterministicNPDA::addReturnTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -153,22 +153,22 @@ bool RealTimeHeightDeterministicNPDA::addReturnTransition(const State& from, con throw AutomatonException("Stack symbol \"" + (std::string) pop + "\" doesn't exist."); } - std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, input, pop); + std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop)); - return returnTransitions[key].insert(to).second; + return returnTransitions[std::move(key)].insert(std::move(to)).second; } -bool RealTimeHeightDeterministicNPDA::addReturnTransition(const State& from, const alphabet::Symbol& pop, const State& to) { +bool RealTimeHeightDeterministicNPDA::addReturnTransition(State from, alphabet::Symbol pop, State to) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addReturnTransition(from, inputVariant, pop, to); + return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to)); } -bool RealTimeHeightDeterministicNPDA::addReturnTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to) { - std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addReturnTransition(from, inputVariant, pop, to); +bool RealTimeHeightDeterministicNPDA::addReturnTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to) { + std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input)); + return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to)); } -bool RealTimeHeightDeterministicNPDA::addLocalTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to) { +bool RealTimeHeightDeterministicNPDA::addLocalTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -181,25 +181,25 @@ bool RealTimeHeightDeterministicNPDA::addLocalTransition(const State& from, cons throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); } - std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(from, input); + std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(std::move(from), std::move(input)); - return localTransitions[key].insert(to).second; + return localTransitions[std::move(key)].insert(std::move(to)).second; } -bool RealTimeHeightDeterministicNPDA::addLocalTransition(const State& from, const State& to) { +bool RealTimeHeightDeterministicNPDA::addLocalTransition(State from, State to) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addLocalTransition(from, inputVariant, to); + return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to)); } -bool RealTimeHeightDeterministicNPDA::addLocalTransition(const State& from, const alphabet::Symbol& input, const State& to) { - std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addLocalTransition(from, inputVariant, to); +bool RealTimeHeightDeterministicNPDA::addLocalTransition(State from, alphabet::Symbol input, State to) { + std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input)); + return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to)); } bool RealTimeHeightDeterministicNPDA::removeCallTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to, const alphabet::Symbol& push) { std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(from, input); std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push); - + return callTransitions[key].erase(value); } diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h index 4f81eba7af9bfa6c33e7c6f772a558d734768c81..b3b6911b20b013f253020c084ba05fd3ba6edb19 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h @@ -31,7 +31,7 @@ protected: std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, std::set<State> > returnTransitions; std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>>, std::set<State> > localTransitions; public: - explicit RealTimeHeightDeterministicNPDA(const alphabet::Symbol& bottomOfTheStackSymbol); + explicit RealTimeHeightDeterministicNPDA(alphabet::Symbol bottomOfTheStackSymbol); virtual AutomatonBase* clone() const; @@ -59,9 +59,9 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addCallTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& next, const alphabet::Symbol& push); - bool addCallTransition(const State& current, const State& next, const alphabet::Symbol& push); - bool addCallTransition(const State& current, const alphabet::Symbol& input, const State& next, const alphabet::Symbol& push); + bool addCallTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, State next, alphabet::Symbol push); + bool addCallTransition(State current, State next, alphabet::Symbol push); + bool addCallTransition(State current, alphabet::Symbol input, State next, alphabet::Symbol push); /** * Adds return transition defined by parameters to the automaton. @@ -70,9 +70,9 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addReturnTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& next); - bool addReturnTransition(const State& current, const alphabet::Symbol& pop, const State& next); - bool addReturnTransition(const State& current, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& next); + bool addReturnTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State next); + bool addReturnTransition(State current, alphabet::Symbol pop, State next); + bool addReturnTransition(State current, alphabet::Symbol input, alphabet::Symbol pop, State next); /** * Adds local transition defined by parameters to the automaton. @@ -81,9 +81,9 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addLocalTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& next); - bool addLocalTransition(const State& current, const State& next); - bool addLocalTransition(const State& current, const alphabet::Symbol& input, const State& next); + bool addLocalTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, State next); + bool addLocalTransition(State current, State next); + bool addLocalTransition(State current, alphabet::Symbol input, State next); /** * Removes call transition from the automaton. diff --git a/alib2data/src/automaton/PDA/SinglePopDPDA.cpp b/alib2data/src/automaton/PDA/SinglePopDPDA.cpp index b8e1a85633d0fba4b56fe1aa2ad8e07ca33c02f2..ba7a558be4636df8298d5f0a36e78c119fa368f5 100644 --- a/alib2data/src/automaton/PDA/SinglePopDPDA.cpp +++ b/alib2data/src/automaton/PDA/SinglePopDPDA.cpp @@ -14,7 +14,7 @@ namespace automaton { -SinglePopDPDA::SinglePopDPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) { +SinglePopDPDA::SinglePopDPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) { } @@ -40,7 +40,7 @@ bool SinglePopDPDA::removeState(const State& state) { throw AutomatonException("State \"" + (std::string) state.getName() + "\" is used in transition."); if(transition->second.first == state) throw AutomatonException("State \"" + (std::string) state.getName() + "\" is used in transition."); - + } return states.erase(state); @@ -71,7 +71,7 @@ bool SinglePopDPDA::removeStackSymbol(const alphabet::Symbol& symbol) { return stackAlphabet.erase(symbol); } -bool SinglePopDPDA::addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) { +bool SinglePopDPDA::addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -94,50 +94,50 @@ bool SinglePopDPDA::addTransition(const State& from, const std::variant<string:: } } - std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, input, pop); - std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push); + std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop)); + std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(std::move(to), std::move(push)); if (transitions.find(key) != transitions.end()) { if(transitions.find(key)->second == value) return false; else if (input.is<alphabet::Symbol>()) throw AutomatonException( - "Transition (\"" + (std::string) from.getName() + "\", \"" + (std::string) input.get<alphabet::Symbol>() + "\", \"" + (std::string) pop + "\") -> ?? already exists."); + "Transition (\"" + (std::string) std::get<0>(key).getName() + "\", \"" + (std::string) std::get<1>(key).get<alphabet::Symbol>() + "\", \"" + (std::string) std::get<2>(key) + "\") -> ?? already exists."); else throw AutomatonException( - "Transition (\"" + (std::string) from.getName() + "\", \"" + (std::string) input.get<string::Epsilon>() + "\", \"" + (std::string) pop + "\") -> ?? already exists."); + "Transition (\"" + (std::string) std::get<0>(key).getName() + "\", \"" + (std::string) std::get<1>(key).get<string::Epsilon>() + "\", \"" + (std::string) std::get<2>(key) + "\") -> ?? already exists."); } if(input.is<string::Epsilon>()) { if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, std::pair<automaton::State, std::vector<alphabet::Symbol> > > & transition) { - if(std::get<0>(transition.first) == from && std::get<2>(transition.first) == pop) return true; + if(std::get<0>(transition.first) == std::get<0>(key) && std::get<2>(transition.first) == std::get<2>(key)) return true; return false; })) throw exception::AlibException("Conflicting transition"); } else { - std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, std::variant<string::Epsilon, alphabet::Symbol>{ string::Epsilon { } }, pop); - if(transitions.find(key) != transitions.end()) + std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key2(std::get<0>(key), std::variant<string::Epsilon, alphabet::Symbol>{ string::Epsilon::EPSILON }, std::get<2>(key)); + if(transitions.find(key2) != transitions.end()) throw exception::AlibException("Conflicting transition"); } - transitions.insert(std::make_pair(key, value) ); + transitions.insert(std::make_pair(std::move(key), std::move(value)) ); return true; } -bool SinglePopDPDA::addTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) { - std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addTransition(from, inputVariant, pop, to, push); +bool SinglePopDPDA::addTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) { + std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input)); + return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } -bool SinglePopDPDA::addTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) { +bool SinglePopDPDA::addTransition(State from, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addTransition(from, inputVariant, pop, to, push); + return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } bool SinglePopDPDA::removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) { std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, input, pop); std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push); - + if (transitions.find(key) == transitions.end()) return false; diff --git a/alib2data/src/automaton/PDA/SinglePopDPDA.h b/alib2data/src/automaton/PDA/SinglePopDPDA.h index f79eb5fdfd43b3cf5c3ae29c1c09bbda9ed164ae..dd9a248a14bd6801a462b61b60c10ac534a6daca 100644 --- a/alib2data/src/automaton/PDA/SinglePopDPDA.h +++ b/alib2data/src/automaton/PDA/SinglePopDPDA.h @@ -32,10 +32,10 @@ class SinglePopDPDA: public std::acceptor<SinglePopDPDA, VisitableAutomatonBase, protected: std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, std::pair<State, std::vector<alphabet::Symbol> > > transitions; public: - explicit SinglePopDPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol); + explicit SinglePopDPDA(State initialState, alphabet::Symbol initialPushdownSymbol); virtual AutomatonBase* clone() const; - + virtual AutomatonBase* plunder() &&; /** @@ -59,11 +59,11 @@ public: * @throws AutomatonException when some part of the transition is not present * in the SinglePopDPDA (state, input symbol, stack symbol) or when transition already exists */ - bool addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); + bool addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push); + + bool addTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push); - bool addTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); - - bool addTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); + bool addTransition(State from, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push); /** * Removes the transition from the SinglePopDPDA. @@ -73,7 +73,7 @@ public: bool removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); bool removeTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); - + bool removeTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); /** diff --git a/alib2data/src/automaton/PDA/SinglePopNPDA.cpp b/alib2data/src/automaton/PDA/SinglePopNPDA.cpp index 10bfabf086c859919d8b5234b3b0702adc80de11..2a14234aafa7cebfe6c1c6c56489d7fa7390cbef 100644 --- a/alib2data/src/automaton/PDA/SinglePopNPDA.cpp +++ b/alib2data/src/automaton/PDA/SinglePopNPDA.cpp @@ -13,7 +13,7 @@ namespace automaton { -SinglePopNPDA::SinglePopNPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) { +SinglePopNPDA::SinglePopNPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) { } @@ -73,7 +73,7 @@ bool SinglePopNPDA::removeStackSymbol(const alphabet::Symbol& symbol) { return stackAlphabet.erase(symbol); } -bool SinglePopNPDA::addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) { +bool SinglePopNPDA::addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -96,20 +96,20 @@ bool SinglePopNPDA::addTransition(const State& from, const std::variant<string:: } } - std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, input, pop); - std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push); + std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop)); + std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(std::move(to), std::move(push)); - return transitions[key].insert(value).second; + return transitions[std::move(key)].insert(std::move(value)).second; } -bool SinglePopNPDA::addTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) { - std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input); - return addTransition(from, inputVariant, pop, to, push); +bool SinglePopNPDA::addTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) { + std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input)); + return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } -bool SinglePopNPDA::addTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) { +bool SinglePopNPDA::addTransition(State from, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) { std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON); - return addTransition(from, inputVariant, pop, to, push); + return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } bool SinglePopNPDA::removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) { diff --git a/alib2data/src/automaton/PDA/SinglePopNPDA.h b/alib2data/src/automaton/PDA/SinglePopNPDA.h index 4c5b5d386470d6b930f19d633f62bd02d071372d..cb3e381a99efa98fbbe94c152661b23ca4d42f12 100644 --- a/alib2data/src/automaton/PDA/SinglePopNPDA.h +++ b/alib2data/src/automaton/PDA/SinglePopNPDA.h @@ -28,10 +28,10 @@ class SinglePopNPDA: public std::acceptor<SinglePopNPDA, VisitableAutomatonBase, protected: std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, std::set<std::pair<State, std::vector<alphabet::Symbol> > > > transitions; public: - explicit SinglePopNPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol); + explicit SinglePopNPDA(State initialState, alphabet::Symbol initialPushdownSymbol); virtual AutomatonBase* clone() const; - + virtual AutomatonBase* plunder() &&; /** @@ -55,11 +55,11 @@ public: * @throws AutomatonException when some part of the transition is not present * in the SinglePopNPDA (state, input symbol, stack symbol) or when transition already exists */ - bool addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); + bool addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push); + + bool addTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push); - bool addTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); - - bool addTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); + bool addTransition(State from, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push); /** * Removes the transition from the SinglePopNPDA. @@ -69,7 +69,7 @@ public: bool removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); bool removeTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); - + bool removeTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push); /** diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp index 77bd069f36563e1cf14c65e3329d16cbfca7366c..c4447ac516248598e90d31671a61a34cff50da47 100644 --- a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp +++ b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp @@ -13,7 +13,7 @@ namespace automaton { -VisiblyPushdownDPDA::VisiblyPushdownDPDA(const State& initialState, const alphabet::Symbol& bottomOfTheStackSymbol) : SingleInitialState(initialState), BottomOfTheStackSymbolPushdownStoreAlphabet(bottomOfTheStackSymbol) { +VisiblyPushdownDPDA::VisiblyPushdownDPDA(State initialState, alphabet::Symbol bottomOfTheStackSymbol) : SingleInitialState(std::move(initialState)), BottomOfTheStackSymbolPushdownStoreAlphabet(std::move(bottomOfTheStackSymbol)) { } @@ -95,7 +95,7 @@ bool VisiblyPushdownDPDA::removeStackSymbol(const alphabet::Symbol& symbol) { return stackAlphabet.erase(symbol); } -bool VisiblyPushdownDPDA::addCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) { +bool VisiblyPushdownDPDA::addCallTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol push) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -112,29 +112,29 @@ bool VisiblyPushdownDPDA::addCallTransition(const State& from, const alphabet::S throw AutomatonException("Stack symbol \"" + (std::string) push + "\" doesn't exist."); } - std::pair<State, alphabet::Symbol> key(from, input); - std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push); + std::pair<State, alphabet::Symbol> key(std::move(from), std::move(input)); + std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(std::move(to), std::move(push)); if(callTransitions.find(key) != callTransitions.end() && callTransitions.find(key)->second == value) return false; for(const auto& transition : callTransitions) - if(transition.first.first == from && transition.first.second == input) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == key.first && transition.first.second == key.second) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); for(const auto& transition : returnTransitions) - if(std::get<0>(transition.first) == from && std::get<1>(transition.first) == input) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(std::get<0>(transition.first) == key.first && std::get<1>(transition.first) == key.second) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); for(const auto& transition : localTransitions) - if(transition.first.first == from && transition.first.second == input) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == key.first && transition.first.second == key.second) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); - callTransitions.insert(std::make_pair(key, value)); + callTransitions.insert(std::make_pair(std::move(key), std::move(value))); return true; } -bool VisiblyPushdownDPDA::addReturnTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to) { +bool VisiblyPushdownDPDA::addReturnTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -151,28 +151,28 @@ bool VisiblyPushdownDPDA::addReturnTransition(const State& from, const alphabet: throw AutomatonException("Stack symbol \"" + (std::string) pop + "\" doesn't exist."); } - std::tuple<State, alphabet::Symbol, alphabet::Symbol> key(from, input, pop); + std::tuple<State, alphabet::Symbol, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop)); if(returnTransitions.find(key) != returnTransitions.end() && returnTransitions.find(key)->second == to) return false; for(const auto& transition : callTransitions) - if(transition.first.first == from && transition.first.second == input) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == std::get<0>(key) && transition.first.second == std::get<1>(key)) + throw AutomatonException("Can't add transition from state \"" + (std::string) std::get<0>(key) + "\" when transition reading \"" + (std::string) std::get<1>(key) + "\" is present."); for(const auto& transition : returnTransitions) - if(std::get<0>(transition.first) == from && std::get<1>(transition.first) == input && std::get<2>(transition.first) == pop) + if(std::get<0>(transition.first) == std::get<0>(key) && std::get<1>(transition.first) == std::get<1>(key) && std::get<2>(transition.first) == std::get<2>(key)) throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); for(const auto& transition : localTransitions) - if(transition.first.first == from && transition.first.second == input) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == std::get<0>(key) && transition.first.second == std::get<1>(key)) + throw AutomatonException("Can't add transition from state \"" + (std::string) std::get<0>(key) + "\" when transition reading \"" + (std::string) std::get<1>(key) + "\" is present."); - returnTransitions.insert(std::make_pair(key, to)); + returnTransitions.insert(std::make_pair(std::move(key), std::move(to))); return true; } -bool VisiblyPushdownDPDA::addLocalTransition(const State& from, const alphabet::Symbol& input, const State& to) { +bool VisiblyPushdownDPDA::addLocalTransition(State from, alphabet::Symbol input, State to) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -185,31 +185,31 @@ bool VisiblyPushdownDPDA::addLocalTransition(const State& from, const alphabet:: throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); } - std::pair<State, alphabet::Symbol> key(from, input); - + std::pair<State, alphabet::Symbol> key(std::move(from), std::move(input)); + if(localTransitions.find(key) != localTransitions.end() && localTransitions.find(key)->second == to) return false; for(const auto& transition : callTransitions) - if(transition.first.first == from && transition.first.second == input) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == key.first && transition.first.second == key.second) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); for(const auto& transition : returnTransitions) - if(std::get<0>(transition.first) == from && std::get<1>(transition.first) == input) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(std::get<0>(transition.first) == key.first && std::get<1>(transition.first) == key.second) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); for(const auto& transition : localTransitions) - if(transition.first.first == from && transition.first.second == input) - throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present."); + if(transition.first.first == key.first && transition.first.second == key.second) + throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present."); - localTransitions.insert(std::make_pair(key, to)); + localTransitions.insert(std::make_pair(std::move(key), std::move(to))); return true; } bool VisiblyPushdownDPDA::removeCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) { std::pair<State, alphabet::Symbol> key(from, input); std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push); - + if (callTransitions.find(key) == callTransitions.end()) return false; diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h index cda77c82af94a7c8067467e6a67d5ea51b0490eb..2331ef5caab93a2289f1ffc9bcc154d2ddeb66ec 100644 --- a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h +++ b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h @@ -29,10 +29,10 @@ protected: std::map<std::tuple<State, alphabet::Symbol, alphabet::Symbol>, State > returnTransitions; std::map<std::pair<State, alphabet::Symbol>, State > localTransitions; public: - explicit VisiblyPushdownDPDA(const State& initialSymbol, const alphabet::Symbol& bottomOfTheStackSymbol); + explicit VisiblyPushdownDPDA(State initialSymbol, alphabet::Symbol bottomOfTheStackSymbol); virtual AutomatonBase* clone() const; - + virtual AutomatonBase* plunder() &&; /** @@ -57,7 +57,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addCallTransition(const State& current, const alphabet::Symbol& input, const State& next, const alphabet::Symbol& push); + bool addCallTransition(State current, alphabet::Symbol input, State next, alphabet::Symbol push); /** * Adds return transition defined by parameters to the automaton. @@ -66,7 +66,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addReturnTransition(const State& current, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& next); + bool addReturnTransition(State current, alphabet::Symbol input, alphabet::Symbol pop, State next); /** * Adds local transition defined by parameters to the automaton. @@ -75,7 +75,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addLocalTransition(const State& current, const alphabet::Symbol& input, const State& next); + bool addLocalTransition(State current, alphabet::Symbol input, State next); /** * Removes call transition from the automaton. diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp index 746d4922db02ce67d98d933da3643af4cef6b1db..d332756b877b947ea51d71dd81ba4d96a875a9cd 100644 --- a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp +++ b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp @@ -13,7 +13,7 @@ namespace automaton { -VisiblyPushdownNPDA::VisiblyPushdownNPDA(const alphabet::Symbol& bottomOfTheStackSymbol) : BottomOfTheStackSymbolPushdownStoreAlphabet(bottomOfTheStackSymbol) { +VisiblyPushdownNPDA::VisiblyPushdownNPDA(alphabet::Symbol bottomOfTheStackSymbol) : BottomOfTheStackSymbolPushdownStoreAlphabet(std::move(bottomOfTheStackSymbol)) { } @@ -103,7 +103,7 @@ bool VisiblyPushdownNPDA::removeStackSymbol(const alphabet::Symbol& symbol) { return stackAlphabet.erase(symbol); } -bool VisiblyPushdownNPDA::addCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) { +bool VisiblyPushdownNPDA::addCallTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol push) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -120,13 +120,13 @@ bool VisiblyPushdownNPDA::addCallTransition(const State& from, const alphabet::S throw AutomatonException("Stack symbol \"" + (std::string) push + "\" doesn't exist."); } - std::pair<State, alphabet::Symbol> key(from, input); - std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push); - - return callTransitions[key].insert(value).second; + std::pair<State, alphabet::Symbol> key(std::move(from), std::move(input)); + std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(std::move(to), std::move(push)); + + return callTransitions[std::move(key)].insert(std::move(value)).second; } -bool VisiblyPushdownNPDA::addReturnTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to) { +bool VisiblyPushdownNPDA::addReturnTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -143,12 +143,12 @@ bool VisiblyPushdownNPDA::addReturnTransition(const State& from, const alphabet: throw AutomatonException("Stack symbol \"" + (std::string) pop + "\" doesn't exist."); } - std::tuple<State, alphabet::Symbol, alphabet::Symbol> key(from, input, pop); + std::tuple<State, alphabet::Symbol, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop)); - return returnTransitions[key].insert(to).second; + return returnTransitions[std::move(key)].insert(std::move(to)).second; } -bool VisiblyPushdownNPDA::addLocalTransition(const State& from, const alphabet::Symbol& input, const State& to) { +bool VisiblyPushdownNPDA::addLocalTransition(State from, alphabet::Symbol input, State to) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -161,15 +161,15 @@ bool VisiblyPushdownNPDA::addLocalTransition(const State& from, const alphabet:: throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist."); } - std::pair<State, alphabet::Symbol> key(from, input); + std::pair<State, alphabet::Symbol> key(std::move(from), std::move(input)); - return localTransitions[key].insert(to).second; + return localTransitions[std::move(key)].insert(std::move(to)).second; } bool VisiblyPushdownNPDA::removeCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) { std::pair<State, alphabet::Symbol> key(from, input); std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push); - + return callTransitions[key].erase(value); } diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h index d6faa402c3924f73a855a776591e8b76d0aec76c..721e31babcd11dab6d1171f5a523022959d84fad 100644 --- a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h +++ b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h @@ -29,10 +29,10 @@ protected: std::map<std::tuple<State, alphabet::Symbol, alphabet::Symbol>, std::set<State> > returnTransitions; std::map<std::pair<State, alphabet::Symbol>, std::set<State> > localTransitions; public: - explicit VisiblyPushdownNPDA(const alphabet::Symbol& bottomOfTheStackSymbol); + explicit VisiblyPushdownNPDA(alphabet::Symbol bottomOfTheStackSymbol); virtual AutomatonBase* clone() const; - + virtual AutomatonBase* plunder() &&; /** @@ -57,7 +57,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addCallTransition(const State& current, const alphabet::Symbol& input, const State& next, const alphabet::Symbol& push); + bool addCallTransition(State current, alphabet::Symbol input, State next, alphabet::Symbol push); /** * Adds return transition defined by parameters to the automaton. @@ -66,7 +66,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addReturnTransition(const State& current, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& next); + bool addReturnTransition(State current, alphabet::Symbol input, alphabet::Symbol pop, State next); /** * Adds local transition defined by parameters to the automaton. @@ -75,7 +75,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addLocalTransition(const State& current, const alphabet::Symbol& input, const State& next); + bool addLocalTransition(State current, alphabet::Symbol input, State next); /** * Removes call transition from the automaton. diff --git a/alib2data/src/automaton/TM/OneTapeDTM.cpp b/alib2data/src/automaton/TM/OneTapeDTM.cpp index d10917dea2ee3fe2ab6db5b4724215529731c740..f4043e36fa3e6fd33c58e0abd4dc0cc4118c31a4 100644 --- a/alib2data/src/automaton/TM/OneTapeDTM.cpp +++ b/alib2data/src/automaton/TM/OneTapeDTM.cpp @@ -12,7 +12,8 @@ namespace automaton { -OneTapeDTM::OneTapeDTM(const State& initialState, const alphabet::Symbol& blank) : SingleInitialState(initialState), BlankSymbolInputTapeAlphabet(blank) { +OneTapeDTM::OneTapeDTM(State initialState, alphabet::Symbol blank) : SingleInitialState(std::move(initialState)), BlankSymbolInputTapeAlphabet(std::move(blank)) { + } AutomatonBase* OneTapeDTM::clone() const { @@ -57,7 +58,7 @@ bool OneTapeDTM::removeTapeSymbol(const alphabet::Symbol& symbol) { return inputAlphabet.erase(symbol); } -bool OneTapeDTM::addTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& output, const Shift& shift) { +bool OneTapeDTM::addTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol output, Shift shift) { if (states.find(from) == states.end()) { throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist."); } @@ -79,19 +80,19 @@ bool OneTapeDTM::addTransition(const State& from, const alphabet::Symbol& input, if(shift == Shift::NOT_SET) throw AutomatonException("Invalid shift."); - std::pair<State, alphabet::Symbol> key = std::make_pair(from, input); - - std::tuple<State, alphabet::Symbol, Shift > value(to, output, shift); + std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input)); + + std::tuple<State, alphabet::Symbol, Shift > value(std::move(to), std::move(output), shift); if (transitions.find(key) != transitions.end()) { if(transitions.find(key)->second == value) return false; else throw AutomatonException( - "Transition (\"" + (std::string) from.getName() + "\", \"" + (std::string) input + "\") -> ? already exists."); + "Transition (\"" + (std::string) key.first.getName() + "\", \"" + (std::string) key.second + "\") -> ? already exists."); } - transitions.insert(std::make_pair(key, value)); + transitions.insert(std::make_pair(std::move(key), std::move(value))); return true; } diff --git a/alib2data/src/automaton/TM/OneTapeDTM.h b/alib2data/src/automaton/TM/OneTapeDTM.h index 9ee3d33169c3fdd2fcf8d7589be82ce3995edc6c..b140ccb17dcca07ebaa86223f19cbcf31dd94435 100644 --- a/alib2data/src/automaton/TM/OneTapeDTM.h +++ b/alib2data/src/automaton/TM/OneTapeDTM.h @@ -27,7 +27,7 @@ protected: std::map<std::pair<State, alphabet::Symbol>, std::tuple<State, alphabet::Symbol, Shift> > transitions; public: - explicit OneTapeDTM(const State& initialState, const alphabet::Symbol& blank); + explicit OneTapeDTM(State initialState, alphabet::Symbol blank); virtual AutomatonBase* clone() const; @@ -59,7 +59,7 @@ public: * @throws AutomatonException when some part of the transition is not present * in the TM (state, tape symbol) or when transition already exists */ - bool addTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& output, const Shift& shift); + bool addTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol output, Shift shift); /** * Removes the transition from the TM. diff --git a/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.cpp b/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.cpp index b47b87b2475aec0d7989e20b5c28d0c654d566cc..e3dcf86e6b27a140b435188e51ad88fe3582e9f0 100644 --- a/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.cpp +++ b/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.cpp @@ -12,16 +12,16 @@ namespace automaton { -BlankSymbolInputTapeAlphabet::BlankSymbolInputTapeAlphabet(const alphabet::Symbol& blank) : blankSymbol(blank) { - tapeAlphabet.insert(blank); +BlankSymbolInputTapeAlphabet::BlankSymbolInputTapeAlphabet(alphabet::Symbol blank) : blankSymbol(blank) { + tapeAlphabet.insert(std::move(blank)); } const std::set<alphabet::Symbol>& BlankSymbolInputTapeAlphabet::getInputAlphabet() const { return inputAlphabet; } -bool BlankSymbolInputTapeAlphabet::addInputSymbol(const alphabet::Symbol& symbol) { - if (tapeAlphabet.find(symbol) == tapeAlphabet.end()) { +bool BlankSymbolInputTapeAlphabet::addInputSymbol(alphabet::Symbol symbol) { + if (!tapeAlphabet.count(symbol)) { throw AutomatonException("Input symbol \"" + (std::string) symbol + "\" is not in tape alphabet."); } @@ -29,57 +29,55 @@ bool BlankSymbolInputTapeAlphabet::addInputSymbol(const alphabet::Symbol& symbol throw AutomatonException("Input symbol \"" + (std::string) symbol + "\" cannot be blank symbol."); } - return inputAlphabet.insert(symbol).second; + return inputAlphabet.insert(std::move(symbol)).second; } -void BlankSymbolInputTapeAlphabet::setInputAlphabet(const std::set<alphabet::Symbol>& newSymbols) { +void BlankSymbolInputTapeAlphabet::setInputAlphabet(std::set<alphabet::Symbol> newSymbols) { std::set<alphabet::Symbol> removed; std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(newSymbols.begin(), newSymbols.end(), inputAlphabet.begin(), inputAlphabet.end(), std::inserter(added, added.end())); - + if(!std::includes(tapeAlphabet.begin(), tapeAlphabet.end(), newSymbols.begin(), newSymbols.end())) { + throw AutomatonException("Input symbol ? is not in tape alphabet."); + } + + if(newSymbols.count(blankSymbol)) { + throw AutomatonException("Input symbol ? cannot be blank symbol."); + } + for(const alphabet::Symbol& removedSymbol : removed) { removeInputSymbol(removedSymbol); } - for(const alphabet::Symbol& addedSymbol : added) { - addInputSymbol(addedSymbol); - } + inputAlphabet = std::move(newSymbols); } -bool BlankSymbolInputTapeAlphabet::addTapeSymbol(const alphabet::Symbol& symbol) { - return tapeAlphabet.insert(symbol).second; +bool BlankSymbolInputTapeAlphabet::addTapeSymbol(alphabet::Symbol symbol) { + return tapeAlphabet.insert(std::move(symbol)).second; } -void BlankSymbolInputTapeAlphabet::setTapeAlphabet(const std::set<alphabet::Symbol>& newSymbols) { +void BlankSymbolInputTapeAlphabet::setTapeAlphabet(std::set<alphabet::Symbol> newSymbols) { std::set<alphabet::Symbol> removed; std::set_difference(tapeAlphabet.begin(), tapeAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(newSymbols.begin(), newSymbols.end(), tapeAlphabet.begin(), tapeAlphabet.end(), std::inserter(added, added.end())); - for(const alphabet::Symbol& removedSymbol : removed) { removeTapeSymbol(removedSymbol); } - for(const alphabet::Symbol& addedSymbol : added) { - addTapeSymbol(addedSymbol); - } + tapeAlphabet = std::move(newSymbols); } const std::set<alphabet::Symbol>& BlankSymbolInputTapeAlphabet::getTapeAlphabet() const { return tapeAlphabet; } -void BlankSymbolInputTapeAlphabet::setBlankSymbol(const alphabet::Symbol& symbol) { - if (inputAlphabet.find(symbol) != inputAlphabet.end()) +void BlankSymbolInputTapeAlphabet::setBlankSymbol(alphabet::Symbol symbol) { + if (inputAlphabet.count(symbol)) throw AutomatonException("Blank symbol \"" + (std::string) symbol + "\" is in input alphabet."); - if (tapeAlphabet.find(symbol) == tapeAlphabet.end()) + if (!tapeAlphabet.count(symbol)) throw AutomatonException("Blank symbol \"" + (std::string) symbol + "\" is not in tape alphabet."); - blankSymbol = symbol; + blankSymbol = std::move(symbol); } diff --git a/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.h b/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.h index 968457aea47015733a16c39b52bf636db9f09219..a6468ab47d3aa9ab1bf42ed95b6b46a99cffbc2c 100644 --- a/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.h +++ b/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.h @@ -19,21 +19,21 @@ protected: std::set<alphabet::Symbol> inputAlphabet; alphabet::Symbol blankSymbol; public: - BlankSymbolInputTapeAlphabet(const alphabet::Symbol& blank); + BlankSymbolInputTapeAlphabet(alphabet::Symbol blank); /** * Adds input symbol to input alphabet. * @param symbol Symbol to add * @throws AutomatonException when symbol already exists */ - bool addInputSymbol(const alphabet::Symbol& symbol); + bool addInputSymbol(alphabet::Symbol symbol); /** * Sets input symbols of the automaton. * @param symbols Symbols to set * @throws AutomatonException when symbol already exists */ - void setInputAlphabet(const std::set<alphabet::Symbol>& symbol); + void setInputAlphabet(std::set<alphabet::Symbol> symbol); /** * Removes input symbol from the input alphabet. @@ -53,14 +53,14 @@ public: * @param symbol Symbol to add * @throw AutomatonException when Symbol is already present in tape alphabet */ - bool addTapeSymbol(const alphabet::Symbol& symbol); + bool addTapeSymbol(alphabet::Symbol symbol); /** * Sets tape symbols of the automaton. * @param symbols Symbols to set * @throw AutomatonException when Symbol is already present in tape alphabet */ - void setTapeAlphabet(const std::set<alphabet::Symbol>& symbols); + void setTapeAlphabet(std::set<alphabet::Symbol> symbols); /** * Removes symbol from the tape alphabet. @@ -79,7 +79,7 @@ public: * Sets the blank symbol = symbol representing empty cell of the tape * @param symbol Symbol to set */ - void setBlankSymbol(const alphabet::Symbol& symbol); + void setBlankSymbol(alphabet::Symbol symbol); /** * @return symbol representing empty cell of the tape diff --git a/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.cpp b/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.cpp index 564e0e33f73795b37bfb3745d93325fd16aca967..35d9a8d950a71dbc216c76276bff632095b5587f 100644 --- a/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.cpp +++ b/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.cpp @@ -11,16 +11,16 @@ namespace automaton { -BottomOfTheStackSymbolPushdownStoreAlphabet::BottomOfTheStackSymbolPushdownStoreAlphabet(const alphabet::Symbol& bottomOfTheStackSymbol) : bottomOfTheStackSymbol(bottomOfTheStackSymbol) { - addStackSymbol(bottomOfTheStackSymbol); +BottomOfTheStackSymbolPushdownStoreAlphabet::BottomOfTheStackSymbolPushdownStoreAlphabet(alphabet::Symbol bottomOfTheStackSymbol) : bottomOfTheStackSymbol(bottomOfTheStackSymbol) { + addStackSymbol(std::move(bottomOfTheStackSymbol)); } -void BottomOfTheStackSymbolPushdownStoreAlphabet::setBottomOfTheStackSymbol(const alphabet::Symbol& start) { - if (stackAlphabet.find(start) == stackAlphabet.end()) { +void BottomOfTheStackSymbolPushdownStoreAlphabet::setBottomOfTheStackSymbol(alphabet::Symbol start) { + if (!stackAlphabet.count(start)) { throw AutomatonException("Stack symbol \"" + (std::string) start + "\" doesn't exist."); } - - bottomOfTheStackSymbol = start; + + bottomOfTheStackSymbol = std::move(start); } const alphabet::Symbol& BottomOfTheStackSymbolPushdownStoreAlphabet::getBottomOfTheStackSymbol() const { diff --git a/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.h b/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.h index e177cd142148d319eb4a205141c4be6dfc80091b..67c2317e27b9ec33f14ee8eb5b0b01cb8cc8ad79 100644 --- a/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.h +++ b/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.h @@ -21,7 +21,7 @@ class BottomOfTheStackSymbolPushdownStoreAlphabet : public PushdownStoreAlphabet protected: alphabet::Symbol bottomOfTheStackSymbol; public: - BottomOfTheStackSymbolPushdownStoreAlphabet(const alphabet::Symbol& bottomOfTheStackSymbol); + BottomOfTheStackSymbolPushdownStoreAlphabet(alphabet::Symbol bottomOfTheStackSymbol); /** * Set bottomOfTheStack symbol. BottomOfTheStack symbol is symbol that is pushed @@ -29,9 +29,8 @@ public: * @param start new bottomOfTheStack symbol * @throws AutomatonException when symbol is not present in the stack alphabet */ - void setBottomOfTheStackSymbol(const alphabet::Symbol& start); - - + void setBottomOfTheStackSymbol(alphabet::Symbol start); + /** * @return list of start symbols */ diff --git a/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.cpp b/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.cpp index 45c35195c41bd6d36fce52852b0b6acaff2bd19d..7916625e6c595521cb5e861c78775a15470b47d8 100644 --- a/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.cpp +++ b/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.cpp @@ -16,84 +16,69 @@ const std::set<alphabet::Symbol>& CallReturnLocalInputAlphabet::getCallInputAlph return callInputAlphabet; } -bool CallReturnLocalInputAlphabet::addCallInputSymbol(const alphabet::Symbol& symbol) { +bool CallReturnLocalInputAlphabet::addCallInputSymbol(alphabet::Symbol symbol) { if(returnInputAlphabet.count(symbol)) throw exception::AlibException("Input symbol " + (std::string) symbol + " already in return alphabet"); if(localInputAlphabet.count(symbol)) throw exception::AlibException("Input symbol " + (std::string) symbol + " already in local alphabet"); - return callInputAlphabet.insert(symbol).second; + return callInputAlphabet.insert(std::move(symbol)).second; } -void CallReturnLocalInputAlphabet::setCallInputAlphabet(const std::set<alphabet::Symbol>& newSymbols) { +void CallReturnLocalInputAlphabet::setCallInputAlphabet(std::set<alphabet::Symbol> newSymbols) { std::set<alphabet::Symbol> removed; std::set_difference(callInputAlphabet.begin(), callInputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(newSymbols.begin(), newSymbols.end(), callInputAlphabet.begin(), callInputAlphabet.end(), std::inserter(added, added.end())); - for(const alphabet::Symbol& removedSymbol : removed) { removeInputSymbol(removedSymbol); } - for(const alphabet::Symbol& addedSymbol : added) { - addCallInputSymbol(addedSymbol); - } + callInputAlphabet = std::move(newSymbols); } const std::set<alphabet::Symbol>& CallReturnLocalInputAlphabet::getReturnInputAlphabet() const { return returnInputAlphabet; } -bool CallReturnLocalInputAlphabet::addReturnInputSymbol(const alphabet::Symbol& symbol) { +bool CallReturnLocalInputAlphabet::addReturnInputSymbol(alphabet::Symbol symbol) { if(localInputAlphabet.count(symbol)) throw exception::AlibException("Input symbol " + (std::string) symbol + " already in local alphabet"); if(callInputAlphabet.count(symbol)) throw exception::AlibException("Input symbol " + (std::string) symbol + " already in call alphabet"); - return returnInputAlphabet.insert(symbol).second; + return returnInputAlphabet.insert(std::move(symbol)).second; } -void CallReturnLocalInputAlphabet::setReturnInputAlphabet(const std::set<alphabet::Symbol>& newSymbols) { +void CallReturnLocalInputAlphabet::setReturnInputAlphabet(std::set<alphabet::Symbol> newSymbols) { std::set<alphabet::Symbol> removed; std::set_difference(returnInputAlphabet.begin(), returnInputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(newSymbols.begin(), newSymbols.end(), returnInputAlphabet.begin(), returnInputAlphabet.end(), std::inserter(added, added.end())); - for(const alphabet::Symbol& removedSymbol : removed) { removeInputSymbol(removedSymbol); } - for(const alphabet::Symbol& addedSymbol : added) { - addReturnInputSymbol(addedSymbol); - } + returnInputAlphabet = std::move(newSymbols); } const std::set<alphabet::Symbol>& CallReturnLocalInputAlphabet::getLocalInputAlphabet() const { return localInputAlphabet; } -bool CallReturnLocalInputAlphabet::addLocalInputSymbol(const alphabet::Symbol& symbol) { +bool CallReturnLocalInputAlphabet::addLocalInputSymbol(alphabet::Symbol symbol) { if(callInputAlphabet.count(symbol)) throw exception::AlibException("Input symbol " + (std::string) symbol + " already in call alphabet"); if(returnInputAlphabet.count(symbol)) throw exception::AlibException("Input symbol " + (std::string) symbol + " already in return alphabet"); - return localInputAlphabet.insert(symbol).second; + return localInputAlphabet.insert(std::move(symbol)).second; } -void CallReturnLocalInputAlphabet::setLocalInputAlphabet(const std::set<alphabet::Symbol>& newSymbols) { +void CallReturnLocalInputAlphabet::setLocalInputAlphabet(std::set<alphabet::Symbol> newSymbols) { std::set<alphabet::Symbol> removed; std::set_difference(localInputAlphabet.begin(), localInputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(newSymbols.begin(), newSymbols.end(), localInputAlphabet.begin(), localInputAlphabet.end(), std::inserter(added, added.end())); - for(const alphabet::Symbol& removedSymbol : removed) { removeInputSymbol(removedSymbol); } - for(const alphabet::Symbol& addedSymbol : added) { - addLocalInputSymbol(addedSymbol); - } + localInputAlphabet = std::move(newSymbols); } } /* namespace automaton */ diff --git a/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.h b/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.h index 87339acbe611a2929bab910efa68cd293de73487..66e045e959aaa9fef72e087bb55b5a4348d6a752 100644 --- a/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.h +++ b/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.h @@ -28,42 +28,42 @@ public: * @param symbol Symbol to add * @throws AutomatonException when symbol already exists */ - bool addCallInputSymbol(const alphabet::Symbol& symbol); + bool addCallInputSymbol(alphabet::Symbol symbol); /** * Sets input symbols of the automaton. * @param symbols Symbols to set * @throws AutomatonException when symbol already exists */ - void setCallInputAlphabet(const std::set<alphabet::Symbol>& symbols); + void setCallInputAlphabet(std::set<alphabet::Symbol> symbols); /** * Adds input symbol to input alphabet. * @param symbol Symbol to add * @throws AutomatonException when symbol already exists */ - bool addReturnInputSymbol(const alphabet::Symbol& symbol); + bool addReturnInputSymbol(alphabet::Symbol symbol); /** * Sets input symbols of the automaton. * @param symbols Symbols to set * @throws AutomatonException when symbol already exists */ - void setReturnInputAlphabet(const std::set<alphabet::Symbol>& symbols); + void setReturnInputAlphabet(std::set<alphabet::Symbol> symbols); /** * Adds input symbol to input alphabet. * @param symbol Symbol to add * @throws AutomatonException when symbol already exists */ - bool addLocalInputSymbol(const alphabet::Symbol& symbol); + bool addLocalInputSymbol(alphabet::Symbol symbol); /** * Sets input symbols of the automaton. * @param symbols Symbols to set * @throws AutomatonException when symbol already exists */ - void setLocalInputAlphabet(const std::set<alphabet::Symbol>& symbols); + void setLocalInputAlphabet(std::set<alphabet::Symbol> symbols); /** * Removes input symbol from the input alphabet. diff --git a/alib2data/src/automaton/common/InputAlphabet.cpp b/alib2data/src/automaton/common/InputAlphabet.cpp index 0947174e75d0336852d05d390810e9cd2257fc38..8485d9485bdef170e1b20e5f2884bded44dca21a 100644 --- a/alib2data/src/automaton/common/InputAlphabet.cpp +++ b/alib2data/src/automaton/common/InputAlphabet.cpp @@ -9,6 +9,7 @@ #include <algorithm> #include "../AutomatonException.h" +#include "../../std/set.hpp" namespace automaton { @@ -16,28 +17,23 @@ const std::set<alphabet::Symbol>& InputAlphabet::getInputAlphabet() const { return inputAlphabet; } -bool InputAlphabet::addInputSymbol(const alphabet::Symbol& symbol) { - return inputAlphabet.insert(symbol).second; +bool InputAlphabet::addInputSymbol(alphabet::Symbol symbol) { + return inputAlphabet.insert(std::move(symbol)).second; } -void InputAlphabet::addInputSymbols(const std::set<alphabet::Symbol>& symbols) { - return inputAlphabet.insert(symbols.begin(), symbols.end()); +void InputAlphabet::addInputSymbols(std::set<alphabet::Symbol> symbols) { + return inputAlphabet.insert(std::make_set_move_iterator(symbols.begin()), std::make_set_move_iterator(symbols.end())); } -void InputAlphabet::setInputAlphabet(const std::set<alphabet::Symbol>& newSymbols) { +void InputAlphabet::setInputAlphabet(std::set<alphabet::Symbol> newSymbols) { std::set<alphabet::Symbol> removed; std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(newSymbols.begin(), newSymbols.end(), inputAlphabet.begin(), inputAlphabet.end(), std::inserter(added, added.end())); - for(const alphabet::Symbol& removedSymbol : removed) { removeInputSymbol(removedSymbol); } - for(const alphabet::Symbol& addedSymbol : added) { - addInputSymbol(addedSymbol); - } + inputAlphabet = std::move(newSymbols); } } /* namespace automaton */ diff --git a/alib2data/src/automaton/common/InputAlphabet.h b/alib2data/src/automaton/common/InputAlphabet.h index d1ecfd288b02494cba0ea052ec8bf354784d1742..fa331185772392322c614a5621c13ecb81db4ad9 100644 --- a/alib2data/src/automaton/common/InputAlphabet.h +++ b/alib2data/src/automaton/common/InputAlphabet.h @@ -26,21 +26,21 @@ public: * @param symbol Symbol to add * @throws AutomatonException when symbol already exists */ - bool addInputSymbol(const alphabet::Symbol& symbol); + bool addInputSymbol(alphabet::Symbol symbol); /** * Adds input symbols to input alphabet. * @param symbol Symbol to add * @throws AutomatonException when symbol already exists */ - void addInputSymbols(const std::set<alphabet::Symbol>& symbols); + void addInputSymbols(std::set<alphabet::Symbol> symbols); /** * Sets input symbols of the automaton. * @param symbols Symbols to set * @throws AutomatonException when symbol already exists */ - void setInputAlphabet(const std::set<alphabet::Symbol>& symbols); + void setInputAlphabet(std::set<alphabet::Symbol> symbols); /** * Removes input symbol from the input alphabet. diff --git a/alib2data/src/automaton/common/MultiInitialStates.cpp b/alib2data/src/automaton/common/MultiInitialStates.cpp index 4eb92235e79e77d7251621aaa9688ee2051c34e9..01503c271a435c9826606584d6e52b8eccf67adf 100644 --- a/alib2data/src/automaton/common/MultiInitialStates.cpp +++ b/alib2data/src/automaton/common/MultiInitialStates.cpp @@ -13,28 +13,27 @@ namespace automaton { -bool MultiInitialStates::addInitialState(const State& state) { - if (states.find(state) == states.end()) { +bool MultiInitialStates::addInitialState(State state) { + if (!states.count(state)) { throw AutomatonException("State " + (std::string) state.getName() + " cannot be set as initial state. It is not present in the automaton."); } - return initialStates.insert(state).second; + return initialStates.insert(std::move(state)).second; } -void MultiInitialStates::setInitialStates(const std::set<State>& newStates) { +void MultiInitialStates::setInitialStates(std::set<State> newStates) { std::set<State> removed; std::set_difference(initialStates.begin(), initialStates.end(), newStates.begin(), newStates.end(), std::inserter(removed, removed.end())); - std::set<State> added; - std::set_difference(newStates.begin(), newStates.end(), initialStates.begin(), initialStates.end(), std::inserter(added, added.end())); - for(const State& removedState : removed) { removeInitialState(removedState); } - for(const State& addedState : added) { - addInitialState(addedState); + if(!std::includes(states.begin(), states.end(), newStates.begin(), newStates.end())) { + throw AutomatonException("State ? cannot be set as initial state. It is not present in the automaton."); } + + initialStates = std::move(newStates); } bool MultiInitialStates::removeInitialState(const State& state) { diff --git a/alib2data/src/automaton/common/MultiInitialStates.h b/alib2data/src/automaton/common/MultiInitialStates.h index 0d362d297638c23c8eeca9770ac48d508bdf0847..ddc4b843ead898ffab00744e299c9e931e256a6a 100644 --- a/alib2data/src/automaton/common/MultiInitialStates.h +++ b/alib2data/src/automaton/common/MultiInitialStates.h @@ -27,7 +27,7 @@ public: * @throws AutomatonException when state is not present * in the automaton or when it's already initial state */ - bool addInitialState(const State& state); + bool addInitialState(State state); /** * Sets the initial state of the automaton. @@ -35,7 +35,7 @@ public: * @throws AutomatonException when state is not present * in the automaton or when it's already initial state */ - void setInitialStates(const std::set<State>& states); + void setInitialStates(std::set<State> states); /** * Removes the state from the initial states. diff --git a/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.cpp b/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.cpp index 69b57ac5e0656558afcd61275d33060723030eac..f153c5d2720175695a5e55e52ba625402897fc27 100644 --- a/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.cpp +++ b/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.cpp @@ -11,25 +11,24 @@ namespace automaton { -bool MultiInitialSymbolsPushdownStoreAlphabet::addInitialSymbol(const alphabet::Symbol& start) { - if (stackAlphabet.find(start) == stackAlphabet.end()) { - throw AutomatonException("Stack symbol \"" + (std::string) start + "\" doesn't exist."); +bool MultiInitialSymbolsPushdownStoreAlphabet::addInitialSymbol(alphabet::Symbol start) { + if (!stackAlphabet.count(start)) { + throw AutomatonException("Initial symbol \"" + (std::string) start + "\" not in a pushdown store alphabet."); } - - return this->initialSymbols.insert(start).second; + + return this->initialSymbols.insert(std::move(start)).second; } bool MultiInitialSymbolsPushdownStoreAlphabet::removeInitialSymbol(const alphabet::Symbol& start) { return this->initialSymbols.erase(start); } -void MultiInitialSymbolsPushdownStoreAlphabet::setInitialSymbols(const std::set<alphabet::Symbol>& symbols) { - std::set<alphabet::Symbol> tmp; - std::set_difference(symbols.begin(), symbols.end(), this->stackAlphabet.begin(), this->stackAlphabet.end(), std::inserter(tmp, tmp.end())); - if(tmp.size() != 0) - throw AutomatonException("Initial symbols not in stack alphabet"); - - this->initialSymbols = symbols; +void MultiInitialSymbolsPushdownStoreAlphabet::setInitialSymbols(std::set<alphabet::Symbol> symbols) { + if(!std::includes(stackAlphabet.begin(), stackAlphabet.end(), symbols.begin(), symbols.end())) { + throw AutomatonException("Initial symbol ? not in a pushdown store alphabet."); + } + + this->initialSymbols = std::move(symbols); } const std::set<alphabet::Symbol>& MultiInitialSymbolsPushdownStoreAlphabet::getInitialSymbols() const { diff --git a/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.h b/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.h index e9b42c858c3b1af4ad5f9630eefc4d63976152ed..d229236c12fd2040307f1bd2ebb3492ec88ec166 100644 --- a/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.h +++ b/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.h @@ -27,9 +27,8 @@ public: * @param start new initial symbol * @throws AutomatonException when symbol is not present in the stack alphabet or it is already in the set */ - bool addInitialSymbol(const alphabet::Symbol& start); - - + bool addInitialSymbol(alphabet::Symbol start); + /** * Adds initial symbol. Initial symbols are symbols that are pushed * to the stack when MultiInitialSymbols is created. @@ -37,14 +36,14 @@ public: * @throws AutomatonException when symbol is not present in the set of initial symbols */ bool removeInitialSymbol(const alphabet::Symbol& start); - + /** * Sets initial symbols. Initial symbols are symbols that are pushed * to the stack when MultiInitialSymbols is created. * @param symbols new initial symbols * @throws AutomatonException when any of symbols is not present in the stack alphabet */ - void setInitialSymbols(const std::set<alphabet::Symbol>& symbols); + void setInitialSymbols(std::set<alphabet::Symbol> symbols); /** * @return list of start symbols diff --git a/alib2data/src/automaton/common/PushdownStoreAlphabet.cpp b/alib2data/src/automaton/common/PushdownStoreAlphabet.cpp index fcaf225f3b1f2102ac1f5c074a329ffc64576654..cbf73b370445a45d3fe0686e5c4e53cd5788f005 100644 --- a/alib2data/src/automaton/common/PushdownStoreAlphabet.cpp +++ b/alib2data/src/automaton/common/PushdownStoreAlphabet.cpp @@ -11,24 +11,19 @@ namespace automaton { -bool PushdownStoreAlphabet::addStackSymbol(const alphabet::Symbol& symbol) { +bool PushdownStoreAlphabet::addStackSymbol(alphabet::Symbol symbol) { return stackAlphabet.insert(symbol).second; } -void PushdownStoreAlphabet::setStackAlphabet(const std::set<alphabet::Symbol>& newSymbols) { +void PushdownStoreAlphabet::setStackAlphabet(std::set<alphabet::Symbol> newSymbols) { std::set<alphabet::Symbol> removed; std::set_difference(stackAlphabet.begin(), stackAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(newSymbols.begin(), newSymbols.end(), stackAlphabet.begin(), stackAlphabet.end(), std::inserter(added, added.end())); - for(const alphabet::Symbol& removedSymbol : removed) { removeStackSymbol(removedSymbol); } - for(const alphabet::Symbol& addedSymbol : added) { - addStackSymbol(addedSymbol); - } + stackAlphabet = std::move(newSymbols); } const std::set<alphabet::Symbol>& PushdownStoreAlphabet::getStackAlphabet() const { diff --git a/alib2data/src/automaton/common/PushdownStoreAlphabet.h b/alib2data/src/automaton/common/PushdownStoreAlphabet.h index 3207df3d457ccf83fa097704870ab7d4e779d5a4..98536964be351be7e49cccbef453712dfba97f32 100644 --- a/alib2data/src/automaton/common/PushdownStoreAlphabet.h +++ b/alib2data/src/automaton/common/PushdownStoreAlphabet.h @@ -25,14 +25,14 @@ public: * @param symbol Symbol to add * @throws AutomatonException when symbol is already present in stack alphabet */ - bool addStackSymbol(const alphabet::Symbol& symbol); + bool addStackSymbol(alphabet::Symbol symbol); /** * Sets stack symbols of the automaton. * @param symbols Symbols to set * @throws AutomatonException when symbol is already present in stack alphabet */ - void setStackAlphabet(const std::set<alphabet::Symbol>& symbols); + void setStackAlphabet(std::set<alphabet::Symbol> symbols); /** * Removes symbol from the stack alphabet. diff --git a/alib2data/src/automaton/common/SingleInitialState.cpp b/alib2data/src/automaton/common/SingleInitialState.cpp index 2c8ec4997d7c19fcfc080560cee43279688e70a4..670d0bfceb0e91c540807281e07c44ce5a3a82f3 100644 --- a/alib2data/src/automaton/common/SingleInitialState.cpp +++ b/alib2data/src/automaton/common/SingleInitialState.cpp @@ -11,16 +11,16 @@ namespace automaton { -SingleInitialState::SingleInitialState(const State& initialState) : initialState(initialState) { - addState(initialState); +SingleInitialState::SingleInitialState(State initialState) : initialState(initialState) { + addState(std::move(initialState)); } -void SingleInitialState::setInitialState(const State& state) { - if (states.find(state) == states.end()) { +void SingleInitialState::setInitialState(State state) { + if (!states.count(state)) { throw AutomatonException("State " + (std::string) state.getName() + " cannot be set as initial state. It is not present in the automaton."); } - initialState = state; + initialState = std::move(state); } const State& SingleInitialState::getInitialState() const { diff --git a/alib2data/src/automaton/common/SingleInitialState.h b/alib2data/src/automaton/common/SingleInitialState.h index 27a63e87b2a491f6e94503ab55764bc0b307306f..c4d80262c0f11705a4d4fffd09a2e9f8102db912 100644 --- a/alib2data/src/automaton/common/SingleInitialState.h +++ b/alib2data/src/automaton/common/SingleInitialState.h @@ -20,7 +20,7 @@ class SingleInitialState : public States { protected: State initialState; public: - SingleInitialState(const State& initialState); + SingleInitialState(State initialState); /** * Set the initial state. @@ -28,7 +28,7 @@ public: * @throws AutomatonException when state is not present * in the automaton */ - void setInitialState(const State& state); + void setInitialState(State state); /** * @return initial state diff --git a/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.cpp b/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.cpp index 8bc55e1ec8c72cdc3c00406e76fafb030e902521..0b4a0275458eb9cf3e36612f2e92f29fd2ddd975 100644 --- a/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.cpp +++ b/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.cpp @@ -11,16 +11,16 @@ namespace automaton { -SingleInitialSymbolPushdownStoreAlphabet::SingleInitialSymbolPushdownStoreAlphabet(const alphabet::Symbol& initialSymbol) : initialSymbol(initialSymbol) { - addStackSymbol(initialSymbol); +SingleInitialSymbolPushdownStoreAlphabet::SingleInitialSymbolPushdownStoreAlphabet(alphabet::Symbol initialSymbol) : initialSymbol(initialSymbol) { + addStackSymbol(std::move(initialSymbol)); } -void SingleInitialSymbolPushdownStoreAlphabet::setInitialSymbol(const alphabet::Symbol& start) { - if (stackAlphabet.find(start) == stackAlphabet.end()) { +void SingleInitialSymbolPushdownStoreAlphabet::setInitialSymbol(alphabet::Symbol start) { + if (!stackAlphabet.count(start)) { throw AutomatonException("Stack symbol \"" + (std::string) start + "\" doesn't exist."); } - - initialSymbol = start; + + initialSymbol = std::move(start); } const alphabet::Symbol& SingleInitialSymbolPushdownStoreAlphabet::getInitialSymbol() const { diff --git a/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.h b/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.h index 4f3afc748095dcbe77ab94aecf50c65294a8f737..ddb005243849b057461cf094be3fad84e75f2484 100644 --- a/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.h +++ b/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.h @@ -21,7 +21,7 @@ class SingleInitialSymbolPushdownStoreAlphabet : public PushdownStoreAlphabet { protected: alphabet::Symbol initialSymbol; public: - SingleInitialSymbolPushdownStoreAlphabet(const alphabet::Symbol& initialSymbol); + SingleInitialSymbolPushdownStoreAlphabet(alphabet::Symbol initialSymbol); /** * Set initial symbol. Initial symbol is symbol that is pushed @@ -29,9 +29,8 @@ public: * @param start new initial symbol * @throws AutomatonException when symbol is not present in the stack alphabet */ - void setInitialSymbol(const alphabet::Symbol& start); - - + void setInitialSymbol(alphabet::Symbol start); + /** * @return list of start symbols */ diff --git a/alib2data/src/automaton/common/State.cpp b/alib2data/src/automaton/common/State.cpp index cb8eeee944e850fbf50b317b977c739fd273a2ca..08252325e1d0e1a89f69c03b3d2ee534fb84220e 100644 --- a/alib2data/src/automaton/common/State.cpp +++ b/alib2data/src/automaton/common/State.cpp @@ -10,10 +10,7 @@ namespace automaton { -State::State(const label::Label& name) : name(name) { -} - -State::State(label::Label&& name) : name(std::move(name)) { +State::State(label::Label name) : name(std::move(name)) { } State::State(int number) : name(label::labelFrom(number)) { @@ -25,7 +22,7 @@ State::State(int number1, int number2) : name(label::labelFrom(number1, number2) State::State(char character) : name(label::labelFrom(character)) { } -State::State(const std::string& name) : name(label::labelFrom(name)) { +State::State(std::string name) : name(label::labelFrom(std::move(name))) { } State::State(const char* name) : State((std::string) name) { diff --git a/alib2data/src/automaton/common/State.h b/alib2data/src/automaton/common/State.h index c2fc2c8c95e5546ce0dd03c435e3ce3b28792d47..078060ce4aaf4645fdf711da644d527d46084f87 100644 --- a/alib2data/src/automaton/common/State.h +++ b/alib2data/src/automaton/common/State.h @@ -22,12 +22,11 @@ class State { private: label::Label name; public: - explicit State(const label::Label& name); - explicit State(label::Label&& name); + explicit State(label::Label name); explicit State(int number); explicit State(int number1, int number2); explicit State(char character); - explicit State(const std::string& name); + explicit State(std::string name); explicit State(const char* name); const label::Label& getName() const; diff --git a/alib2data/src/automaton/common/States.cpp b/alib2data/src/automaton/common/States.cpp index 7b2a25845841a19a2987907bfaa8f685430177eb..94c3d9d9fd3f1ca5984fbfc6c7c14d4e286fa891 100644 --- a/alib2data/src/automaton/common/States.cpp +++ b/alib2data/src/automaton/common/States.cpp @@ -12,56 +12,46 @@ namespace automaton { -States::~States() { - -} - -bool States::addState(const State& state) { - return states.insert(state).second; +bool States::addState(State state) { + return states.insert(std::move(state)).second; } -void States::setStates(const std::set<State>& newStates) { +void States::setStates(std::set<State> newStates) { std::set<State> removed; std::set_difference(states.begin(), states.end(), newStates.begin(), newStates.end(), std::inserter(removed, removed.end())); - std::set<State> added; - std::set_difference(newStates.begin(), newStates.end(), states.begin(), states.end(), std::inserter(added, added.end())); - for(const State& removedState : removed) { removeState(removedState); } - for(const State& addedState : added) { - addState(addedState); - } + states = std::move(newStates); } const std::set<State>& States::getStates() const { return states; } -bool States::addFinalState(const State& state) { - if (states.find(state) == states.end()) { +bool States::addFinalState(State state) { + if (!states.count(state)) { throw AutomatonException("State " + (std::string) state.getName() + " cannot be set as final state. It is not present in the automaton."); } - return finalStates.insert(state).second; + return finalStates.insert(std::move(state)).second; } -void States::setFinalStates(const std::set<State>& newFinalStates) { +void States::setFinalStates(std::set<State> newStates) { std::set<State> removed; - std::set_difference(finalStates.begin(), finalStates.end(), newFinalStates.begin(), newFinalStates.end(), std::inserter(removed, removed.end())); + std::set_difference(finalStates.begin(), finalStates.end(), newStates.begin(), newStates.end(), std::inserter(removed, removed.end())); - std::set<State> added; - std::set_difference(newFinalStates.begin(), newFinalStates.end(), finalStates.begin(), finalStates.end(), std::inserter(added, added.end())); - for(const State& removedState : removed) { removeFinalState(removedState); } - for(const State& addedState : added) { - addFinalState(addedState); + if(!std::includes(states.begin(), states.end(), newStates.begin(), newStates.end())) { + throw AutomatonException("State ? cannot be set as final state. It is not present in the automaton."); } + + finalStates = std::move(newStates); } bool States::removeFinalState(const State& state) { diff --git a/alib2data/src/automaton/common/States.h b/alib2data/src/automaton/common/States.h index 57c1572dada2dfded94c1e615ae67c3986d19bd7..f5a2ad872297b9901c945a189a3f4341e84b8ff9 100644 --- a/alib2data/src/automaton/common/States.h +++ b/alib2data/src/automaton/common/States.h @@ -24,21 +24,19 @@ protected: std::set<State> states; std::set<State> finalStates; public: - virtual ~States() noexcept; - /** * Adds new state to the automaton. * @param state State to add * @throws AutomatonException when state already exist in the automaton */ - bool addState(const State& state); + bool addState(State state); /** * Sets new states of the automaton. * @param states States to set * @throws AutomatonException when state already exist in the automaton */ - void setStates(const std::set<State>& states); + void setStates(std::set<State> states); /** * Removes the state from the automaton. @@ -59,7 +57,7 @@ public: * @throws AutomatonException when state is not present * in the automaton or when it's already final state */ - bool addFinalState(const State& state); + bool addFinalState(State state); /** * sets the final states of the automaton. @@ -67,7 +65,7 @@ public: * @throws AutomatonException when state is not present * in the automaton or when it's already final state */ - void setFinalStates(const std::set<State>& state); + void setFinalStates(std::set<State> state); /** * Removes the state from the final states. diff --git a/alib2data/src/container/ObjectsPair.cpp b/alib2data/src/container/ObjectsPair.cpp index 71dbd5b95f6ca2740198db453d9638fa3da8f07b..0fa960ff2d300d693bcae055ca1a83fca8e8a36f 100644 --- a/alib2data/src/container/ObjectsPair.cpp +++ b/alib2data/src/container/ObjectsPair.cpp @@ -14,7 +14,7 @@ namespace container { -ObjectsPair::ObjectsPair(const alib::Object& first, const alib::Object& second) : std::pair<alib::Object, alib::Object>(first, second) { +ObjectsPair::ObjectsPair(alib::Object first, alib::Object second) : std::pair<alib::Object, alib::Object>(std::move(first), std::move(second)) { } diff --git a/alib2data/src/container/ObjectsPair.h b/alib2data/src/container/ObjectsPair.h index e6a0dbb77c08671366dca81480615530152ed476..6fbfa24c82bdd5ba065ba259311279318e6cca72 100644 --- a/alib2data/src/container/ObjectsPair.h +++ b/alib2data/src/container/ObjectsPair.h @@ -22,10 +22,10 @@ namespace container { */ class ObjectsPair : public std::pair<alib::Object, alib::Object>, public std::acceptor<ObjectsPair, VisitableContainerBase, std::acceptor<ObjectsPair, alib::VisitableObjectBase, ContainerBase> > { public: - explicit ObjectsPair(const alib::Object& first, const alib::Object& second); + explicit ObjectsPair(alib::Object first, alib::Object second); virtual ContainerBase* clone() const; - + virtual ContainerBase* plunder() &&; virtual int compare(const ObjectBase& other) const { diff --git a/alib2data/src/grammar/ContextFree/CFG.cpp b/alib2data/src/grammar/ContextFree/CFG.cpp index 2117024e3e00e88787b0e85c2d32fdd559277a9b..d29574b51499da1806ed94240a8f7aacfe9bdef1 100644 --- a/alib2data/src/grammar/ContextFree/CFG.cpp +++ b/alib2data/src/grammar/ContextFree/CFG.cpp @@ -14,13 +14,13 @@ namespace grammar { -CFG::CFG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { +CFG::CFG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { } -CFG::CFG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +CFG::CFG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* CFG::clone() const { @@ -58,23 +58,23 @@ bool CFG::removeNonterminalSymbol(const alphabet::Symbol& symbol) { return nonterminalAlphabet.erase(symbol); } -bool CFG::addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool CFG::addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { if(!nonterminalAlphabet.count(leftHandSide)) throw GrammarException("Rule must rewrite nonterminal symbol"); for(const alphabet::Symbol& symbol : rightHandSide) - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } const std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> & CFG::getRules() const { return rules; } -bool CFG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { - return addRule(leftHandSide, rightHandSide); +bool CFG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { + return addRule(std::move(leftHandSide), std::move(rightHandSide)); } std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> CFG::getRawRules() const { diff --git a/alib2data/src/grammar/ContextFree/CFG.h b/alib2data/src/grammar/ContextFree/CFG.h index a9611d56f50683a510cd190ca373446ee4d7d27a..a974c1b2f99634fd6c545bbb29103a9c905a7bd3 100644 --- a/alib2data/src/grammar/ContextFree/CFG.h +++ b/alib2data/src/grammar/ContextFree/CFG.h @@ -23,21 +23,21 @@ class CFG : public std::acceptor<CFG, VisitableGrammarBase, std::acceptor<CFG, a std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> rules; public: - explicit CFG(const alphabet::Symbol& initialSymbol); + explicit CFG(alphabet::Symbol initialSymbol); - explicit CFG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit CFG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); const std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> & getRules() const; bool removeRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); - bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const; diff --git a/alib2data/src/grammar/ContextFree/CNF.cpp b/alib2data/src/grammar/ContextFree/CNF.cpp index 81327a8d846d6347a8aae1dddeb3a094e75972ec..a25118884c67900d0f6f13097f2e20dfb392d25c 100644 --- a/alib2data/src/grammar/ContextFree/CNF.cpp +++ b/alib2data/src/grammar/ContextFree/CNF.cpp @@ -14,13 +14,13 @@ namespace grammar { -CNF::CNF(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { +CNF::CNF(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) { } -CNF::CNF(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +CNF::CNF(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* CNF::clone() const { @@ -58,7 +58,7 @@ bool CNF::removeNonterminalSymbol(const alphabet::Symbol& symbol) { return nonterminalAlphabet.erase(symbol); } -bool CNF::addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide) { +bool CNF::addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide) { if(rightHandSide.is<alphabet::Symbol>()) { if(!nonterminalAlphabet.count(leftHandSide)) throw GrammarException("Rule must rewrite nonterminal symbol"); @@ -66,7 +66,7 @@ bool CNF::addRule(const alphabet::Symbol& leftHandSide, const std::variant<alpha if(!terminalAlphabet.count(rightHandSide.get<alphabet::Symbol>())) throw GrammarException("Rule must rewrite to terminal symbol"); - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } else { const std::pair<alphabet::Symbol, alphabet::Symbol> rhs = rightHandSide.get<std::pair<alphabet::Symbol, alphabet::Symbol>>(); @@ -79,18 +79,18 @@ bool CNF::addRule(const alphabet::Symbol& leftHandSide, const std::variant<alpha if(nonterminalAlphabet.find(rhs.second) == nonterminalAlphabet.end()) throw GrammarException("Symbol \"" + (std::string) rhs.second + "\" is not a nonterminal symbol"); - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } } -bool CNF::addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide) { - std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool CNF::addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide) { + std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } -bool CNF::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide) { - std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool CNF::addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide) { + std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } const std::map<alphabet::Symbol, std::set<std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>>> & CNF::getRules() const { @@ -111,16 +111,16 @@ bool CNF::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alpha return removeRule(leftHandSide, rhs); } -bool CNF::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool CNF::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { if(rightHandSide.size() == 0) { if(leftHandSide != initialSymbol) throw exception::AlibException("Illegal left hand side of epsilon rule"); bool res = getGeneratesEpsilon(); setGeneratesEpsilon(true); return !res; } else if(rightHandSide.size() == 1) { - return addRule(leftHandSide, rightHandSide[0]); + return addRule(std::move(leftHandSide), std::move(rightHandSide[0])); } else if(rightHandSide.size() == 2) { - return addRule(leftHandSide, std::make_pair(rightHandSide[0], rightHandSide[1])); + return addRule(std::move(leftHandSide), std::make_pair(std::move(rightHandSide[0]), std::move(rightHandSide[1]))); } else { throw exception::AlibException("Invalid right hand side"); } diff --git a/alib2data/src/grammar/ContextFree/CNF.h b/alib2data/src/grammar/ContextFree/CNF.h index 2f807a66590a295d459c2f8f4d5217436426b9d0..8f0ac76232716aec188d344cead8a4369431620d 100644 --- a/alib2data/src/grammar/ContextFree/CNF.h +++ b/alib2data/src/grammar/ContextFree/CNF.h @@ -25,17 +25,17 @@ class CNF : public std::acceptor<CNF, VisitableGrammarBase, std::acceptor<CNF, a bool generatesEpsilon; public: - explicit CNF(const alphabet::Symbol& initialSymbol); + explicit CNF(alphabet::Symbol initialSymbol); - explicit CNF(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit CNF(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide); - bool addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide); - bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide); const std::map<alphabet::Symbol, std::set<std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>>> & getRules() const; @@ -43,7 +43,7 @@ public: bool removeRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide); bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide); - bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const; diff --git a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp index 3c725e87b1304fb1c5f924b84a144de9dedb4ebc..bcebe12a7e87eb1d01ef1e6fc554407185e0be5a 100644 --- a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp +++ b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp @@ -14,13 +14,13 @@ namespace grammar { -EpsilonFreeCFG::EpsilonFreeCFG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { +EpsilonFreeCFG::EpsilonFreeCFG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { } -EpsilonFreeCFG::EpsilonFreeCFG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +EpsilonFreeCFG::EpsilonFreeCFG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* EpsilonFreeCFG::clone() const { @@ -58,7 +58,7 @@ bool EpsilonFreeCFG::removeNonterminalSymbol(const alphabet::Symbol& symbol) { return nonterminalAlphabet.erase(symbol); } -bool EpsilonFreeCFG::addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool EpsilonFreeCFG::addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { int rSize = rightHandSide.size(); if(rSize == 0) { @@ -68,11 +68,11 @@ bool EpsilonFreeCFG::addRule(const alphabet::Symbol& leftHandSide, const std::ve throw GrammarException("Rule must rewrite nonterminal symbol"); for(const alphabet::Symbol& symbol : rightHandSide) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); } - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } } @@ -84,14 +84,14 @@ bool EpsilonFreeCFG::removeRule(const alphabet::Symbol& leftHandSide, const std: return rules[leftHandSide].erase(rightHandSide); } -bool EpsilonFreeCFG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool EpsilonFreeCFG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { if(rightHandSide.size() == 0) { if(leftHandSide != initialSymbol) throw exception::AlibException("Illegal left hand side of epsilon rule"); bool res = getGeneratesEpsilon(); setGeneratesEpsilon(true); return !res; } else { - return addRule(leftHandSide, rightHandSide); + return addRule(std::move(leftHandSide), std::move(rightHandSide)); } } diff --git a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h index 6166994faa7ba5cd5273edbc773cd4158eb2202a..9fafdb50e2e910c72da5f1bc16d506fe162f33ee 100644 --- a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h +++ b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h @@ -24,21 +24,21 @@ class EpsilonFreeCFG : public std::acceptor<EpsilonFreeCFG, VisitableGrammarBase bool generatesEpsilon; public: - explicit EpsilonFreeCFG(const alphabet::Symbol& initialSymbol); + explicit EpsilonFreeCFG(alphabet::Symbol initialSymbol); - explicit EpsilonFreeCFG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit EpsilonFreeCFG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); const std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> & getRules() const; bool removeRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); - bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const; diff --git a/alib2data/src/grammar/ContextFree/GNF.cpp b/alib2data/src/grammar/ContextFree/GNF.cpp index 3b6a9390dd03517ea689ce0d6666b6ed53990035..bbda9516ff9ce7305b37fc0ce5be45974f9e1483 100644 --- a/alib2data/src/grammar/ContextFree/GNF.cpp +++ b/alib2data/src/grammar/ContextFree/GNF.cpp @@ -14,13 +14,13 @@ namespace grammar { -GNF::GNF(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { +GNF::GNF(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { } -GNF::GNF(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +GNF::GNF(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* GNF::clone() const { @@ -58,7 +58,7 @@ bool GNF::removeNonterminalSymbol(const alphabet::Symbol& symbol) { return nonterminalAlphabet.erase(symbol); } -bool GNF::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >& rightHandSide) { +bool GNF::addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> > rightHandSide) { if(!nonterminalAlphabet.count(leftHandSide)) throw GrammarException("Rule must rewrite nonterminal symbol"); @@ -66,10 +66,10 @@ bool GNF::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet throw GrammarException("Rule must rewrite to terminal symbol"); for(const alphabet::Symbol& rhsNTs : rightHandSide.second) - if(nonterminalAlphabet.find(rhsNTs) == nonterminalAlphabet.end()) + if(!nonterminalAlphabet.count(rhsNTs)) throw GrammarException("Symbol \"" + (std::string) rhsNTs + "\" is not a nonterminal symbol"); - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } const std::map<alphabet::Symbol, std::set<std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >> > & GNF::getRules() const { @@ -80,16 +80,16 @@ bool GNF::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alpha return rules[leftHandSide].erase(rightHandSide); } -bool GNF::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool GNF::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { if(rightHandSide.size() == 0) { if(leftHandSide != initialSymbol) throw exception::AlibException("Illegal left hand side of epsilon rule"); bool res = getGeneratesEpsilon(); setGeneratesEpsilon(true); return !res; } else { - alphabet::Symbol first = rightHandSide[0]; - std::vector<alphabet::Symbol> rest(rightHandSide.begin() + 1, rightHandSide.end()); - return addRule(leftHandSide, std::make_pair(first, rest)); + alphabet::Symbol first = std::move(rightHandSide[0]); + std::vector<alphabet::Symbol> rest(std::make_move_iterator(rightHandSide.begin()) + 1, std::make_move_iterator(rightHandSide.end())); + return addRule(std::move(leftHandSide), std::make_pair(std::move(first), std::move(rest))); } } diff --git a/alib2data/src/grammar/ContextFree/GNF.h b/alib2data/src/grammar/ContextFree/GNF.h index 6806ea3c985d8833affb61d56b95124c09e135d0..56d14b47f2f5c5f6856ff4309af8674646e78b09 100644 --- a/alib2data/src/grammar/ContextFree/GNF.h +++ b/alib2data/src/grammar/ContextFree/GNF.h @@ -23,21 +23,21 @@ class GNF : public std::acceptor<GNF, VisitableGrammarBase, std::acceptor<GNF, a std::map<alphabet::Symbol, std::set<std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >> > rules; bool generatesEpsilon; public: - explicit GNF(const alphabet::Symbol& initialSymbol); + explicit GNF(alphabet::Symbol initialSymbol); - explicit GNF(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit GNF(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> > rightHandSide); const std::map<alphabet::Symbol, std::set<std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >> > & getRules() const; bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >& rightHandSide); - bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const; diff --git a/alib2data/src/grammar/ContextFree/LG.cpp b/alib2data/src/grammar/ContextFree/LG.cpp index 37b54205fede2dee02948619ae67b2a7206eb53c..57f77675b0951988c3e11900889952e8904d7602 100644 --- a/alib2data/src/grammar/ContextFree/LG.cpp +++ b/alib2data/src/grammar/ContextFree/LG.cpp @@ -14,13 +14,13 @@ namespace grammar { -LG::LG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { +LG::LG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { } -LG::LG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +LG::LG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* LG::clone() const { @@ -76,45 +76,45 @@ bool LG::removeNonterminalSymbol(const alphabet::Symbol& symbol) { return nonterminalAlphabet.erase(symbol); } -bool LG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> >& rightHandSide) { +bool LG::addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rightHandSide) { if(!nonterminalAlphabet.count(leftHandSide)) throw GrammarException("Rule must rewrite nonterminal symbol"); if(rightHandSide.is<std::vector<alphabet::Symbol>>()) { const std::vector<alphabet::Symbol>& rhs = rightHandSide.get<std::vector<alphabet::Symbol>>(); for(const auto & symbol : rhs ) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end()) + if(!terminalAlphabet.count(symbol)) throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol"); } - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } else { const std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>& rhs = rightHandSide.get<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>>(); for(const auto & symbol : std::get<0>(rhs) ) - if(terminalAlphabet.find(symbol) == terminalAlphabet.end()) + if(!terminalAlphabet.count(symbol)) throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol"); - if(nonterminalAlphabet.find(std::get<1>(rhs)) == nonterminalAlphabet.end()) + if(!nonterminalAlphabet.count(std::get<1>(rhs))) throw GrammarException("Symbol " + (std::string) std::get<1>(rhs) + " is not a nonterminal symbol"); for(const auto & symbol : std::get<2>(rhs) ) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end()) + if(!terminalAlphabet.count(symbol)) throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol"); } - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } } -bool LG::addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { - std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool LG::addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { + std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } -bool LG::addRule(const alphabet::Symbol& leftHandSide, const std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide) { - std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool LG::addRule(alphabet::Symbol leftHandSide, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> rightHandSide) { + std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> >> > & LG::getRules() const { @@ -135,8 +135,8 @@ bool LG::removeRule(const alphabet::Symbol& leftHandSide, const std::tuple<std:: return removeRule(leftHandSide, rhs); } -bool LG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { - std::vector<alphabet::Symbol>::const_iterator nonterminalPosition = rightHandSide.begin(); +bool LG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { + std::vector<alphabet::Symbol>::iterator nonterminalPosition = rightHandSide.begin(); for(; nonterminalPosition != rightHandSide.end(); nonterminalPosition++) { if(nonterminalAlphabet.count(*nonterminalPosition)) break; } @@ -144,7 +144,7 @@ bool LG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alph if(nonterminalPosition == rightHandSide.end()) { return addRule(leftHandSide, rightHandSide); } else { - return addRule(leftHandSide, std::make_tuple(std::vector<alphabet::Symbol>(rightHandSide.begin(), nonterminalPosition), *nonterminalPosition, std::vector<alphabet::Symbol>(nonterminalPosition + 1, rightHandSide.end()))); + return addRule(leftHandSide, std::make_tuple(std::vector<alphabet::Symbol>(std::make_move_iterator(rightHandSide.begin()), std::make_move_iterator(nonterminalPosition)), std::move(*nonterminalPosition), std::vector<alphabet::Symbol>(std::make_move_iterator(nonterminalPosition) + 1, std::make_move_iterator(rightHandSide.end())))); } } diff --git a/alib2data/src/grammar/ContextFree/LG.h b/alib2data/src/grammar/ContextFree/LG.h index 0f5fd6fd39e9759cb1d378b7dcd41926af43e3af..e8300c5b67fb557055d5d8e8a06a046752bdf1e7 100644 --- a/alib2data/src/grammar/ContextFree/LG.h +++ b/alib2data/src/grammar/ContextFree/LG.h @@ -24,17 +24,17 @@ namespace grammar { class LG : public std::acceptor<LG, VisitableGrammarBase, std::acceptor<LG, alib::VisitableObjectBase, GrammarBase> >, public TerminalNonterminalAlphabetInitialSymbol { std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> >> > rules; public: - explicit LG(const alphabet::Symbol& initialSymbol); + explicit LG(alphabet::Symbol initialSymbol); - explicit LG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit LG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> >& rightHandSide); - bool addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); - bool addRule(const alphabet::Symbol& leftHandSide, const std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> rightHandSide); const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> >> > & getRules() const; @@ -42,7 +42,7 @@ public: bool removeRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); bool removeRule(const alphabet::Symbol& leftHandSide, const std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide); - bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const; diff --git a/alib2data/src/grammar/ContextSensitive/CSG.cpp b/alib2data/src/grammar/ContextSensitive/CSG.cpp index fac3fd86daadd13a41fc6a7589fb80377cbf27cc..f036943d62026205a08df64f9a19a9bc3d4806b9 100644 --- a/alib2data/src/grammar/ContextSensitive/CSG.cpp +++ b/alib2data/src/grammar/ContextSensitive/CSG.cpp @@ -15,13 +15,13 @@ namespace grammar { -CSG::CSG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { +CSG::CSG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) { } -CSG::CSG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +CSG::CSG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* CSG::clone() const { @@ -75,14 +75,14 @@ bool CSG::removeNonterminalSymbol(const alphabet::Symbol& symbol) { return nonterminalAlphabet.erase(symbol); } -bool CSG::addRule(const std::vector<alphabet::Symbol>& lContext, const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rContext, const std::vector<alphabet::Symbol>& rightHandSide) { +bool CSG::addRule(std::vector<alphabet::Symbol> lContext, alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rContext, std::vector<alphabet::Symbol> rightHandSide) { int rSize = rightHandSide.size(); if(rSize == 0) { throw GrammarException("Epsilon rule is not allowed"); } else { for(const alphabet::Symbol& symbol : lContext) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); } @@ -90,16 +90,16 @@ bool CSG::addRule(const std::vector<alphabet::Symbol>& lContext, const alphabet: throw GrammarException("Rule must rewrite nonterminal symbol"); for(const alphabet::Symbol& symbol : rContext) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); } for(const alphabet::Symbol& symbol : rightHandSide) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); } - return rules[make_tuple(lContext, leftHandSide, rContext)].insert(rightHandSide).second; + return rules[make_tuple(std::move(lContext), std::move(leftHandSide), std::move(rContext))].insert(std::move(rightHandSide)).second; } } diff --git a/alib2data/src/grammar/ContextSensitive/CSG.h b/alib2data/src/grammar/ContextSensitive/CSG.h index 52b5b20735fec6cffb6fad2a6a8653e5d0656542..733b96d7ceea06d673f20972d822565c24d77d55 100644 --- a/alib2data/src/grammar/ContextSensitive/CSG.h +++ b/alib2data/src/grammar/ContextSensitive/CSG.h @@ -23,15 +23,15 @@ class CSG : public std::acceptor<CSG, VisitableGrammarBase, std::acceptor<CSG, a bool generatesEpsilon; public: - explicit CSG(const alphabet::Symbol& initialSymbol); + explicit CSG(alphabet::Symbol initialSymbol); - explicit CSG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit CSG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const std::vector<alphabet::Symbol>& lContext, const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rContext, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRule(std::vector<alphabet::Symbol> lContext, alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rContext, std::vector<alphabet::Symbol> rightHandSide); const std::map<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>, std::set<std::vector<alphabet::Symbol>>> & getRules() const; diff --git a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp index e7859f562db36804b9b04d5bd05c7c49001abd2f..143a423ba0bccdf9019b387c5a0c8b81cb892899 100644 --- a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp +++ b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp @@ -15,13 +15,13 @@ namespace grammar { -NonContractingGrammar::NonContractingGrammar(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { +NonContractingGrammar::NonContractingGrammar(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { } -NonContractingGrammar::NonContractingGrammar(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +NonContractingGrammar::NonContractingGrammar(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* NonContractingGrammar::clone() const { @@ -62,7 +62,7 @@ bool NonContractingGrammar::removeNonterminalSymbol(const alphabet::Symbol& symb return nonterminalAlphabet.erase(symbol); } -bool NonContractingGrammar::addRule(const std::vector<alphabet::Symbol>& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool NonContractingGrammar::addRule(std::vector<alphabet::Symbol> leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { int lSize = leftHandSide.size(); int rSize = rightHandSide.size(); @@ -73,15 +73,15 @@ bool NonContractingGrammar::addRule(const std::vector<alphabet::Symbol>& leftHan throw GrammarException("Rule must rewrite nonterminal symbol"); for(const alphabet::Symbol& symbol : leftHandSide) - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); for(const alphabet::Symbol& symbol : rightHandSide) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); } - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } const std::map<std::vector<alphabet::Symbol>, std::set<std::vector<alphabet::Symbol>>> & NonContractingGrammar::getRules() const { diff --git a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h index 66f957e5f4a3729571daf4dbc0f75c7f752b0a6e..c51da8e2cd5a42535705962ddff9b6484b80153a 100644 --- a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h +++ b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h @@ -23,15 +23,15 @@ class NonContractingGrammar : public std::acceptor<NonContractingGrammar, Visita bool generatesEpsilon; public: - explicit NonContractingGrammar(const alphabet::Symbol& initialSymbol); + explicit NonContractingGrammar(alphabet::Symbol initialSymbol); - explicit NonContractingGrammar(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit NonContractingGrammar(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const std::vector<alphabet::Symbol>& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRule(std::vector<alphabet::Symbol> leftHandSide, std::vector<alphabet::Symbol> rightHandSide); const std::map<std::vector<alphabet::Symbol>, std::set<std::vector<alphabet::Symbol>>> & getRules() const; diff --git a/alib2data/src/grammar/Regular/LeftLG.cpp b/alib2data/src/grammar/Regular/LeftLG.cpp index 7ba497ebfc5b195f088dd4bddde46689f2c9f0ee..34f3ea41cca5923a691935edc30fb07b7aaa3120 100644 --- a/alib2data/src/grammar/Regular/LeftLG.cpp +++ b/alib2data/src/grammar/Regular/LeftLG.cpp @@ -15,13 +15,13 @@ namespace grammar { -LeftLG::LeftLG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { +LeftLG::LeftLG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { } -LeftLG::LeftLG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +LeftLG::LeftLG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* LeftLG::clone() const { @@ -72,41 +72,41 @@ bool LeftLG::removeNonterminalSymbol(const alphabet::Symbol& symbol) { return nonterminalAlphabet.erase(symbol); } -bool LeftLG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> >& rightHandSide) { +bool LeftLG::addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rightHandSide) { if(!nonterminalAlphabet.count(leftHandSide)) throw GrammarException("Rule must rewrite nonterminal symbol"); if(rightHandSide.is<std::vector<alphabet::Symbol>>()) { const std::vector<alphabet::Symbol>& rhs = rightHandSide.get<std::vector<alphabet::Symbol>>(); for(const auto & symbol : rhs ) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end()) + if(!terminalAlphabet.count(symbol)) throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol"); } - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } else { const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>& rhs = rightHandSide.get<std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>>(); - if(nonterminalAlphabet.find(rhs.first) == nonterminalAlphabet.end()) + if(!nonterminalAlphabet.count(rhs.first)) throw GrammarException("Symbol " + (std::string) rhs.first + " is not a nonterminal symbol"); for(const auto & symbol : rhs.second ) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end()) + if(!terminalAlphabet.count(symbol)) throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol"); } - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } } -bool LeftLG::addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { - std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool LeftLG::addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { + std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } -bool LeftLG::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide) { - std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool LeftLG::addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> rightHandSide) { + std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> >> > & LeftLG::getRules() const { @@ -127,13 +127,13 @@ bool LeftLG::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<al return removeRule(leftHandSide, rhs); } -bool LeftLG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool LeftLG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { if(rightHandSide.size() == 0) { - return addRule(leftHandSide, rightHandSide); + return addRule(std::move(leftHandSide), std::move(rightHandSide)); } else if(nonterminalAlphabet.count(rightHandSide[0])) { - return addRule(leftHandSide, std::make_pair(rightHandSide[0], std::vector<alphabet::Symbol>(rightHandSide.begin() + 1, rightHandSide.end()))); + return addRule(std::move(leftHandSide), std::make_pair(std::move(rightHandSide[0]), std::vector<alphabet::Symbol>(std::make_move_iterator(rightHandSide.begin()), std::make_move_iterator(rightHandSide.end())))); } else { - return addRule(leftHandSide, rightHandSide); + return addRule(std::move(leftHandSide), std::move(rightHandSide)); } } diff --git a/alib2data/src/grammar/Regular/LeftLG.h b/alib2data/src/grammar/Regular/LeftLG.h index 6998aca04c5807b95e7fa4843766ebc70d944697..187228f9b06b81486b2282a6e96b296061257b3d 100644 --- a/alib2data/src/grammar/Regular/LeftLG.h +++ b/alib2data/src/grammar/Regular/LeftLG.h @@ -23,17 +23,17 @@ class LeftLG : public std::acceptor<LeftLG, VisitableGrammarBase, std::acceptor< std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> >> > rules; public: - explicit LeftLG(const alphabet::Symbol& initialSymbol); + explicit LeftLG(alphabet::Symbol initialSymbol); - explicit LeftLG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit LeftLG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> >& rightHandSide); - bool addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); - bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> rightHandSide); const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> >> > & getRules() const; @@ -41,7 +41,7 @@ public: bool removeRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide); - bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const; diff --git a/alib2data/src/grammar/Regular/LeftRG.cpp b/alib2data/src/grammar/Regular/LeftRG.cpp index e2d812c9cbcca3be14a2c6961480599c88bc2180..d0b7c723f0ec93fde44518596b418af7885675c8 100644 --- a/alib2data/src/grammar/Regular/LeftRG.cpp +++ b/alib2data/src/grammar/Regular/LeftRG.cpp @@ -15,13 +15,13 @@ namespace grammar { -LeftRG::LeftRG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { +LeftRG::LeftRG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) { } -LeftRG::LeftRG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +LeftRG::LeftRG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* LeftRG::clone() const { @@ -59,7 +59,7 @@ bool LeftRG::removeNonterminalSymbol(const alphabet::Symbol& symbol) { return nonterminalAlphabet.erase(symbol); } -bool LeftRG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide) { +bool LeftRG::addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide) { if(!nonterminalAlphabet.count(leftHandSide)) throw GrammarException("Rule must rewrite nonterminal symbol"); @@ -69,25 +69,25 @@ bool LeftRG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<al if(!terminalAlphabet.count(rhs)) throw GrammarException("Rule must rewrite to terminal symbol"); - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } else { const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = rightHandSide.get<std::pair<alphabet::Symbol, alphabet::Symbol>>(); if(!nonterminalAlphabet.count(rhs.first) || !terminalAlphabet.count(rhs.second)) throw GrammarException("Rule must rewrite to terminal symbol followed by nonterminal symbol"); - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } } -bool LeftRG::addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide) { - std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool LeftRG::addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide) { + std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } -bool LeftRG::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide) { - std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool LeftRG::addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide) { + std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } const std::map<alphabet::Symbol, std::set<std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>>> & LeftRG::getRules() const { @@ -108,16 +108,16 @@ bool LeftRG::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<al return removeRule(leftHandSide, rhs); } -bool LeftRG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool LeftRG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { if(rightHandSide.size() == 0) { if(leftHandSide != initialSymbol) throw exception::AlibException("Illegal left hand side of epsilon rule"); bool res = getGeneratesEpsilon(); setGeneratesEpsilon(true); return res; } else if(rightHandSide.size() == 1) { - return addRule(leftHandSide, rightHandSide[0]); + return addRule(std::move(leftHandSide), std::move(rightHandSide[0])); } else if(rightHandSide.size() == 2) { - return addRule(leftHandSide, std::make_pair(rightHandSide[0], rightHandSide[1])); + return addRule(std::move(leftHandSide), std::make_pair(std::move(rightHandSide[0]), std::move(rightHandSide[1]))); } else { throw exception::AlibException("Invalid right hand side"); } diff --git a/alib2data/src/grammar/Regular/LeftRG.h b/alib2data/src/grammar/Regular/LeftRG.h index 12d46b2b2c92935d625e1b34f52adb59edac9f84..16da0c4e13ff77d9cf284d5b643e24f722fb5411 100644 --- a/alib2data/src/grammar/Regular/LeftRG.h +++ b/alib2data/src/grammar/Regular/LeftRG.h @@ -43,12 +43,12 @@ public: /** * Creates a new instance of Left regular grammar with concrete initial symbol */ - explicit LeftRG(const alphabet::Symbol& initialSymbol); + explicit LeftRG(alphabet::Symbol initialSymbol); /** * Creates a new instance of Left regular grammar with concrete nonterminal, terminal alphabet and initial symbol */ - explicit LeftRG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit LeftRG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); /** * @copydoc alib::base::clone() @@ -63,17 +63,17 @@ public: /** * Add a new rule of a grammar in form of A -> aB or A -> a, where A, B \in N and a \in T */ - bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide); /** * Add a new rule of a grammar in form of A -> a, where A \in N and a \in T */ - bool addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide); /** * Add a new rule of a grammar in form of A -> aB, where A, B \in N and a \in T */ - bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide); /** * Get rules of the grammar @@ -95,7 +95,7 @@ public: */ bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide); - bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const; diff --git a/alib2data/src/grammar/Regular/RightLG.cpp b/alib2data/src/grammar/Regular/RightLG.cpp index 6956dcaff7d352c76380c9d41492b8f13d699e9c..2adadf07fb003a29a6c0b481c4524b47110c2108 100644 --- a/alib2data/src/grammar/Regular/RightLG.cpp +++ b/alib2data/src/grammar/Regular/RightLG.cpp @@ -15,13 +15,13 @@ namespace grammar { -RightLG::RightLG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { +RightLG::RightLG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { } -RightLG::RightLG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +RightLG::RightLG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* RightLG::clone() const { @@ -72,41 +72,41 @@ bool RightLG::removeNonterminalSymbol(const alphabet::Symbol& symbol) { return nonterminalAlphabet.erase(symbol); } -bool RightLG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> >& rightHandSide) { +bool RightLG::addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rightHandSide) { if(!nonterminalAlphabet.count(leftHandSide)) throw GrammarException("Rule must rewrite nonterminal symbol"); if(rightHandSide.is<std::vector<alphabet::Symbol>>()) { const std::vector<alphabet::Symbol>& rhs = rightHandSide.get<std::vector<alphabet::Symbol>>(); for(const auto & symbol : rhs ) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end()) + if(!terminalAlphabet.count(symbol)) throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol"); } - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } else { const std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>& rhs = rightHandSide.get<std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>>(); - if(nonterminalAlphabet.find(rhs.second) == nonterminalAlphabet.end()) + if(!nonterminalAlphabet.count(rhs.second)) throw GrammarException("Symbol " + (std::string) rhs.second + " is not a nonterminal symbol"); for(const auto & symbol : rhs.first ) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end()) + if(!terminalAlphabet.count(symbol)) throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol"); } - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } } -bool RightLG::addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { - std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool RightLG::addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { + std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } -bool RightLG::addRule(const alphabet::Symbol& leftHandSide, const std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>& rightHandSide) { - std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool RightLG::addRule(alphabet::Symbol leftHandSide, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> rightHandSide) { + std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> >> > & RightLG::getRules() const { @@ -127,13 +127,13 @@ bool RightLG::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<s return removeRule(leftHandSide, rhs); } -bool RightLG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool RightLG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { if(rightHandSide.size() == 0) { - return addRule(leftHandSide, rightHandSide); + return addRule(std::move(leftHandSide), std::move(rightHandSide)); } else if(nonterminalAlphabet.count(rightHandSide[rightHandSide.size() - 1])) { - return addRule(leftHandSide, std::make_pair(std::vector<alphabet::Symbol>(rightHandSide.begin(), rightHandSide.end() - 1), rightHandSide[rightHandSide.size() - 1])); + return addRule(std::move(leftHandSide), std::make_pair(std::vector<alphabet::Symbol>(std::make_move_iterator(rightHandSide.begin()), std::make_move_iterator(rightHandSide.end()) - 1), std::move(rightHandSide[rightHandSide.size() - 1]))); } else { - return addRule(leftHandSide, rightHandSide); + return addRule(std::move(leftHandSide), std::move(rightHandSide)); } } diff --git a/alib2data/src/grammar/Regular/RightLG.h b/alib2data/src/grammar/Regular/RightLG.h index 35ca0cdca0e44045d1b4b862f3425382f1464ded..e3b5275ffbbca077a4de11e45d97a423353ccc19 100644 --- a/alib2data/src/grammar/Regular/RightLG.h +++ b/alib2data/src/grammar/Regular/RightLG.h @@ -23,17 +23,17 @@ class RightLG : public std::acceptor<RightLG, VisitableGrammarBase, std::accepto std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> >> > rules; public: - explicit RightLG(const alphabet::Symbol& initialSymbol); + explicit RightLG(alphabet::Symbol initialSymbol); - explicit RightLG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit RightLG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> >& rightHandSide); - bool addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); - bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> rightHandSide); const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> >> > & getRules() const; @@ -41,7 +41,7 @@ public: bool removeRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>& rightHandSide); - bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const; diff --git a/alib2data/src/grammar/Regular/RightRG.cpp b/alib2data/src/grammar/Regular/RightRG.cpp index b248343f50df42560e26ecda1d3e1746067dc9bf..59da54bc99f9a17963f925ccc16830fa54e202e5 100644 --- a/alib2data/src/grammar/Regular/RightRG.cpp +++ b/alib2data/src/grammar/Regular/RightRG.cpp @@ -15,13 +15,13 @@ namespace grammar { -RightRG::RightRG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { +RightRG::RightRG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) { } -RightRG::RightRG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +RightRG::RightRG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* RightRG::clone() const { @@ -59,7 +59,7 @@ bool RightRG::removeNonterminalSymbol(const alphabet::Symbol& symbol) { return nonterminalAlphabet.erase(symbol); } -bool RightRG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide) { +bool RightRG::addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide) { if(!nonterminalAlphabet.count(leftHandSide)) throw GrammarException("Rule must rewrite nonterminal symbol"); @@ -69,25 +69,25 @@ bool RightRG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<a if(!terminalAlphabet.count(rhs)) throw GrammarException("Rule must rewrite to terminal symbol"); - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } else { const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = rightHandSide.get<std::pair<alphabet::Symbol, alphabet::Symbol>>(); if(!terminalAlphabet.count(rhs.first) || !nonterminalAlphabet.count(rhs.second)) throw GrammarException("Rule must rewrite to terminal symbol followed by nonterminal symbol"); - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } } -bool RightRG::addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide) { - std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool RightRG::addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide) { + std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } -bool RightRG::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide) { - std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide); - return addRule(leftHandSide, rhs); +bool RightRG::addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide) { + std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide)); + return addRule(std::move(leftHandSide), std::move(rhs)); } const std::map<alphabet::Symbol, std::set<std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>>> & RightRG::getRules() const { @@ -108,16 +108,16 @@ bool RightRG::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<a return removeRule(leftHandSide, rhs); } -bool RightRG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool RightRG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { if(rightHandSide.size() == 0) { if(leftHandSide != initialSymbol) throw exception::AlibException("Illegal left hand side of epsilon rule"); bool res = getGeneratesEpsilon(); setGeneratesEpsilon(true); return res; } else if(rightHandSide.size() == 1) { - return addRule(leftHandSide, rightHandSide[0]); + return addRule(std::move(leftHandSide), std::move(rightHandSide[0])); } else if(rightHandSide.size() == 2) { - return addRule(leftHandSide, std::make_pair(rightHandSide[0], rightHandSide[1])); + return addRule(std::move(leftHandSide), std::make_pair(std::move(rightHandSide[0]), std::move(rightHandSide[1]))); } else { throw exception::AlibException("Invalid right hand side"); } diff --git a/alib2data/src/grammar/Regular/RightRG.h b/alib2data/src/grammar/Regular/RightRG.h index de21f7c2d79226002fcc9069dfb6862f4f3a0bd4..9431d9e4fbfed326d4dc23982cb41860450fbd81 100644 --- a/alib2data/src/grammar/Regular/RightRG.h +++ b/alib2data/src/grammar/Regular/RightRG.h @@ -40,17 +40,17 @@ class RightRG : public std::acceptor<RightRG, VisitableGrammarBase, std::accepto bool generatesEpsilon; public: - explicit RightRG(const alphabet::Symbol& initialSymbol); + explicit RightRG(alphabet::Symbol initialSymbol); - explicit RightRG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit RightRG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide); - bool addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide); - bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide); + bool addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide); const std::map<alphabet::Symbol, std::set<std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>>> & getRules() const; @@ -58,7 +58,7 @@ public: bool removeRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide); bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide); - bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide); std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const; diff --git a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp index 1f24c3ccf1e17792d7e51a9b90e80366a440525b..04f10d30e2bebe437878999cb9346885be3a9106 100644 --- a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp +++ b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp @@ -15,13 +15,13 @@ namespace grammar { -ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { +ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { } -ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* ContextPreservingUnrestrictedGrammar::clone() const { @@ -75,9 +75,9 @@ bool ContextPreservingUnrestrictedGrammar::removeNonterminalSymbol(const alphabe return nonterminalAlphabet.erase(symbol); } -bool ContextPreservingUnrestrictedGrammar::addRule(const std::vector<alphabet::Symbol>& lContext, const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rContext, const std::vector<alphabet::Symbol>& rightHandSide) { +bool ContextPreservingUnrestrictedGrammar::addRule(std::vector<alphabet::Symbol> lContext, alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rContext, std::vector<alphabet::Symbol> rightHandSide) { for(const alphabet::Symbol& symbol : lContext) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); } @@ -85,16 +85,16 @@ bool ContextPreservingUnrestrictedGrammar::addRule(const std::vector<alphabet::S throw GrammarException("Rule must rewrite nonterminal symbol"); for(const alphabet::Symbol& symbol : rContext) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); } for(const alphabet::Symbol& symbol : rightHandSide) { - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); } - return rules[make_tuple(lContext, leftHandSide, rContext)].insert(rightHandSide).second; + return rules[make_tuple(std::move(lContext), std::move(leftHandSide), std::move(rContext))].insert(std::move(rightHandSide)).second; } const std::map<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>, std::set<std::vector<alphabet::Symbol>>> & ContextPreservingUnrestrictedGrammar::getRules() const { diff --git a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h index 2668aa83de037cc3413ea731d710ad7e58e535aa..7cd0666b55e2569a64b57cdf89b02a29600b33b4 100644 --- a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h +++ b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h @@ -22,15 +22,15 @@ class ContextPreservingUnrestrictedGrammar : public std::acceptor<ContextPreserv std::map<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>, std::set<std::vector<alphabet::Symbol>>> rules; public: - explicit ContextPreservingUnrestrictedGrammar(const alphabet::Symbol& initialSymbol); + explicit ContextPreservingUnrestrictedGrammar(alphabet::Symbol initialSymbol); - explicit ContextPreservingUnrestrictedGrammar(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit ContextPreservingUnrestrictedGrammar(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const std::vector<alphabet::Symbol>& lContext, const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rContext, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRule(std::vector<alphabet::Symbol> lContext, alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rContext, std::vector<alphabet::Symbol> rightHandSide); const std::map<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>, std::set<std::vector<alphabet::Symbol>>> & getRules() const; diff --git a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp index 6c243e742cb432db7f8a4a201ab8d210e906016b..19186121a556343d00e74e99c22a4b85e0d94de3 100644 --- a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp +++ b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp @@ -15,13 +15,13 @@ namespace grammar { -UnrestrictedGrammar::UnrestrictedGrammar(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { +UnrestrictedGrammar::UnrestrictedGrammar(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { } -UnrestrictedGrammar::UnrestrictedGrammar(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) { - setNonterminalAlphabet(nonterminalAlphabet); - setTerminalAlphabet(terminalAlphabet); +UnrestrictedGrammar::UnrestrictedGrammar(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) { + setNonterminalAlphabet(std::move(nonterminalAlphabet)); + setTerminalAlphabet(std::move(terminalAlphabet)); } GrammarBase* UnrestrictedGrammar::clone() const { @@ -62,20 +62,20 @@ bool UnrestrictedGrammar::removeNonterminalSymbol(const alphabet::Symbol& symbol return nonterminalAlphabet.erase(symbol); } -bool UnrestrictedGrammar::addRule(const std::vector<alphabet::Symbol>& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) { +bool UnrestrictedGrammar::addRule(std::vector<alphabet::Symbol> leftHandSide, std::vector<alphabet::Symbol> rightHandSide) { if(std::all_of(leftHandSide.begin(), leftHandSide.end(), [&](const alphabet::Symbol symbol) {return !nonterminalAlphabet.count(symbol);})) throw GrammarException("Rule must rewrite nonterminal symbol"); for(const alphabet::Symbol& symbol : leftHandSide) - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); for(const alphabet::Symbol& symbol : rightHandSide) - if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) + if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol)) throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol"); - return rules[leftHandSide].insert(rightHandSide).second; + return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second; } const std::map<std::vector<alphabet::Symbol>, std::set<std::vector<alphabet::Symbol>>> & UnrestrictedGrammar::getRules() const { diff --git a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h index 55761fd07e117c478060aa026922b7845b563620..e2fe2d64cd84ae886018fac3155413746204e328 100644 --- a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h +++ b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h @@ -22,15 +22,15 @@ class UnrestrictedGrammar : public std::acceptor<UnrestrictedGrammar, VisitableG std::map<std::vector<alphabet::Symbol>, std::set<std::vector<alphabet::Symbol>>> rules; public: - explicit UnrestrictedGrammar(const alphabet::Symbol& initialSymbol); + explicit UnrestrictedGrammar(alphabet::Symbol initialSymbol); - explicit UnrestrictedGrammar(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol); + explicit UnrestrictedGrammar(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol); virtual GrammarBase* clone() const; virtual GrammarBase* plunder() &&; - bool addRule(const std::vector<alphabet::Symbol>& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide); + bool addRule(std::vector<alphabet::Symbol> leftHandSide, std::vector<alphabet::Symbol> rightHandSide); const std::map<std::vector<alphabet::Symbol>, std::set<std::vector<alphabet::Symbol>>> & getRules() const; diff --git a/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp b/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp index b2ec4a5a656a773e54fdbbf475cfbddda283d540..b201de1dd3f26126f63a82cdf3b371b41bf4f742 100644 --- a/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp +++ b/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp @@ -19,76 +19,66 @@ namespace grammar { -TerminalNonterminalAlphabetInitialSymbol::TerminalNonterminalAlphabetInitialSymbol(const alphabet::Symbol& initialSymbol) : initialSymbol(initialSymbol) { - addNonterminalSymbol(initialSymbol); +TerminalNonterminalAlphabetInitialSymbol::TerminalNonterminalAlphabetInitialSymbol(alphabet::Symbol initialSymbol) : initialSymbol(initialSymbol) { + addNonterminalSymbol(std::move(initialSymbol)); } -bool TerminalNonterminalAlphabetInitialSymbol::addTerminalSymbol(const alphabet::Symbol& symbol) { +bool TerminalNonterminalAlphabetInitialSymbol::addTerminalSymbol(alphabet::Symbol symbol) { if(nonterminalAlphabet.find(symbol) != nonterminalAlphabet.end()){ throw GrammarException("Symbol \"" + (std::string) symbol + "\" is nonterminal symbol."); } - return terminalAlphabet.insert(symbol).second; + return terminalAlphabet.insert(std::move(symbol)).second; } const std::set<alphabet::Symbol>& TerminalNonterminalAlphabetInitialSymbol::getTerminalAlphabet() const { return terminalAlphabet; } -void TerminalNonterminalAlphabetInitialSymbol::setTerminalAlphabet(const std::set<alphabet::Symbol>& alphabet) { +void TerminalNonterminalAlphabetInitialSymbol::setTerminalAlphabet(std::set<alphabet::Symbol> alphabet) { std::set<alphabet::Symbol> removed; std::set_difference(terminalAlphabet.begin(), terminalAlphabet.end(), alphabet.begin(), alphabet.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(alphabet.begin(), alphabet.end(), terminalAlphabet.begin(), terminalAlphabet.end(), std::inserter(added, added.end())); - for(const alphabet::Symbol& removedSymbol : removed) { removeTerminalSymbol(removedSymbol); } - - for(const alphabet::Symbol& addedSymbol : added) { - addTerminalSymbol(addedSymbol); - } + // TODO check intersection with nonterminal alphabet + terminalAlphabet = std::move(alphabet); } -bool TerminalNonterminalAlphabetInitialSymbol::addNonterminalSymbol(const alphabet::Symbol& symbol) { +bool TerminalNonterminalAlphabetInitialSymbol::addNonterminalSymbol(alphabet::Symbol symbol) { if(terminalAlphabet.find(symbol) != terminalAlphabet.end()){ throw GrammarException("Symbol \"" + (std::string) symbol + "\" is terminal symbol."); } - return nonterminalAlphabet.insert(symbol).second; + return nonterminalAlphabet.insert(std::move(symbol)).second; } const std::set<alphabet::Symbol>& TerminalNonterminalAlphabetInitialSymbol::getNonterminalAlphabet() const { return nonterminalAlphabet; } -void TerminalNonterminalAlphabetInitialSymbol::setNonterminalAlphabet(const std::set<alphabet::Symbol>& alphabet) { +void TerminalNonterminalAlphabetInitialSymbol::setNonterminalAlphabet(std::set<alphabet::Symbol> alphabet) { std::set<alphabet::Symbol> removed; std::set_difference(nonterminalAlphabet.begin(), nonterminalAlphabet.end(), alphabet.begin(), alphabet.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(alphabet.begin(), alphabet.end(), nonterminalAlphabet.begin(), nonterminalAlphabet.end(), std::inserter(added, added.end())); - for(const alphabet::Symbol& removedSymbol : removed) { removeNonterminalSymbol(removedSymbol); } - - for(const alphabet::Symbol& addedSymbol : added) { - addNonterminalSymbol(addedSymbol); - } + // TODO check intersection with nonterminal alphabet + nonterminalAlphabet = std::move(alphabet); } const alphabet::Symbol& TerminalNonterminalAlphabetInitialSymbol::getInitialSymbol() const{ return initialSymbol; } -void TerminalNonterminalAlphabetInitialSymbol::setInitialSymbol(const alphabet::Symbol& symbol) { +void TerminalNonterminalAlphabetInitialSymbol::setInitialSymbol(alphabet::Symbol symbol) { if(nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) { throw GrammarException("Symbol \"" + (std::string) symbol + "\" isn't nonterminal symbol."); } - initialSymbol = symbol; + initialSymbol = std::move(symbol); } } /* namespace grammar */ diff --git a/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.h b/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.h index 7c7a3ccaebc9591f9afd7821d80e49b92cf7dd7d..fd0dc355ac6b36ca77c5fde0a43eafddbf67e0ee 100644 --- a/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.h +++ b/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.h @@ -41,14 +41,14 @@ public: * Creates a new instance, initial symbol is included in the nonterminal alphabet * @param initialSymbol */ - explicit TerminalNonterminalAlphabetInitialSymbol(const alphabet::Symbol& initialSymbol); + explicit TerminalNonterminalAlphabetInitialSymbol(alphabet::Symbol initialSymbol); /** * Adds terminal symbol to the terminal alphabet. * @param symbol Symbol to add * @throws GrammarException when symbol is already a nonterminal symbol */ - bool addTerminalSymbol(const alphabet::Symbol& symbol); + bool addTerminalSymbol(alphabet::Symbol symbol); /** * Removes terminal symbol from the terminal alphabet. @@ -65,14 +65,14 @@ public: /** * Sets the terminal alphabet */ - void setTerminalAlphabet(const std::set<alphabet::Symbol>& alphabet); + void setTerminalAlphabet(std::set<alphabet::Symbol> alphabet); /** * Adds nonterminal symbol to the alphabet of nonterminals. * @param symbol Symbol to add * @throws GrammarException when symbol is already a terminal */ - bool addNonterminalSymbol(const alphabet::Symbol& symbol); + bool addNonterminalSymbol(alphabet::Symbol symbol); /** * Removes nonterminal symbol from the grammar. @@ -89,7 +89,7 @@ public: /** * Sets the terminal alphabet */ - void setNonterminalAlphabet(const std::set<alphabet::Symbol>& alphabet); + void setNonterminalAlphabet(std::set<alphabet::Symbol> alphabet); /** * @return start symbol @@ -101,7 +101,7 @@ public: * @param symbol nonterminal Symbol * @throws GrammarException when symbol isn't a nonterminal symbol */ - void setInitialSymbol(const alphabet::Symbol& symbol); + void setInitialSymbol(alphabet::Symbol symbol); }; diff --git a/alib2data/src/label/HexavigesimalLabel.h b/alib2data/src/label/HexavigesimalLabel.h index 4f805ba06256442fd2bf0e3312356931f17f00ac..65aa7a6e7e018b92352eae48186a8a06d977f5bb 100644 --- a/alib2data/src/label/HexavigesimalLabel.h +++ b/alib2data/src/label/HexavigesimalLabel.h @@ -27,7 +27,7 @@ public: * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit HexavigesimalLabel(int hexavigesimal); + explicit HexavigesimalLabel(int hexavigesimal); virtual LabelBase* clone() const; diff --git a/alib2data/src/label/Label.cpp b/alib2data/src/label/Label.cpp index 8b56fd9975629f516721baf8ad8cb09210810d2c..e1e82ab841ebda02b5cce9669522c84183153216 100644 --- a/alib2data/src/label/Label.cpp +++ b/alib2data/src/label/Label.cpp @@ -24,8 +24,8 @@ label::Label labelFrom(char character) { return label::Label { label::PrimitiveLabel { primitive::primitiveFrom ( character ) } }; } -label::Label labelFrom(const std::string& string) { - return label::Label { label::PrimitiveLabel { primitive::primitiveFrom ( string ) } }; +label::Label labelFrom(std::string string) { + return label::Label { label::PrimitiveLabel { primitive::primitiveFrom ( std::move ( string ) ) } }; } label::Label labelFrom(const char* string) { diff --git a/alib2data/src/label/Label.h b/alib2data/src/label/Label.h index 5861898f53d86c9fd0a3be1b3ec16c907540f626..40c8719d708be58891bec3f56f35f7341b154c90 100644 --- a/alib2data/src/label/Label.h +++ b/alib2data/src/label/Label.h @@ -23,7 +23,7 @@ typedef alib::wrapper<LabelBase> Label; label::Label labelFrom(int number); label::Label labelFrom(int number1, int number2); label::Label labelFrom(char character); -label::Label labelFrom(const std::string& string); +label::Label labelFrom(std::string string); label::Label labelFrom(const char* string); } /* namespace label */ diff --git a/alib2data/src/label/LabelPairLabel.cpp b/alib2data/src/label/LabelPairLabel.cpp index 55f8d2d78efd9ad41108210779c939fd427f8a2a..508464828fb8cb0fe93ee2249bf3a2bb48131ac7 100644 --- a/alib2data/src/label/LabelPairLabel.cpp +++ b/alib2data/src/label/LabelPairLabel.cpp @@ -11,11 +11,7 @@ namespace label { -LabelPairLabel::LabelPairLabel(const std::pair<Label, Label>& label) : label(std::move(label)) { - -} - -LabelPairLabel::LabelPairLabel(std::pair<Label, Label>&& label) : label(std::move(label)) { +LabelPairLabel::LabelPairLabel(std::pair<Label, Label> label) : label(std::move(label)) { } diff --git a/alib2data/src/label/LabelPairLabel.h b/alib2data/src/label/LabelPairLabel.h index bc72f9194676561b9e7db3b3d93a19819d7eb9a9..ca517cb5c38aa1e50718d5bf3b10bf9097091222 100644 --- a/alib2data/src/label/LabelPairLabel.h +++ b/alib2data/src/label/LabelPairLabel.h @@ -29,9 +29,7 @@ public: * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit LabelPairLabel(const std::pair<Label, Label>& label); - - explicit LabelPairLabel(std::pair<Label, Label>&& label); + explicit LabelPairLabel(std::pair<Label, Label> label); virtual LabelBase* clone() const; diff --git a/alib2data/src/label/LabelSetLabel.cpp b/alib2data/src/label/LabelSetLabel.cpp index abfdde0ba0e2d9ae8ceb4429bca6dae82ed57bcb..b82adeafdbaa3b712284907c3a59625ba55e0f17 100644 --- a/alib2data/src/label/LabelSetLabel.cpp +++ b/alib2data/src/label/LabelSetLabel.cpp @@ -11,11 +11,7 @@ namespace label { -LabelSetLabel::LabelSetLabel(const std::set<Label>& label) : label(label) { - -} - -LabelSetLabel::LabelSetLabel(std::set<Label>&& label) : label(std::move(label)) { +LabelSetLabel::LabelSetLabel(std::set<Label> label) : label(std::move(label)) { } diff --git a/alib2data/src/label/LabelSetLabel.h b/alib2data/src/label/LabelSetLabel.h index 2741e2dd803657b364cd862337f28e3700195e3c..0976572171055e6cab1440e7e8b585811d905bfd 100644 --- a/alib2data/src/label/LabelSetLabel.h +++ b/alib2data/src/label/LabelSetLabel.h @@ -29,9 +29,7 @@ public: * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit LabelSetLabel(const std::set<Label>& label); - - explicit LabelSetLabel(std::set<Label>&& label); + explicit LabelSetLabel(std::set<Label> label); virtual LabelBase* clone() const; diff --git a/alib2data/src/label/NextLabel.cpp b/alib2data/src/label/NextLabel.cpp index 47c14b822f6175e63dfcde27a232471876300514..f7642b5db00be85cb6ce84fb5664b28e01ff7f80 100644 --- a/alib2data/src/label/NextLabel.cpp +++ b/alib2data/src/label/NextLabel.cpp @@ -35,21 +35,21 @@ void NextLabel::Visit(void* userData, const ObjectLabel& label) { Label* &out = *((Label**) userData); primitive::Integer newId(0); - out = new Label(UniqueLabel(Label(label), newId)); + out = new Label(UniqueLabel(Label(label), std::move(newId))); } void NextLabel::Visit(void* userData, const LabelSetLabel& label) { Label* &out = *((Label**) userData); primitive::Integer newId(0); - out = new Label(UniqueLabel(Label(label), newId)); + out = new Label(UniqueLabel(Label(label), std::move(newId))); } void NextLabel::Visit(void* userData, const LabelPairLabel& label) { Label* &out = *((Label**) userData); primitive::Integer newId(0); - out = new Label(UniqueLabel(Label(label), newId)); + out = new Label(UniqueLabel(Label(label), std::move(newId))); } void NextLabel::Visit(void* userData, const UniqueLabel& label) { @@ -57,7 +57,7 @@ void NextLabel::Visit(void* userData, const UniqueLabel& label) { primitive::NextPrimitive next; primitive::Integer newId(label.getId().getData() + 1); - out = new Label(UniqueLabel(label.getLabel(), newId)); + out = new Label(UniqueLabel(label.getLabel(), std::move(newId))); } Label NextLabel::nextLabel(const Label& label) { diff --git a/alib2data/src/label/ObjectLabel.cpp b/alib2data/src/label/ObjectLabel.cpp index e07535061ed2cb864065336b3804eb904b64431b..7b27bf348402e4a5d39eb4134704c95492edfa50 100644 --- a/alib2data/src/label/ObjectLabel.cpp +++ b/alib2data/src/label/ObjectLabel.cpp @@ -9,11 +9,7 @@ namespace label { -ObjectLabel::ObjectLabel(const alib::Object& label) : label(label) { - -} - -ObjectLabel::ObjectLabel(alib::Object&& label) : label(std::move(label)) { +ObjectLabel::ObjectLabel(alib::Object label) : label(std::move(label)) { } diff --git a/alib2data/src/label/ObjectLabel.h b/alib2data/src/label/ObjectLabel.h index 37d27086f0e13b8bd1132118e1de86cb314a6d0c..e467f30e9517205641e6a114f11cf18374c90669 100644 --- a/alib2data/src/label/ObjectLabel.h +++ b/alib2data/src/label/ObjectLabel.h @@ -27,9 +27,7 @@ public: * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit ObjectLabel(const alib::Object& label); - - explicit ObjectLabel(alib::Object&& label); + explicit ObjectLabel(alib::Object label); virtual LabelBase* clone() const; diff --git a/alib2data/src/label/PrimitiveLabel.cpp b/alib2data/src/label/PrimitiveLabel.cpp index cabddfc85671aed58430896ab7503667b7f6756f..656b723388fc949abcff81c3c5e5ac424f353372 100644 --- a/alib2data/src/label/PrimitiveLabel.cpp +++ b/alib2data/src/label/PrimitiveLabel.cpp @@ -9,11 +9,7 @@ namespace label { -PrimitiveLabel::PrimitiveLabel(const primitive::Primitive& primitive) : primitive(primitive) { - -} - -PrimitiveLabel::PrimitiveLabel(primitive::Primitive&& primitive) : primitive(std::move(primitive)) { +PrimitiveLabel::PrimitiveLabel(primitive::Primitive primitive) : primitive(std::move(primitive)) { } diff --git a/alib2data/src/label/PrimitiveLabel.h b/alib2data/src/label/PrimitiveLabel.h index f8f572a2699d8f0626a22fdde61502289413b79e..3cff7b163760b64c7d2de2c8cb62feb84cf0b0f8 100644 --- a/alib2data/src/label/PrimitiveLabel.h +++ b/alib2data/src/label/PrimitiveLabel.h @@ -27,9 +27,7 @@ public: * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit PrimitiveLabel(const primitive::Primitive& primitive); - - explicit PrimitiveLabel(primitive::Primitive&& primitive); + explicit PrimitiveLabel(primitive::Primitive primitive); virtual LabelBase* clone() const; diff --git a/alib2data/src/label/UniqueLabel.cpp b/alib2data/src/label/UniqueLabel.cpp index c2c72ed7d3900efec301ecb348ac1474223c66b6..ff4364899e506eb40586e0d14c6c86ba2e90ae20 100644 --- a/alib2data/src/label/UniqueLabel.cpp +++ b/alib2data/src/label/UniqueLabel.cpp @@ -11,11 +11,7 @@ namespace label { -UniqueLabel::UniqueLabel(const Label& label, const primitive::Integer& id) : label(label), id(id) { - -} - -UniqueLabel::UniqueLabel(Label&& label, primitive::Integer&& id) : label(std::move(label)), id(std::move(id)) { +UniqueLabel::UniqueLabel(Label label, primitive::Integer id) : label(std::move(label)), id(std::move(id)) { } diff --git a/alib2data/src/label/UniqueLabel.h b/alib2data/src/label/UniqueLabel.h index bdd9305b3346aa3bfaff7620b44669e62831ba7e..4073a89912e0985c146a60e1a696d92fb1ecd025 100644 --- a/alib2data/src/label/UniqueLabel.h +++ b/alib2data/src/label/UniqueLabel.h @@ -31,9 +31,7 @@ public: * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit UniqueLabel(const Label& label, const primitive::Integer& id); - - explicit UniqueLabel(Label&& label, primitive::Integer&& id); + explicit UniqueLabel(Label label, primitive::Integer id); virtual LabelBase* clone() const; diff --git a/alib2data/src/primitive/Primitive.cpp b/alib2data/src/primitive/Primitive.cpp index b6695aecbc977aad7ca98ca12f95006228a25eee..88b8b4bde9f7026a78bda883a2757e8a09ba18bc 100644 --- a/alib2data/src/primitive/Primitive.cpp +++ b/alib2data/src/primitive/Primitive.cpp @@ -26,8 +26,8 @@ Primitive primitiveFrom(const char* string) { return primitiveFrom((std::string) string); } -Primitive primitiveFrom(const std::string& string) { - return Primitive { String { string } }; +Primitive primitiveFrom(std::string string) { + return Primitive { String { std::move ( string ) } }; } Primitive primitiveFrom(unsigned number) { diff --git a/alib2data/src/primitive/Primitive.h b/alib2data/src/primitive/Primitive.h index 731b106825933049087b82917069cdea227f72fc..a6a8521e608e2f4145302c8969edd5983fdbd455 100644 --- a/alib2data/src/primitive/Primitive.h +++ b/alib2data/src/primitive/Primitive.h @@ -22,7 +22,7 @@ typedef alib::wrapper<PrimitiveBase> Primitive; Primitive primitiveFrom(int number); Primitive primitiveFrom(char character); -Primitive primitiveFrom(const std::string& string); +Primitive primitiveFrom(std::string string); Primitive primitiveFrom(const char* string); Primitive primitiveFrom(unsigned number); Primitive primitiveFrom(bool value); diff --git a/alib2data/src/primitive/String.cpp b/alib2data/src/primitive/String.cpp index b9bbb6f58fc4c823aa8209e24073950b9ac4baa7..753d58a5fb42203a1e95876578aeca737c66d57d 100644 --- a/alib2data/src/primitive/String.cpp +++ b/alib2data/src/primitive/String.cpp @@ -9,11 +9,7 @@ namespace primitive { -String::String(const std::string& data) : data(data) { - -} - -String::String(std::string&& data) : data(std::move(data)) { +String::String(std::string data) : data(std::move(data)) { } diff --git a/alib2data/src/primitive/String.h b/alib2data/src/primitive/String.h index 48358e88f764a20a1f1e8cefd3b1d6ed14eda15c..fe84241bc5824772d209fc71045935b770f88072 100644 --- a/alib2data/src/primitive/String.h +++ b/alib2data/src/primitive/String.h @@ -27,9 +27,7 @@ public: * Creates new symbol with given name. * @param symbol name of the symbol */ - explicit String(const std::string& data); - - explicit String(std::string&& data); + explicit String(std::string data); explicit String(const char* data); diff --git a/alib2data/src/regexp/RegExp.cpp b/alib2data/src/regexp/RegExp.cpp index b0081b93d851eb1a24ae952c799ea6ab73eb0fe5..9f9ef9fda2f467241bede02f977f72990425e8a7 100644 --- a/alib2data/src/regexp/RegExp.cpp +++ b/alib2data/src/regexp/RegExp.cpp @@ -13,28 +13,28 @@ namespace regexp { -regexp::RegExp regexpFrom( const std::string& string ) { +regexp::RegExp regexpFrom( const std::string & string ) { regexp::UnboundedRegExpConcatenation con; - for(const auto& symbol : string) { - con.appendElement( regexp::UnboundedRegExpSymbol( alphabet::symbolFrom(symbol))); + for(const char& symbol : string) { + con.appendElement( regexp::UnboundedRegExpSymbol( alphabet::symbolFrom( symbol ) ) ); } - return regexp::RegExp { regexp::UnboundedRegExp ( con ) }; + return regexp::RegExp { regexp::UnboundedRegExp ( std::move ( con ) ) }; } regexp::RegExp regexpFrom( const char* string ) { return regexpFrom( (std::string) string ); } -regexp::RegExp regexpFrom( const string::LinearString& string ) { +regexp::RegExp regexpFrom( string::LinearString string ) { regexp::UnboundedRegExpConcatenation con; - for(const auto& symbol : string.getContent()) { - con.appendElement( regexp::UnboundedRegExpSymbol(symbol)); + for(auto& symbol : string.getContent()) { + con.appendElement( regexp::UnboundedRegExpSymbol( std::move ( symbol ) ) ); } - return regexp::RegExp { regexp::UnboundedRegExp ( con ) }; + return regexp::RegExp { regexp::UnboundedRegExp ( std::move( con ) ) }; } -regexp::RegExp regexpFrom( const alphabet::Symbol& symbol ) { - return regexp::RegExp { regexp::UnboundedRegExp( regexp::UnboundedRegExpSymbol(symbol) ) }; +regexp::RegExp regexpFrom( alphabet::Symbol symbol ) { + return regexp::RegExp { regexp::UnboundedRegExp( regexp::UnboundedRegExpSymbol( std::move ( symbol ) ) ) }; } regexp::RegExp regexpFrom( ) { diff --git a/alib2data/src/regexp/RegExp.h b/alib2data/src/regexp/RegExp.h index 7f031301219f0e476836dea140cdcd166a0e115b..b989f65b92c122afcc876af6abb6ecb37b5b0387 100644 --- a/alib2data/src/regexp/RegExp.h +++ b/alib2data/src/regexp/RegExp.h @@ -27,9 +27,9 @@ regexp::RegExp regexpFrom( const std::string& string ); regexp::RegExp regexpFrom( const char* string ); -regexp::RegExp regexpFrom( const string::LinearString& string ); +regexp::RegExp regexpFrom( string::LinearString string ); -regexp::RegExp regexpFrom( const alphabet::Symbol& symbol ); +regexp::RegExp regexpFrom( alphabet::Symbol symbol ); regexp::RegExp regexpFrom( ); diff --git a/alib2data/src/regexp/common/RegExpAlphabet.cpp b/alib2data/src/regexp/common/RegExpAlphabet.cpp index cc2ef9333f361b53f17c30bab5aa0a93e383f12c..eb6ea9544a1d3e60d14db3c7848014507510ad49 100644 --- a/alib2data/src/regexp/common/RegExpAlphabet.cpp +++ b/alib2data/src/regexp/common/RegExpAlphabet.cpp @@ -15,8 +15,8 @@ const std::set<alphabet::Symbol>& RegExpAlphabet::getAlphabet() const { return alphabet; } -bool RegExpAlphabet::addSymbolToAlphabet(const alphabet::Symbol& symbol) { - return alphabet.insert(symbol).second; +bool RegExpAlphabet::addSymbolToAlphabet(alphabet::Symbol symbol) { + return alphabet.insert(std::move(symbol)).second; } void RegExpAlphabet::addSymbolsToAlphabet(const std::set<alphabet::Symbol>& symbols) { @@ -25,20 +25,15 @@ void RegExpAlphabet::addSymbolsToAlphabet(const std::set<alphabet::Symbol>& symb } } -void RegExpAlphabet::setAlphabet(const std::set<alphabet::Symbol>& newSymbols) { +void RegExpAlphabet::setAlphabet(std::set<alphabet::Symbol> newSymbols) { std::set<alphabet::Symbol> removed; std::set_difference(alphabet.begin(), alphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(newSymbols.begin(), newSymbols.end(), alphabet.begin(), alphabet.end(), std::inserter(added, added.end())); - for(const alphabet::Symbol& removedSymbol : removed) { removeSymbolFromAlphabet(removedSymbol); } - for(const alphabet::Symbol& addedSymbol : added) { - addSymbolToAlphabet(addedSymbol); - } + alphabet = std::move(newSymbols); } } /* namespace regexp */ diff --git a/alib2data/src/regexp/common/RegExpAlphabet.h b/alib2data/src/regexp/common/RegExpAlphabet.h index 6c87ae3eaf4e0207908c5a5c802392875f63e261..ebc1ec2d9b2d94cce4589330f4d2c6eb3d587266 100644 --- a/alib2data/src/regexp/common/RegExpAlphabet.h +++ b/alib2data/src/regexp/common/RegExpAlphabet.h @@ -26,7 +26,7 @@ public: * Adds input symbol to input alphabet. * @param symbol Symbol to add */ - bool addSymbolToAlphabet(const alphabet::Symbol& symbol); + bool addSymbolToAlphabet(alphabet::Symbol symbol); /** * Adds input symbols to input alphabet. @@ -38,7 +38,7 @@ public: * Sets input symbols of the regexp. * @param symbols Symbols to set */ - void setAlphabet(const std::set<alphabet::Symbol>& symbols); + void setAlphabet(std::set<alphabet::Symbol> symbols); /** * Removes input symbol from the input alphabet. diff --git a/alib2data/src/std/set.hpp b/alib2data/src/std/set.hpp index 968c901515a909705a0364cceac54428ec7d1876..a3f2c611b8743f749aa540b2d6303076bfd1d588 100644 --- a/alib2data/src/std/set.hpp +++ b/alib2data/src/std/set.hpp @@ -50,6 +50,80 @@ bool empty_intersection(const set<T>& x, const set<T>& y) { return true; } +template <class Iterator> +class set_move_iterator { + Iterator current; + +public: + typedef Iterator iterator_type; + typedef typename iterator_traits<Iterator>::iterator_category iterator_category; + typedef typename iterator_traits<Iterator>::value_type value_type; + typedef typename iterator_traits<Iterator>::difference_type difference_type; + typedef Iterator pointer; + typedef value_type&& reference; + + explicit set_move_iterator() { + } + + explicit set_move_iterator (Iterator it) : current(it) { + } + + template <class Iter> set_move_iterator (const set_move_iterator<Iter>& it) : current(it.current) { + } + + template <class Iter> set_move_iterator& operator= (const set_move_iterator<Iter>& it) { + current = it.current; + } + + iterator_type base() const { + return current; + } + + pointer operator->() const { + return current; + } + + reference operator*() const { + return std::move(const_cast<value_type&>(*current)); + } + + set_move_iterator& operator++() { + ++current; + return *this; + } + + set_move_iterator& operator--() { + --current; + return *this; + } + + set_move_iterator& operator++(int) { + set_move_iterator temp = *this; + ++current; + return temp; + } + + set_move_iterator& operator--(int) { + set_move_iterator temp = *this; + --current; + return temp; + } + + bool operator== (const set_move_iterator<Iterator>& other) { + return this->current == other.current; + } + + bool operator!= (const set_move_iterator<Iterator>& other) { + return ! ( *this == other ); + } + +}; + +template<class Iterator> +set_move_iterator<Iterator> make_set_move_iterator (Iterator it) { + return set_move_iterator<Iterator>(it); +} + } /* namespace std */ #endif /* __SET_HPP_ */ diff --git a/alib2data/src/string/CyclicString.cpp b/alib2data/src/string/CyclicString.cpp index 443be9b159f095d44cfe4990093567b78cc70d08..5161be34bcd5a8dbfadaf47776f32b8d0420fcc1 100644 --- a/alib2data/src/string/CyclicString.cpp +++ b/alib2data/src/string/CyclicString.cpp @@ -43,14 +43,14 @@ CyclicString::CyclicString(std::vector<alphabet::Symbol>&& data) { setContent(std::move(data)); } -CyclicString::CyclicString(const std::string& str) { - for (unsigned i = 0; i < str.length(); ++i) { - m_Data.push_back(alphabet::symbolFrom(str[i])); +CyclicString::CyclicString(const std::string& string) { + for(const char& symbol : string) { + m_Data.push_back( alphabet::symbolFrom( symbol ) ); } alphabet = std::set<alphabet::Symbol>(m_Data.begin(), m_Data.end()); } -CyclicString::CyclicString(const char* str) : CyclicString((std::string) str) { +CyclicString::CyclicString(const char* string) : CyclicString((std::string) string) { } CyclicString::CyclicString(const Epsilon& epsilon) { @@ -68,7 +68,7 @@ StringBase* CyclicString::plunder() && { bool CyclicString::removeSymbolFromAlphabet(const alphabet::Symbol & symbol) { if(std::any_of(m_Data.begin(), m_Data.end(), [&](const alphabet::Symbol & s) { return s == symbol; } ) ) throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is used."); - + return alphabet.erase(symbol); } @@ -97,7 +97,7 @@ int CyclicString::compare(const LinearString& other) const { std::compare<std::set<alphabet::Symbol>> comp; return comp(alphabet, other.getAlphabet()); } - + if(this->selfTypeId() < typeId<LinearString>()) return -1; else diff --git a/alib2data/src/string/CyclicString.h b/alib2data/src/string/CyclicString.h index c97a433e259e5c39113eb53cecd35529c7e31fa6..18a63a7f47a5397b67d0f44a3bc609ba25df5ce8 100644 --- a/alib2data/src/string/CyclicString.h +++ b/alib2data/src/string/CyclicString.h @@ -32,8 +32,8 @@ public: explicit CyclicString(std::set<alphabet::Symbol>&& alphabet, std::vector<alphabet::Symbol>&& data); explicit CyclicString(const std::vector<alphabet::Symbol>& data); explicit CyclicString(std::vector<alphabet::Symbol>&& data); - explicit CyclicString(const std::string& str); - explicit CyclicString(const char* str); + explicit CyclicString(const std::string& string); + explicit CyclicString(const char* string); explicit CyclicString(const Epsilon& epsilon); virtual StringBase* clone() const; diff --git a/alib2data/src/string/LinearString.cpp b/alib2data/src/string/LinearString.cpp index 856cfd2a7afda8623125d6f5b9d5ac6181397bed..85d8d5bd19e8ab19c59a35011e694e1f0c87288e 100644 --- a/alib2data/src/string/LinearString.cpp +++ b/alib2data/src/string/LinearString.cpp @@ -43,14 +43,14 @@ LinearString::LinearString(std::vector<alphabet::Symbol>&& data) { m_Data = std::move(data); } -LinearString::LinearString(const std::string& str) { - for (unsigned i = 0; i < str.length(); ++i) { - m_Data.push_back(alphabet::symbolFrom(str[i])); +LinearString::LinearString(const std::string& string) { + for(const char& symbol : string) { + m_Data.push_back( alphabet::symbolFrom( symbol ) ); } alphabet = std::set<alphabet::Symbol>(m_Data.begin(), m_Data.end()); } -LinearString::LinearString(const char* str) : LinearString((std::string) str) { +LinearString::LinearString(const char* string) : LinearString((std::string) string) { } LinearString::LinearString(const Epsilon& epsilon) { @@ -68,7 +68,7 @@ StringBase* LinearString::plunder() && { bool LinearString::removeSymbolFromAlphabet(const alphabet::Symbol & symbol) { if(std::any_of(m_Data.begin(), m_Data.end(), [&](const alphabet::Symbol & s) { return s == symbol; } ) ) throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is used."); - + return alphabet.erase(symbol); } @@ -128,7 +128,7 @@ int LinearString::compare(const Epsilon& other) const { std::compare<std::set<alphabet::Symbol>> comp; return comp(alphabet, other.getAlphabet()); } - + if(this->selfTypeId() < typeId<Epsilon>()) return -1; else diff --git a/alib2data/src/string/LinearString.h b/alib2data/src/string/LinearString.h index 13675e888728e22eb2dfc5ba94f916aa30cd259f..5138e70158b86f64fc1a0cdd3fddf079cc826975 100644 --- a/alib2data/src/string/LinearString.h +++ b/alib2data/src/string/LinearString.h @@ -33,8 +33,8 @@ public: explicit LinearString(std::set<alphabet::Symbol>&& alphabet, std::vector<alphabet::Symbol>&& data); explicit LinearString(const std::vector<alphabet::Symbol>& data); explicit LinearString(std::vector<alphabet::Symbol>&& data); - explicit LinearString(const std::string& str); - explicit LinearString(const char* str); + explicit LinearString(const std::string& string); + explicit LinearString(const char* string); explicit LinearString(const Epsilon& epsilon); virtual StringBase* clone() const; @@ -46,7 +46,7 @@ public: * @param element to append */ void appendSymbol(const alphabet::Symbol& symbol); - + void appendSymbol(alphabet::Symbol&& symbol); /** diff --git a/alib2data/src/string/common/StringAlphabet.cpp b/alib2data/src/string/common/StringAlphabet.cpp index 9fb8e517412e3c54f166c270630f94b823397767..0ceff53de0315855bfc0674c1ada6b7284f96cd8 100644 --- a/alib2data/src/string/common/StringAlphabet.cpp +++ b/alib2data/src/string/common/StringAlphabet.cpp @@ -15,8 +15,8 @@ const std::set<alphabet::Symbol>& StringAlphabet::getAlphabet() const { return alphabet; } -bool StringAlphabet::addSymbolToAlphabet(const alphabet::Symbol& symbol) { - return alphabet.insert(symbol).second; +bool StringAlphabet::addSymbolToAlphabet(alphabet::Symbol symbol) { + return alphabet.insert(std::move(symbol)).second; } void StringAlphabet::addSymbolsToAlphabet(const std::set<alphabet::Symbol>& symbols) { @@ -25,20 +25,15 @@ void StringAlphabet::addSymbolsToAlphabet(const std::set<alphabet::Symbol>& symb } } -void StringAlphabet::setAlphabet(const std::set<alphabet::Symbol>& newSymbols) { +void StringAlphabet::setAlphabet(std::set<alphabet::Symbol> newSymbols) { std::set<alphabet::Symbol> removed; std::set_difference(alphabet.begin(), alphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end())); - std::set<alphabet::Symbol> added; - std::set_difference(newSymbols.begin(), newSymbols.end(), alphabet.begin(), alphabet.end(), std::inserter(added, added.end())); - for(const alphabet::Symbol& removedSymbol : removed) { removeSymbolFromAlphabet(removedSymbol); } - for(const alphabet::Symbol& addedSymbol : added) { - addSymbolToAlphabet(addedSymbol); - } + alphabet = std::move(newSymbols); } } /* namespace string */ diff --git a/alib2data/src/string/common/StringAlphabet.h b/alib2data/src/string/common/StringAlphabet.h index d8807428441cc4ea0d88aa78088005146ae21319..d1dbe948f73992b798668b9be1f7989a70a63e75 100644 --- a/alib2data/src/string/common/StringAlphabet.h +++ b/alib2data/src/string/common/StringAlphabet.h @@ -25,7 +25,7 @@ public: * Adds input symbol to input alphabet. * @param symbol Symbol to add */ - bool addSymbolToAlphabet(const alphabet::Symbol& symbol); + bool addSymbolToAlphabet(alphabet::Symbol symbol); /** * Adds input symbols to input alphabet. @@ -37,7 +37,7 @@ public: * Sets input symbols of the string. * @param symbols Symbols to set */ - void setAlphabet(const std::set<alphabet::Symbol>& symbols); + void setAlphabet(std::set<alphabet::Symbol> symbols); /** * Removes input symbol from the input alphabet.