From a2e6f1008a7cc267175563e23debaf9799a9365f Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 29 Aug 2017 10:03:45 +0200
Subject: [PATCH] remove use of multiple dispatch from determinize

---
 .../src/automaton/determinize/Determinize.cpp | 39 ++++++-------------
 .../src/automaton/determinize/Determinize.h   |  9 ++---
 .../determinize/DeterminizeIDPDAPart.cxx      |  3 +-
 .../determinize/DeterminizeNFTAPart.cxx       |  3 +-
 .../determinize/DeterminizeRHDPDAPart.cxx     |  3 +-
 .../determinize/DeterminizeVPAPart.cxx        |  3 +-
 .../test-src/regexp/toAutomaton/re2faTest.cpp | 12 +++---
 7 files changed, 24 insertions(+), 48 deletions(-)

diff --git a/alib2algo/src/automaton/determinize/Determinize.cpp b/alib2algo/src/automaton/determinize/Determinize.cpp
index 1d6adcc57a..22cf405f66 100644
--- a/alib2algo/src/automaton/determinize/Determinize.cpp
+++ b/alib2algo/src/automaton/determinize/Determinize.cpp
@@ -26,53 +26,41 @@ namespace automaton {
 
 namespace determinize {
 
-automaton::Automaton Determinize::determinize(const automaton::Automaton& automaton) {
-	automaton::Automaton res = dispatch(automaton.getData());
-	res.normalize ( );
-	return res;
-}
-
 DFA<> Determinize::determinize(const automaton::DFA<>& automaton) {
 	return automaton;
 }
 
-auto DeterminizeDFA = registration::OverloadRegister < Determinize, automaton::DFA<>, automaton::DFA<> >(Determinize::determinize);
-auto DeterminizeDFA2 = registration::AbstractRegister < Determinize, automaton::DFA < >, const automaton::DFA < > & > ( Determinize::determinize );
+auto DeterminizeDFA = registration::AbstractRegister < Determinize, automaton::DFA < >, const automaton::DFA < > & > ( Determinize::determinize );
 
 DPDA < > Determinize::determinize(const automaton::DPDA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeDPDA = registration::OverloadRegister < Determinize, automaton::DPDA < >, automaton::DPDA < > >(Determinize::determinize);
-auto DeterminizeDPDA2 = registration::AbstractRegister < Determinize, automaton::DPDA < >, const automaton::DPDA < > & > ( Determinize::determinize );
+auto DeterminizeDPDA = registration::AbstractRegister < Determinize, automaton::DPDA < >, const automaton::DPDA < > & > ( Determinize::determinize );
 
 SinglePopDPDA < > Determinize::determinize(const automaton::SinglePopDPDA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeSinglePopDPDA = registration::OverloadRegister < Determinize, automaton::SinglePopDPDA < >, automaton::SinglePopDPDA < > >(Determinize::determinize);
-auto DeterminizeSinglePopDPDA2 = registration::AbstractRegister < Determinize, automaton::SinglePopDPDA < >, const automaton::SinglePopDPDA < > & > ( Determinize::determinize );
+auto DeterminizeSinglePopDPDA = registration::AbstractRegister < Determinize, automaton::SinglePopDPDA < >, const automaton::SinglePopDPDA < > & > ( Determinize::determinize );
 
 InputDrivenDPDA < > Determinize::determinize(const automaton::InputDrivenDPDA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeInputDrivenDPDA = registration::OverloadRegister < Determinize, automaton::InputDrivenDPDA < >, automaton::InputDrivenDPDA < > >(Determinize::determinize);
-auto DeterminizeInputDrivenDPDA2 = registration::AbstractRegister < Determinize, automaton::InputDrivenDPDA < >, const automaton::InputDrivenDPDA < > & > ( Determinize::determinize );
+auto DeterminizeInputDrivenDPDA = registration::AbstractRegister < Determinize, automaton::InputDrivenDPDA < >, const automaton::InputDrivenDPDA < > & > ( Determinize::determinize );
 
 VisiblyPushdownDPDA < > Determinize::determinize(const automaton::VisiblyPushdownDPDA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeVisiblyPushdownDPDA = registration::OverloadRegister < Determinize, automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownDPDA < > >(Determinize::determinize);
-auto DeterminizeVisiblyPushdownDPDA2 = registration::AbstractRegister < Determinize, automaton::VisiblyPushdownDPDA < >, const automaton::VisiblyPushdownDPDA < > & > ( Determinize::determinize );
+auto DeterminizeVisiblyPushdownDPDA = registration::AbstractRegister < Determinize, automaton::VisiblyPushdownDPDA < >, const automaton::VisiblyPushdownDPDA < > & > ( Determinize::determinize );
 
 RealTimeHeightDeterministicDPDA < > Determinize::determinize(const automaton::RealTimeHeightDeterministicDPDA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeRealTimeHeightDeterministicDPDA = registration::OverloadRegister < Determinize, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > >(Determinize::determinize);
-auto DeterminizeRealTimeHeightDeterministicDPDA2 = registration::AbstractRegister < Determinize, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::RealTimeHeightDeterministicDPDA < > & > ( Determinize::determinize );
+auto DeterminizeRealTimeHeightDeterministicDPDA = registration::AbstractRegister < Determinize, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::RealTimeHeightDeterministicDPDA < > & > ( Determinize::determinize );
 
 DPDA < > Determinize::determinize(const automaton::NPDA < > & automaton) {
 	automaton::RealTimeHeightDeterministicNPDA < > rhpda = automaton::PDAToRHPDA::convert(automaton);
@@ -80,29 +68,24 @@ DPDA < > Determinize::determinize(const automaton::NPDA < > & automaton) {
 	return automaton::RHPDAToPDA::convert(dpda);
 }
 
-auto DeterminizeNPDA = registration::OverloadRegister < Determinize, automaton::DPDA < >, automaton::NPDA < > >(Determinize::determinize);
-auto DeterminizeNPDA2 = registration::AbstractRegister < Determinize, automaton::DPDA < >, const automaton::NPDA < > & > ( Determinize::determinize );
+auto DeterminizeNPDA = registration::AbstractRegister < Determinize, automaton::DPDA < >, const automaton::NPDA < > & > ( Determinize::determinize );
 
 OneTapeDTM<> Determinize::determinize(const automaton::OneTapeDTM<>& automaton) {
 	return automaton;
 }
 
-auto DeterminizeOneTapeDTM = registration::OverloadRegister < Determinize, automaton::OneTapeDTM<>, automaton::OneTapeDTM < > >(Determinize::determinize);
-auto DeterminizeOneTapeDTM2 = registration::AbstractRegister < Determinize, automaton::OneTapeDTM < >, const automaton::OneTapeDTM < > & > ( Determinize::determinize );
+auto DeterminizeOneTapeDTM = registration::AbstractRegister < Determinize, automaton::OneTapeDTM < >, const automaton::OneTapeDTM < > & > ( Determinize::determinize );
 
 DFTA < > Determinize::determinize(const automaton::DFTA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeDFTA = registration::OverloadRegister < Determinize, automaton::DFTA < >, automaton::DFTA < > >(Determinize::determinize);
-auto DeterminizeDFTA2 = registration::AbstractRegister < Determinize, automaton::DFTA < >, const automaton::DFTA < > & > ( Determinize::determinize );
+auto DeterminizeDFTA = registration::AbstractRegister < Determinize, automaton::DFTA < >, const automaton::DFTA < > & > ( Determinize::determinize );
 
 
 
-auto DeterminizeMultiInitialStateNFA = registration::OverloadRegister < Determinize, automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > >, automaton::MultiInitialStateNFA < > > ( Determinize::determinize );
-auto DeterminizeMultiInitialStateNFA2 = registration::AbstractRegister < Determinize, automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::MultiInitialStateNFA < > & > ( Determinize::determinize );
-auto DeterminizeNFA = registration::OverloadRegister < Determinize, automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > >, automaton::NFA < > > ( Determinize::determinize );
-auto DeterminizeNFA2 = registration::AbstractRegister < Determinize, automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::NFA < > & > ( Determinize::determinize );
+auto DeterminizeMultiInitialStateNFA = registration::AbstractRegister < Determinize, automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::MultiInitialStateNFA < > & > ( Determinize::determinize );
+auto DeterminizeNFA = registration::AbstractRegister < Determinize, automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::NFA < > & > ( Determinize::determinize );
 
 } /* namespace determinize */
 
diff --git a/alib2algo/src/automaton/determinize/Determinize.h b/alib2algo/src/automaton/determinize/Determinize.h
index 8e1b3517d4..b3e40db045 100644
--- a/alib2algo/src/automaton/determinize/Determinize.h
+++ b/alib2algo/src/automaton/determinize/Determinize.h
@@ -8,7 +8,6 @@
 #ifndef DETERMINIZE_H_
 #define DETERMINIZE_H_
 
-#include <core/multipleDispatch.hpp>
 #include <set>
 
 #include <automaton/Automaton.h>
@@ -21,18 +20,16 @@ namespace determinize {
 /**
  * Class for running determinization algorithm on fsm.
  */
-class Determinize : public alib::SingleDispatch<Determinize, automaton::Automaton, const automaton::AutomatonBase &> {
+class Determinize {
 public:
 
+	static automaton::DFA<> determinize(const automaton::DFA<>& nfa);
+
 	/**
 	 * @param nfsm nondeterministic final-state machine given for determinization
 	 * @return DFA
 	 * Runs determinization algorithm on nondeterministic fsm given in constructor.
 	 */
-	static automaton::Automaton determinize(const automaton::Automaton& nfa);
-
-	static automaton::DFA<> determinize(const automaton::DFA<>& nfa);
-
 	template < class SymbolType, class StateType >
 	static automaton::DFA < SymbolType, ext::set < StateType > > determinize(const automaton::NFA < SymbolType, StateType > & nfa);
 
diff --git a/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cxx
index 22b62aadc0..2f6ca8e5e5 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cxx
+++ b/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cxx
@@ -70,8 +70,7 @@ automaton::InputDrivenDPDA < > Determinize::determinize ( const automaton::Input
 	return res;
 }
 
-auto DeterminizeInputDrivenNPDA = registration::OverloadRegister < Determinize, automaton::InputDrivenDPDA < >, automaton::InputDrivenNPDA < > > ( Determinize::determinize );
-auto DeterminizeInputDrivenNPDA2 = registration::AbstractRegister < Determinize, automaton::InputDrivenDPDA < >, const automaton::InputDrivenNPDA < > & > ( Determinize::determinize );
+auto DeterminizeInputDrivenNPDA = registration::AbstractRegister < Determinize, automaton::InputDrivenDPDA < >, const automaton::InputDrivenNPDA < > & > ( Determinize::determinize );
 
 } /* namespace determinize */
 
diff --git a/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cxx
index 3283ce647b..481a04502e 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cxx
+++ b/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cxx
@@ -94,8 +94,7 @@ DFTA < > Determinize::determinize(const NFTA < > & nfta) {
 	return res;
 }
 
-auto DeterminizeNFTA = registration::OverloadRegister < Determinize, automaton::DFTA < >, automaton::NFTA < > > ( Determinize::determinize );
-auto DeterminizeNFTA2 = registration::AbstractRegister < Determinize, automaton::DFTA < >, const automaton::NFTA < > & > ( Determinize::determinize );
+auto DeterminizeNFTA = registration::AbstractRegister < Determinize, automaton::DFTA < >, const automaton::NFTA < > & > ( Determinize::determinize );
 
 } /* namespace determinize */
 
diff --git a/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx
index 61d6ed13d0..5a3de30264 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx
+++ b/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx
@@ -277,8 +277,7 @@ automaton::RealTimeHeightDeterministicDPDA < > Determinize::determinize(const au
 	return d;
 }
 
-auto DeterminizeRealTimeHeightDeterministicNPDA = registration::OverloadRegister < Determinize, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( Determinize::determinize );
-auto DeterminizeRealTimeHeightDeterministicNPDA2 = registration::AbstractRegister < Determinize, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::RealTimeHeightDeterministicNPDA < > & > ( Determinize::determinize );
+auto DeterminizeRealTimeHeightDeterministicNPDA = registration::AbstractRegister < Determinize, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::RealTimeHeightDeterministicNPDA < > & > ( Determinize::determinize );
 
 } /* namespace determinize */
 
diff --git a/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cxx
index c7f2579ec8..700995357e 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cxx
+++ b/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cxx
@@ -205,8 +205,7 @@ automaton::VisiblyPushdownDPDA < > Determinize::determinize(const automaton::Vis
 	return d;
 }
 
-auto DeterminizeVisiblyPushdownNPDA = registration::OverloadRegister < Determinize, automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownNPDA < > > ( Determinize::determinize );
-auto DeterminizeVisiblyPushdownNPDA2 = registration::AbstractRegister < Determinize, automaton::VisiblyPushdownDPDA < >, const automaton::VisiblyPushdownNPDA < > & > ( Determinize::determinize );
+auto DeterminizeVisiblyPushdownNPDA = registration::AbstractRegister < Determinize, automaton::VisiblyPushdownDPDA < >, const automaton::VisiblyPushdownNPDA < > & > ( Determinize::determinize );
 
 } /* namespace determinize */
 
diff --git a/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp b/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
index b1b2190744..0a26602fa8 100644
--- a/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
+++ b/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
@@ -34,14 +34,14 @@ void re2faTest::testThompson() {
 
 	automaton::EpsilonNFA < > enfa2 = regexp::convert::ToAutomatonThompson::convert(regexp2);
 
-	automaton::Automaton nfa1 = automaton::simplify::EpsilonRemoverOutgoing::remove(automaton::Automaton(enfa1));
-	automaton::Automaton nfa2 = automaton::simplify::EpsilonRemoverOutgoing::remove(automaton::Automaton(enfa2));
+	automaton::MultiInitialStateNFA < > nfa1 = automaton::simplify::EpsilonRemoverOutgoing::remove(enfa1);
+	automaton::MultiInitialStateNFA < > nfa2 = automaton::simplify::EpsilonRemoverOutgoing::remove(enfa2);
 
-	automaton::Automaton dfa1 = automaton::determinize::Determinize::determinize(nfa1);
-	automaton::Automaton dfa2 = automaton::determinize::Determinize::determinize(nfa2);
+	automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > > dfa1 = automaton::determinize::Determinize::determinize(nfa1);
+	automaton::DFA < DefaultSymbolType, ext::set < DefaultStateType > > dfa2 = automaton::determinize::Determinize::determinize(nfa2);
 
-	automaton::Automaton mdfa1 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa1));
-	automaton::Automaton mdfa2 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa2));
+	automaton::DFA< DefaultSymbolType, unsigned > mdfa1 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa1));
+	automaton::DFA< DefaultSymbolType, unsigned > mdfa2 = automaton::simplify::Normalize::normalize(automaton::simplify::Minimize::minimize(dfa2));
 
 	CPPUNIT_ASSERT( mdfa1 == mdfa2);
 }
-- 
GitLab