Skip to content
Snippets Groups Projects
Commit 15823ad1 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

move semantics in NFA determinize

parent 5b2c0ab5
No related branches found
No related tags found
No related merge requests found
...@@ -28,19 +28,19 @@ automaton::DFA Determinize::determinize(const automaton::MultiInitialStateNFA& n ...@@ -28,19 +28,19 @@ automaton::DFA Determinize::determinize(const automaton::MultiInitialStateNFA& n
   
do { do {
// 3a, c // 3a, c
automaton::State state = todo.front(); automaton::State state = std::move(todo.front());
todo.pop_front(); todo.pop_front();
   
// 3b // 3b
for (const auto& input : nfa.getInputAlphabet()) { for (const alphabet::Symbol& input : nfa.getInputAlphabet()) {
std::set<automaton::State> targetNFAStates; std::set<automaton::State> targetNFAStates;
for(const auto& nfaState : recreateNFAStates(state)) { for(automaton::State nfaState : std::make_moveable_set(recreateNFAStates(state))) {
auto iter = nfa.getTransitions().find(std::make_pair(nfaState, input)); auto iter = nfa.getTransitions().find(std::make_pair(std::move(nfaState), alphabet::Symbol(input)));
if(iter != nfa.getTransitions().end()) { if(iter != nfa.getTransitions().end()) {
targetNFAStates.insert(iter->second.begin(), iter->second.end()); targetNFAStates.insert(iter->second.begin(), iter->second.end());
} }
} }
automaton::State dfaState = createDFAState(targetNFAStates); automaton::State dfaState = createDFAState(std::move(targetNFAStates));
   
// 4 // 4
bool existed = !res.addState(dfaState); bool existed = !res.addState(dfaState);
...@@ -48,12 +48,12 @@ automaton::DFA Determinize::determinize(const automaton::MultiInitialStateNFA& n ...@@ -48,12 +48,12 @@ automaton::DFA Determinize::determinize(const automaton::MultiInitialStateNFA& n
// 3b // 3b
res.addTransition(state, input, dfaState); res.addTransition(state, input, dfaState);
   
if(!existed) todo.push_back(dfaState); if(!existed) todo.push_back(std::move(dfaState));
} }
} while(!todo.empty()); } while(!todo.empty());
   
// 5 // 5
for (const auto& dfaState : res.getStates()) { for (const automaton::State& dfaState : res.getStates()) {
std::set<automaton::State> nfaStates = recreateNFAStates(dfaState); std::set<automaton::State> nfaStates = recreateNFAStates(dfaState);
if(std::any_of(nfaStates.begin(), nfaStates.end(), [&](const automaton::State& nfaState) { return nfa.getFinalStates().count(nfaState); })) { if(std::any_of(nfaStates.begin(), nfaStates.end(), [&](const automaton::State& nfaState) { return nfa.getFinalStates().count(nfaState); })) {
res.addFinalState(dfaState); res.addFinalState(dfaState);
...@@ -75,19 +75,19 @@ automaton::DFA Determinize::determinize(const automaton::NFA& nfa) { ...@@ -75,19 +75,19 @@ automaton::DFA Determinize::determinize(const automaton::NFA& nfa) {
   
do { do {
// 3a, c // 3a, c
automaton::State state = todo.front(); automaton::State state = std::move(todo.front());
todo.pop_front(); todo.pop_front();
   
// 3b // 3b
for (const auto& input : nfa.getInputAlphabet()) { for (const alphabet::Symbol& input : nfa.getInputAlphabet()) {
std::set<automaton::State> targetNFAStates; std::set<automaton::State> targetNFAStates;
for(const auto& nfaState : recreateNFAStates(state)) { for(automaton::State nfaState : std::make_moveable_set(recreateNFAStates(state))) {
auto iter = nfa.getTransitions().find(std::make_pair(nfaState, input)); auto iter = nfa.getTransitions().find(std::make_pair(std::move(nfaState), alphabet::Symbol(input)));
if(iter != nfa.getTransitions().end()) { if(iter != nfa.getTransitions().end()) {
targetNFAStates.insert(iter->second.begin(), iter->second.end()); targetNFAStates.insert(iter->second.begin(), iter->second.end());
} }
} }
automaton::State dfaState = createDFAState(targetNFAStates); automaton::State dfaState = createDFAState(std::move(targetNFAStates));
   
// 4 // 4
bool existed = !res.addState(dfaState); bool existed = !res.addState(dfaState);
...@@ -95,12 +95,12 @@ automaton::DFA Determinize::determinize(const automaton::NFA& nfa) { ...@@ -95,12 +95,12 @@ automaton::DFA Determinize::determinize(const automaton::NFA& nfa) {
// 3b // 3b
res.addTransition(state, input, dfaState); res.addTransition(state, input, dfaState);
   
if(!existed) todo.push_back(dfaState); if(!existed) todo.push_back(std::move(dfaState));
} }
} while(!todo.empty()); } while(!todo.empty());
   
// 5 // 5
for (const auto& dfaState : res.getStates()) { for (const automaton::State& dfaState : res.getStates()) {
std::set<automaton::State> nfaStates = recreateNFAStates(dfaState); std::set<automaton::State> nfaStates = recreateNFAStates(dfaState);
if(std::any_of(nfaStates.begin(), nfaStates.end(), [&](const automaton::State& nfaState) { return nfa.getFinalStates().count(nfaState); })) { if(std::any_of(nfaStates.begin(), nfaStates.end(), [&](const automaton::State& nfaState) { return nfa.getFinalStates().count(nfaState); })) {
res.addFinalState(dfaState); res.addFinalState(dfaState);
......
...@@ -130,10 +130,30 @@ set_move_iterator<Iterator> make_set_move_iterator (Iterator it) { ...@@ -130,10 +130,30 @@ set_move_iterator<Iterator> make_set_move_iterator (Iterator it) {
} }
   
template<class T> template<class T>
class moveable_set { class moveable_set_ref {
set<T>& theSet; set<T>& theSet;
public: 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() { set_move_iterator<typename set<T>::iterator> begin() {
return make_set_move_iterator(theSet.begin()); return make_set_move_iterator(theSet.begin());
...@@ -145,8 +165,8 @@ public: ...@@ -145,8 +165,8 @@ public:
}; };
   
template<class T> template<class T>
moveable_set<T> make_moveable_set (std::set<T>& set) { moveable_set<T> make_moveable_set (std::set<T>&& set) {
return moveable_set<T>(set); return moveable_set<T>(std::move(set));
} }
   
} /* namespace std */ } /* namespace std */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment