diff --git a/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cxx index 09ed59fabdef72355cccc9b53cace60c055f2c6d..15b93f17eb8df99fdfb9d2886eafa5d3aca7b7c4 100644 --- a/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cxx +++ b/alib2algo/src/automaton/determinize/DeterminizeNFAPart.cxx @@ -28,19 +28,19 @@ automaton::DFA Determinize::determinize(const automaton::MultiInitialStateNFA& n do { // 3a, c - automaton::State state = todo.front(); + automaton::State state = std::move(todo.front()); todo.pop_front(); // 3b - for (const auto& input : nfa.getInputAlphabet()) { + for (const alphabet::Symbol& input : nfa.getInputAlphabet()) { std::set<automaton::State> targetNFAStates; - for(const auto& nfaState : recreateNFAStates(state)) { - auto iter = nfa.getTransitions().find(std::make_pair(nfaState, input)); + for(automaton::State nfaState : std::make_moveable_set(recreateNFAStates(state))) { + auto iter = nfa.getTransitions().find(std::make_pair(std::move(nfaState), alphabet::Symbol(input))); if(iter != nfa.getTransitions().end()) { targetNFAStates.insert(iter->second.begin(), iter->second.end()); } } - automaton::State dfaState = createDFAState(targetNFAStates); + automaton::State dfaState = createDFAState(std::move(targetNFAStates)); // 4 bool existed = !res.addState(dfaState); @@ -48,12 +48,12 @@ automaton::DFA Determinize::determinize(const automaton::MultiInitialStateNFA& n // 3b res.addTransition(state, input, dfaState); - if(!existed) todo.push_back(dfaState); + if(!existed) todo.push_back(std::move(dfaState)); } } while(!todo.empty()); // 5 - for (const auto& dfaState : res.getStates()) { + for (const automaton::State& dfaState : res.getStates()) { std::set<automaton::State> nfaStates = recreateNFAStates(dfaState); if(std::any_of(nfaStates.begin(), nfaStates.end(), [&](const automaton::State& nfaState) { return nfa.getFinalStates().count(nfaState); })) { res.addFinalState(dfaState); @@ -75,19 +75,19 @@ automaton::DFA Determinize::determinize(const automaton::NFA& nfa) { do { // 3a, c - automaton::State state = todo.front(); + automaton::State state = std::move(todo.front()); todo.pop_front(); // 3b - for (const auto& input : nfa.getInputAlphabet()) { + for (const alphabet::Symbol& input : nfa.getInputAlphabet()) { std::set<automaton::State> targetNFAStates; - for(const auto& nfaState : recreateNFAStates(state)) { - auto iter = nfa.getTransitions().find(std::make_pair(nfaState, input)); + for(automaton::State nfaState : std::make_moveable_set(recreateNFAStates(state))) { + auto iter = nfa.getTransitions().find(std::make_pair(std::move(nfaState), alphabet::Symbol(input))); if(iter != nfa.getTransitions().end()) { targetNFAStates.insert(iter->second.begin(), iter->second.end()); } } - automaton::State dfaState = createDFAState(targetNFAStates); + automaton::State dfaState = createDFAState(std::move(targetNFAStates)); // 4 bool existed = !res.addState(dfaState); @@ -95,12 +95,12 @@ automaton::DFA Determinize::determinize(const automaton::NFA& nfa) { // 3b res.addTransition(state, input, dfaState); - if(!existed) todo.push_back(dfaState); + if(!existed) todo.push_back(std::move(dfaState)); } } while(!todo.empty()); // 5 - for (const auto& dfaState : res.getStates()) { + for (const automaton::State& dfaState : res.getStates()) { std::set<automaton::State> nfaStates = recreateNFAStates(dfaState); if(std::any_of(nfaStates.begin(), nfaStates.end(), [&](const automaton::State& nfaState) { return nfa.getFinalStates().count(nfaState); })) { res.addFinalState(dfaState); diff --git a/alib2std/src/extensions/set.hpp b/alib2std/src/extensions/set.hpp index 21803471306cf24303d2fcb5652fd29989ef0d26..3d7dd27bd822d68b93e299bebd4772eb48aa5bb1 100644 --- a/alib2std/src/extensions/set.hpp +++ b/alib2std/src/extensions/set.hpp @@ -130,10 +130,30 @@ set_move_iterator<Iterator> make_set_move_iterator (Iterator it) { } template<class T> -class moveable_set { +class moveable_set_ref { set<T>& theSet; public: - moveable_set(set<T>& param) : theSet(param) {} + moveable_set_ref(set<T>& param) : theSet(param) {} + + set_move_iterator<typename set<T>::iterator> begin() { + return make_set_move_iterator(theSet.begin()); + } + + set_move_iterator<typename set<T>::iterator> end() { + return make_set_move_iterator(theSet.end()); + } +}; + +template<class T> +moveable_set_ref<T> make_moveable_set (std::set<T>& set) { + return moveable_set_ref<T>(set); +} + +template<class T> +class moveable_set { + set<T> theSet; +public: + moveable_set(set<T> param) : theSet(std::move(param)) {} set_move_iterator<typename set<T>::iterator> begin() { return make_set_move_iterator(theSet.begin()); @@ -145,8 +165,8 @@ public: }; template<class T> -moveable_set<T> make_moveable_set (std::set<T>& set) { - return moveable_set<T>(set); +moveable_set<T> make_moveable_set (std::set<T>&& set) { + return moveable_set<T>(std::move(set)); } } /* namespace std */