From 4c0694212aed473d4f595215334ab7c4d207a6e5 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 11 Sep 2017 20:37:35 +0200
Subject: [PATCH] new registration of remaining arbology and automata algos

---
 .../exact/ExactPatternMatchingAutomaton.h     |  6 +--
 .../exact/ExactSubtreeMatchingAutomaton.h     |  1 -
 alib2algo/src/automaton/convert/ToGrammar.cpp |  9 +---
 alib2algo/src/automaton/convert/ToGrammar.h   | 22 +++------
 alib2algo/src/automaton/convert/ToRegExp.cpp  | 16 +++----
 alib2algo/src/automaton/convert/ToRegExp.h    | 45 ++++++++-----------
 .../properties/AllEpsilonClosure.cpp          | 16 +++----
 .../automaton/properties/AllEpsilonClosure.h  |  8 +---
 .../automaton/properties/EpsilonClosure.cpp   | 16 +++----
 .../src/automaton/properties/EpsilonClosure.h |  9 +---
 .../automaton/properties/ReachableStates.cpp  | 16 +++----
 .../automaton/properties/ReachableStates.h    | 11 ++---
 .../automaton/properties/UsefullStates.cpp    | 16 +++----
 .../src/automaton/properties/UsefullStates.h  | 10 ++---
 alib2algo/src/automaton/simplify/Total.cpp    | 11 +----
 alib2algo/src/automaton/simplify/Total.h      |  8 +---
 .../src/automaton/transform/PDAToRHPDA.cpp    | 12 ++---
 .../src/automaton/transform/PDAToRHPDA.h      |  9 +---
 .../src/automaton/transform/RHPDAToPDA.cpp    |  8 +---
 .../src/automaton/transform/RHPDAToPDA.h      |  9 +---
 20 files changed, 78 insertions(+), 180 deletions(-)

diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h
index 2cd5a6e1ea..75e98272ca 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h
+++ b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h
@@ -8,23 +8,19 @@
 #ifndef _EXACT_PATTERN_MATCHING_AUTOMATON_H__
 #define _EXACT_PATTERN_MATCHING_AUTOMATON_H__
 
-#include <automaton/Automaton.h>
 #include <automaton/AutomatonFeatures.h>
 #include <tree/TreeFeatures.h>
-#include <core/multipleDispatch.hpp>
 
 namespace arbology {
 
 namespace exact {
 
-class ExactPatternMatchingAutomaton : public alib::SingleDispatch < ExactPatternMatchingAutomaton, automaton::Automaton, const tree::TreeBase & > {
+class ExactPatternMatchingAutomaton {
 public:
 	/**
 	 * Performs conversion.
 	 * @return left regular grammar equivalent to source automaton.
 	 */
-	static automaton::Automaton construct ( const tree::Tree & pattern );
-
 	static automaton::NPDA < > construct ( const tree::PrefixRankedPattern < > & pattern );
 	static automaton::InputDrivenNPDA < > construct ( const tree::PrefixRankedTree < > & pattern );
 	static automaton::VisiblyPushdownNPDA < > construct ( const tree::PrefixRankedBarPattern < > & pattern );
diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h
index 1d50753d61..7ca9f9e037 100644
--- a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h
+++ b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h
@@ -10,7 +10,6 @@
 
 #include <automaton/AutomatonFeatures.h>
 #include <tree/TreeFeatures.h>
-#include <core/multipleDispatch.hpp>
 
 namespace arbology {
 
diff --git a/alib2algo/src/automaton/convert/ToGrammar.cpp b/alib2algo/src/automaton/convert/ToGrammar.cpp
index 24f5d08433..9c09db9d51 100644
--- a/alib2algo/src/automaton/convert/ToGrammar.cpp
+++ b/alib2algo/src/automaton/convert/ToGrammar.cpp
@@ -12,13 +12,8 @@ namespace automaton {
 
 namespace convert {
 
-grammar::Grammar ToGrammar::convert(const automaton::Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-auto ToGrammarNFA = registration::OverloadRegister < ToGrammar, grammar::Grammar, automaton::NFA < > >(ToGrammar::convert);
-
-auto ToGrammarDFA = registration::OverloadRegister < ToGrammar, grammar::Grammar, automaton::DFA < > >(ToGrammar::convert);
+auto ToGrammarNFA = registration::AbstractRegister < ToGrammar, grammar::RightRG < >, const automaton::NFA < > & > ( ToGrammar::convert );
+auto ToGrammarDFA = registration::AbstractRegister < ToGrammar, grammar::RightRG < >, const automaton::DFA < > & > ( ToGrammar::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToGrammar.h b/alib2algo/src/automaton/convert/ToGrammar.h
index 3aec97681e..eb75a107e1 100644
--- a/alib2algo/src/automaton/convert/ToGrammar.h
+++ b/alib2algo/src/automaton/convert/ToGrammar.h
@@ -8,43 +8,35 @@
 #ifndef _AUTOMATON_TO_GRAMMAR_H__
 #define _AUTOMATON_TO_GRAMMAR_H__
 
-#include <core/multipleDispatch.hpp>
-
 #include <grammar/Regular/LeftRG.h>
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
-
-#include <grammar/Grammar.h>
-#include <automaton/Automaton.h>
-
 #include "ToGrammarRightRG.h"
 
 namespace automaton {
 
 namespace convert {
 
-class ToGrammar : public alib::SingleDispatch<ToGrammar, grammar::Grammar, const automaton::AutomatonBase &> {
+class ToGrammar {
 public:
 	/**
 	 * Performs conversion.
 	 * @return left regular grammar equivalent to source automaton.
 	 */
-	static grammar::Grammar convert(const automaton::Automaton& automaton);
-
 	template < class SymbolType, class StateType >
-	static grammar::Grammar convert(const automaton::NFA < SymbolType, StateType > & automaton);
+	static grammar::RightRG < > convert(const automaton::NFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static grammar::Grammar convert(const automaton::DFA < SymbolType, StateType > & automaton);
+	static grammar::RightRG < > convert(const automaton::DFA < SymbolType, StateType > & automaton);
 };
 
 template < class SymbolType, class StateType >
-grammar::Grammar ToGrammar::convert(const automaton::NFA < SymbolType, StateType > & automaton) {
-	return grammar::Grammar(ToGrammarRightRG::convert(automaton));
+grammar::RightRG < > ToGrammar::convert(const automaton::NFA < SymbolType, StateType > & automaton) {
+	return grammar::RightRG < >(ToGrammarRightRG::convert(automaton));
 }
 
 template < class SymbolType, class StateType >
-grammar::Grammar ToGrammar::convert(const automaton::DFA < SymbolType, StateType > & automaton) {
-	return grammar::Grammar(ToGrammarRightRG::convert(automaton));
+grammar::RightRG < > ToGrammar::convert(const automaton::DFA < SymbolType, StateType > & automaton) {
+	return grammar::RightRG < >(ToGrammarRightRG::convert(automaton));
 }
 
 
diff --git a/alib2algo/src/automaton/convert/ToRegExp.cpp b/alib2algo/src/automaton/convert/ToRegExp.cpp
index 70c4788526..154c9cf3fe 100644
--- a/alib2algo/src/automaton/convert/ToRegExp.cpp
+++ b/alib2algo/src/automaton/convert/ToRegExp.cpp
@@ -12,16 +12,12 @@ namespace automaton {
 
 namespace convert {
 
-regexp::RegExp ToRegExp::convert(const automaton::Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-auto ToRegExpEpsilonNFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::EpsilonNFA < > > ( ToRegExp::convert );
-auto ToRegExpMultiInitialStateNFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::MultiInitialStateNFA < > > ( ToRegExp::convert );
-auto ToRegExpNFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::NFA < > > ( ToRegExp::convert );
-auto ToRegExpDFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::DFA < > > ( ToRegExp::convert );
-auto ToRegExpExtendedNFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::ExtendedNFA < > > ( ToRegExp::convert );
-auto ToRegExpCompactNFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::CompactNFA < > > ( ToRegExp::convert );
+auto ToRegExpEpsilonNFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::EpsilonNFA < > & > ( ToRegExp::convert );
+auto ToRegExpMultiInitialStateNFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::MultiInitialStateNFA < > & > ( ToRegExp::convert );
+auto ToRegExpNFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::NFA < > & > ( ToRegExp::convert );
+auto ToRegExpDFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::DFA < > & > ( ToRegExp::convert );
+auto ToRegExpExtendedNFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::ExtendedNFA < > & > ( ToRegExp::convert );
+auto ToRegExpCompactNFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::CompactNFA < > & > ( ToRegExp::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToRegExp.h b/alib2algo/src/automaton/convert/ToRegExp.h
index 2744723432..d67198a40a 100644
--- a/alib2algo/src/automaton/convert/ToRegExp.h
+++ b/alib2algo/src/automaton/convert/ToRegExp.h
@@ -8,73 +8,66 @@
 #ifndef _AUTOMATON_TO_REGEXP_H__
 #define _AUTOMATON_TO_REGEXP_H__
 
-#include <core/multipleDispatch.hpp>
-
 #include <automaton/FSM/DFA.h>
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/EpsilonNFA.h>
 #include <automaton/FSM/ExtendedNFA.h>
 #include <regexp/unbounded/UnboundedRegExp.h>
 
-#include <automaton/Automaton.h>
-#include <regexp/RegExp.h>
-
 #include "ToRegExpStateElimination.h"
 
 namespace automaton {
 
 namespace convert {
 
-class ToRegExp : public alib::SingleDispatch<ToRegExp, regexp::RegExp, const automaton::AutomatonBase &> {
+class ToRegExp {
 public:
 	/**
 	 * Performs conversion.
 	 * @return left regular grammar equivalent to source automaton.
 	 */
-	static regexp::RegExp convert(const automaton::Automaton& automaton);
-
 	template < class SymbolType, class EpsilonType, class StateType >
-	static regexp::RegExp convert(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static regexp::RegExp convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static regexp::RegExp convert(const automaton::NFA < SymbolType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::NFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static regexp::RegExp convert(const automaton::DFA < SymbolType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::DFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static regexp::RegExp convert(const automaton::ExtendedNFA < SymbolType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::ExtendedNFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static regexp::RegExp convert(const automaton::CompactNFA < SymbolType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::CompactNFA < SymbolType, StateType > & automaton);
 };
 
 template < class SymbolType, class EpsilonType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 template < class SymbolType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 template < class SymbolType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::NFA < SymbolType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::NFA < SymbolType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 template < class SymbolType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::DFA < SymbolType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::DFA < SymbolType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 template < class SymbolType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::ExtendedNFA < SymbolType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::ExtendedNFA < SymbolType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 template < class SymbolType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::CompactNFA < SymbolType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::CompactNFA < SymbolType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 } /* namespace convert */
diff --git a/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp b/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp
index 0b410f1f64..87f021d7fd 100644
--- a/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp
+++ b/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp
@@ -12,16 +12,12 @@ namespace automaton {
 
 namespace properties {
 
-auto AllEpsilonClosureEpsilonNFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::EpsilonNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-auto AllEpsilonClosureMultiInitialStateNFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::MultiInitialStateNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-auto AllEpsilonClosureNFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::NFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-auto AllEpsilonClosureDFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::DFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-auto AllEpsilonClosureExtendedNFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::ExtendedNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-auto AllEpsilonClosureCompactNFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::CompactNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-
-ext::map < DefaultStateType, ext::set < DefaultStateType > > AllEpsilonClosure::allEpsilonClosure ( const Automaton& automaton ) {
-	return dispatch ( automaton.getData ( ) );
-}
+auto AllEpsilonClosureEpsilonNFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::EpsilonNFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureMultiInitialStateNFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::MultiInitialStateNFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureNFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::NFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureDFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::DFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureExtendedNFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::ExtendedNFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureCompactNFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::CompactNFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/automaton/properties/AllEpsilonClosure.h b/alib2algo/src/automaton/properties/AllEpsilonClosure.h
index 09d7f574f5..bb9aae4f89 100644
--- a/alib2algo/src/automaton/properties/AllEpsilonClosure.h
+++ b/alib2algo/src/automaton/properties/AllEpsilonClosure.h
@@ -8,15 +8,11 @@
 #ifndef ALL_EPSILON_CLOSURE_H_
 #define ALL_EPSILON_CLOSURE_H_
 
-#include <core/multipleDispatch.hpp>
 #include <set>
 #include <map>
 #include <deque>
 #include <iostream>
 
-#include "automaton/Automaton.h"
-#include "automaton/AutomatonFeatures.h"
-
 #include <automaton/FSM/ExtendedNFA.h>
 #include <automaton/FSM/CompactNFA.h>
 #include <automaton/FSM/EpsilonNFA.h>
@@ -30,10 +26,8 @@ namespace automaton {
 
 namespace properties {
 
-class AllEpsilonClosure : public alib::SingleDispatch<AllEpsilonClosure, ext::map<DefaultStateType, ext::set<DefaultStateType>>, const automaton::AutomatonBase &> {
+class AllEpsilonClosure {
 public:
-	static ext::map<DefaultStateType, ext::set<DefaultStateType>> allEpsilonClosure( const automaton::Automaton & automaton);
-
 	/**
 	 * Computes allEpsilon closure of a state in allEpsilon nonfree automaton
 	 */
diff --git a/alib2algo/src/automaton/properties/EpsilonClosure.cpp b/alib2algo/src/automaton/properties/EpsilonClosure.cpp
index 9c6dbde563..43d584169c 100644
--- a/alib2algo/src/automaton/properties/EpsilonClosure.cpp
+++ b/alib2algo/src/automaton/properties/EpsilonClosure.cpp
@@ -12,16 +12,12 @@ namespace automaton {
 
 namespace properties {
 
-auto EpsilonClosureEpsilonNFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::EpsilonNFA < > > ( EpsilonClosure::epsilonClosure );
-auto EpsilonClosureMultiInitialStateNFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( EpsilonClosure::epsilonClosure );
-auto EpsilonClosureNFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::NFA < > > ( EpsilonClosure::epsilonClosure );
-auto EpsilonClosureDFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::DFA < > > ( EpsilonClosure::epsilonClosure );
-auto EpsilonClosureExtendedNFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::ExtendedNFA < > > ( EpsilonClosure::epsilonClosure );
-auto EpsilonClosureCompactNFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::CompactNFA < > > ( EpsilonClosure::epsilonClosure );
-
-ext::set < DefaultStateType > EpsilonClosure::epsilonClosure(const Automaton& automaton, const DefaultStateType& q) {
-	return dispatch(automaton.getData(), q);
-}
+auto EpsilonClosureEpsilonNFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::EpsilonNFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureMultiInitialStateNFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::MultiInitialStateNFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureNFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::NFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureDFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::DFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureExtendedNFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::ExtendedNFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureCompactNFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::CompactNFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/automaton/properties/EpsilonClosure.h b/alib2algo/src/automaton/properties/EpsilonClosure.h
index 4a4d5c5773..2832650496 100644
--- a/alib2algo/src/automaton/properties/EpsilonClosure.h
+++ b/alib2algo/src/automaton/properties/EpsilonClosure.h
@@ -8,16 +8,11 @@
 #ifndef EPSILON_CLOSURE_H_
 #define EPSILON_CLOSURE_H_
 
-#include <core/multipleDispatch.hpp>
 #include <algorithm>
-#include <deque>
 #include <queue>
 #include <set>
 #include <map>
 
-#include "automaton/Automaton.h"
-#include "automaton/AutomatonFeatures.h"
-
 #include <automaton/FSM/ExtendedNFA.h>
 #include <automaton/FSM/CompactNFA.h>
 #include <automaton/FSM/EpsilonNFA.h>
@@ -31,10 +26,8 @@ namespace automaton {
 
 namespace properties {
 
-class EpsilonClosure : public alib::SingleDispatch < EpsilonClosure, ext::set<DefaultStateType>, const automaton::AutomatonBase &, const DefaultStateType&> {
+class EpsilonClosure {
 public:
-	static ext::set<DefaultStateType> epsilonClosure( const automaton::Automaton & automaton, const DefaultStateType & state );
-
 	/**
 	 * Computes epsilon closure of a state in epsilon nonfree automaton
 	 */
diff --git a/alib2algo/src/automaton/properties/ReachableStates.cpp b/alib2algo/src/automaton/properties/ReachableStates.cpp
index c007dd0e0b..bee0e776c1 100644
--- a/alib2algo/src/automaton/properties/ReachableStates.cpp
+++ b/alib2algo/src/automaton/properties/ReachableStates.cpp
@@ -12,16 +12,12 @@ namespace automaton {
 
 namespace properties {
 
-ext::set<DefaultStateType> ReachableStates::reachableStates(const Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-auto ReachableStatesEpsilonNFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::EpsilonNFA < > > ( ReachableStates::reachableStates );
-auto ReachableStatesNFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::NFA < > > ( ReachableStates::reachableStates );
-auto ReachableStatesCompactNFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::CompactNFA < > > ( ReachableStates::reachableStates );
-auto ReachableStatesExtendedNFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::ExtendedNFA < > > ( ReachableStates::reachableStates );
-auto ReachableStatesMultiInitialStateNFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( ReachableStates::reachableStates );
-auto ReachableStatesDFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::DFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesEpsilonNFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::EpsilonNFA < > & > ( ReachableStates::reachableStates );
+auto ReachableStatesNFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::NFA < > & > ( ReachableStates::reachableStates );
+auto ReachableStatesCompactNFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::CompactNFA < > & > ( ReachableStates::reachableStates );
+auto ReachableStatesExtendedNFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::ExtendedNFA < > & > ( ReachableStates::reachableStates );
+auto ReachableStatesMultiInitialStateNFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::MultiInitialStateNFA < > &  > ( ReachableStates::reachableStates );
+auto ReachableStatesDFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::DFA < > & > ( ReachableStates::reachableStates );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/automaton/properties/ReachableStates.h b/alib2algo/src/automaton/properties/ReachableStates.h
index f1e9d8a8ab..c41a98f7b2 100644
--- a/alib2algo/src/automaton/properties/ReachableStates.h
+++ b/alib2algo/src/automaton/properties/ReachableStates.h
@@ -8,15 +8,10 @@
 #ifndef REACHABLE_STATES_H_
 #define REACHABLE_STATES_H_
 
-#include <core/multipleDispatch.hpp>
 #include <algorithm>
 #include <deque>
 #include <set>
 #include <map>
-#include <queue>
-
-#include <automaton/Automaton.h>
-#include <automaton/AutomatonFeatures.h>
 
 #include <automaton/FSM/ExtendedNFA.h>
 #include <automaton/FSM/CompactNFA.h>
@@ -24,14 +19,14 @@
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
 
+#include <automaton/Automaton.h>
+
 namespace automaton {
 
 namespace properties {
 
-class ReachableStates : public alib::SingleDispatch<ReachableStates, ext::set<DefaultStateType>, const automaton::AutomatonBase &> {
+class ReachableStates {
 public:
-	static ext::set<DefaultStateType> reachableStates( const automaton::Automaton & automaton );
-
 	/**
 	 * Removes dead states from FSM. Melichar 2.29
 	 */
diff --git a/alib2algo/src/automaton/properties/UsefullStates.cpp b/alib2algo/src/automaton/properties/UsefullStates.cpp
index 8ecf7f83cc..e7215bd1ae 100644
--- a/alib2algo/src/automaton/properties/UsefullStates.cpp
+++ b/alib2algo/src/automaton/properties/UsefullStates.cpp
@@ -12,16 +12,12 @@ namespace automaton {
 
 namespace properties {
 
-ext::set < DefaultStateType > UsefullStates::usefullStates(const Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-auto UsefullStatesEpsilonNFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::EpsilonNFA < > > ( UsefullStates::usefullStates );
-auto UsefullStatesNFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::NFA < > > ( UsefullStates::usefullStates );
-auto UsefullStatesCompactNFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::CompactNFA < > > ( UsefullStates::usefullStates );
-auto UsefullStatesExtendedNFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::ExtendedNFA < > > ( UsefullStates::usefullStates );
-auto UsefullStatesMultiInitialStateNFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( UsefullStates::usefullStates );
-auto UsefullStatesDFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::DFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesEpsilonNFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::EpsilonNFA < > & > ( UsefullStates::usefullStates );
+auto UsefullStatesNFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::NFA < > & > ( UsefullStates::usefullStates );
+auto UsefullStatesCompactNFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::CompactNFA < > & > ( UsefullStates::usefullStates );
+auto UsefullStatesExtendedNFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::ExtendedNFA < > & > ( UsefullStates::usefullStates );
+auto UsefullStatesMultiInitialStateNFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::MultiInitialStateNFA < > & > ( UsefullStates::usefullStates );
+auto UsefullStatesDFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::DFA < > & > ( UsefullStates::usefullStates );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/automaton/properties/UsefullStates.h b/alib2algo/src/automaton/properties/UsefullStates.h
index c755eb0f9b..cadd66bbbf 100644
--- a/alib2algo/src/automaton/properties/UsefullStates.h
+++ b/alib2algo/src/automaton/properties/UsefullStates.h
@@ -8,29 +8,25 @@
 #ifndef USEFULL_STATES_H_
 #define USEFULL_STATES_H_
 
-#include <core/multipleDispatch.hpp>
 #include <algorithm>
 #include <deque>
 #include <set>
 #include <map>
 
-#include <automaton/Automaton.h>
-#include <automaton/AutomatonFeatures.h>
-
 #include <automaton/FSM/ExtendedNFA.h>
 #include <automaton/FSM/CompactNFA.h>
 #include <automaton/FSM/EpsilonNFA.h>
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
 
+#include <automaton/Automaton.h>
+
 namespace automaton {
 
 namespace properties {
 
-class UsefullStates : public alib::SingleDispatch<UsefullStates, ext::set<DefaultStateType>, const automaton::AutomatonBase &> {
+class UsefullStates {
 public:
-	static ext::set<DefaultStateType> usefullStates( const automaton::Automaton & automaton );
-
 	/**
 	 * Removes dead states from FSM. Melichar 2.32
 	 */
diff --git a/alib2algo/src/automaton/simplify/Total.cpp b/alib2algo/src/automaton/simplify/Total.cpp
index 57fe6edaec..9a1dd622ac 100644
--- a/alib2algo/src/automaton/simplify/Total.cpp
+++ b/alib2algo/src/automaton/simplify/Total.cpp
@@ -12,15 +12,8 @@ namespace automaton {
 
 namespace simplify {
 
-automaton::Automaton Total::total(const Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-auto TotalNFA = registration::OverloadRegister < Total, automaton::NFA < >, automaton::NFA < > > ( Total::total );
-auto TotalDFA = registration::OverloadRegister < Total, automaton::DFA < >, automaton::DFA < > > ( Total::total );
-
-auto TotalNFA2 = registration::AbstractRegister < Total, automaton::NFA < >, const automaton::NFA < > & > ( Total::total );
-auto TotalDFA2 = registration::AbstractRegister < Total, automaton::DFA < >, const automaton::DFA < > & > ( Total::total );
+auto TotalNFA = registration::AbstractRegister < Total, automaton::NFA < >, const automaton::NFA < > & > ( Total::total );
+auto TotalDFA = registration::AbstractRegister < Total, automaton::DFA < >, const automaton::DFA < > & > ( Total::total );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/Total.h b/alib2algo/src/automaton/simplify/Total.h
index 3b16f35183..819f89621e 100644
--- a/alib2algo/src/automaton/simplify/Total.h
+++ b/alib2algo/src/automaton/simplify/Total.h
@@ -8,10 +8,6 @@
 #ifndef TOTAL_H_
 #define TOTAL_H_
 
-#include <core/multipleDispatch.hpp>
-#include "automaton/Automaton.h"
-#include "automaton/AutomatonFeatures.h"
-
 #include <exception/CommonException.h>
 
 #include <automaton/FSM/NFA.h>
@@ -27,13 +23,11 @@ namespace simplify {
  * Makes finite automaton's transition function total.
  * Source: Melichar: Algorithm 2.22
  */
-class Total : public alib::SingleDispatch<Total, automaton::Automaton, const automaton::AutomatonBase &> {
+class Total {
 public:
 	/**
 	 * Computes epsilon closure of a state in epsilon nonfree automaton
 	 */
-	static automaton::Automaton total(const automaton::Automaton& automaton);
-
 	template < class SymbolType, class StateType >
 	static automaton::NFA < SymbolType, StateType > total(const automaton::NFA < SymbolType, StateType > & automaton);
 
diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
index adbbd69152..6f2858ede0 100644
--- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
+++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
@@ -30,13 +30,13 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom
 	return pda;
 }
 
-auto PDAToRHPDARealTimeHeightDeterministicDPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( PDAToRHPDA::convert );
+auto PDAToRHPDARealTimeHeightDeterministicDPDA = registration::AbstractRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::RealTimeHeightDeterministicDPDA < > & > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const automaton::RealTimeHeightDeterministicNPDA < > & pda ) {
 	return pda;
 }
 
-auto PDAToRHPDARealTimeHeightDeterministicNPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicNPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( PDAToRHPDA::convert );
+auto PDAToRHPDARealTimeHeightDeterministicNPDA = registration::AbstractRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicNPDA < >, const automaton::RealTimeHeightDeterministicNPDA < > & > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const automaton::DPDA < > & pda ) {
 	DefaultStateType q0 = common::createUnique ( label::InitialStateLabel::instance < DefaultStateType > ( ), pda.getStates ( ) );
@@ -112,7 +112,7 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom
 	return res;
 }
 
-auto PDAToRHPDADPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicDPDA < >, automaton::DPDA < > > ( PDAToRHPDA::convert );
+auto PDAToRHPDADPDA = registration::AbstractRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::DPDA < > & > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const automaton::NPDA < > & pda ) {
 	RealTimeHeightDeterministicNPDA < > res ( alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ) );
@@ -186,11 +186,7 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom
 	return res;
 }
 
-auto PDAToRHPDANPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicNPDA < >, automaton::NPDA < > > ( PDAToRHPDA::convert );
-
-automaton::Automaton PDAToRHPDA::convert ( const Automaton & automaton ) {
-	return dispatch ( automaton.getData ( ) );
-}
+auto PDAToRHPDANPDA = registration::AbstractRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicNPDA < >, const automaton::NPDA < > & > ( PDAToRHPDA::convert );
 
 } /* namespace automaton */
 
diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.h b/alib2algo/src/automaton/transform/PDAToRHPDA.h
index b05ed48871..55f96356c0 100644
--- a/alib2algo/src/automaton/transform/PDAToRHPDA.h
+++ b/alib2algo/src/automaton/transform/PDAToRHPDA.h
@@ -8,27 +8,20 @@
 #ifndef PDA_TO_RHPDA_H_
 #define PDA_TO_RHPDA_H_
 
-#include <core/multipleDispatch.hpp>
 #include <algorithm>
 #include <deque>
 #include <set>
 
-#include "automaton/Automaton.h"
 #include "automaton/AutomatonFeatures.h"
 
 namespace automaton {
 
-class PDAToRHPDA : public alib::SingleDispatch<PDAToRHPDA, automaton::Automaton, const automaton::AutomatonBase &> {
+class PDAToRHPDA {
 public:
 	static automaton::RealTimeHeightDeterministicDPDA < > convert( const automaton::RealTimeHeightDeterministicDPDA < > & pda);
 	static automaton::RealTimeHeightDeterministicDPDA < > convert( const automaton::DPDA < > & pda);
 	static automaton::RealTimeHeightDeterministicNPDA < > convert( const automaton::RealTimeHeightDeterministicNPDA < > & pda);
 	static automaton::RealTimeHeightDeterministicNPDA < > convert( const automaton::NPDA < > & pda);
-
-	/**
-	 * Computes epsilon closure of a state in epsilon nonfree automaton
-	 */
-	static automaton::Automaton convert( const automaton::Automaton & automaton );
 };
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
index db4497764c..32280ad8b2 100644
--- a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
+++ b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
@@ -156,7 +156,7 @@ automaton::DPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDetermi
 	return res;
 }
 
-auto RHPDAToPDARealTimeHeightDeterministicDPDA = registration::OverloadRegister < RHPDAToPDA, automaton::DPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( RHPDAToPDA::convert );
+auto RHPDAToPDARealTimeHeightDeterministicDPDA = registration::AbstractRegister < RHPDAToPDA, automaton::DPDA < >, const automaton::RealTimeHeightDeterministicDPDA < > & > ( RHPDAToPDA::convert );
 
  // This may not work correctly -- generation of initial state and initial symbol
 automaton::NPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDeterministicNPDA < > & pda ) {
@@ -272,11 +272,7 @@ automaton::NPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDetermi
 	return res;
 }
 
-auto RHPDAToPDARealTimeHeightDeterministicNPDA = registration::OverloadRegister < RHPDAToPDA, automaton::NPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( RHPDAToPDA::convert );
-
-automaton::Automaton RHPDAToPDA::convert ( const Automaton & automaton ) {
-	return dispatch ( automaton.getData ( ) );
-}
+auto RHPDAToPDARealTimeHeightDeterministicNPDA = registration::AbstractRegister < RHPDAToPDA, automaton::NPDA < >, const automaton::RealTimeHeightDeterministicNPDA < > & > ( RHPDAToPDA::convert );
 
 } /* namespace automaton */
 
diff --git a/alib2algo/src/automaton/transform/RHPDAToPDA.h b/alib2algo/src/automaton/transform/RHPDAToPDA.h
index bdc5bcd6a5..b70158301a 100644
--- a/alib2algo/src/automaton/transform/RHPDAToPDA.h
+++ b/alib2algo/src/automaton/transform/RHPDAToPDA.h
@@ -8,27 +8,20 @@
 #ifndef RHPDA_TO_PDA_H_
 #define RHPDA_TO_PDA_H_
 
-#include <core/multipleDispatch.hpp>
 #include <algorithm>
 #include <deque>
 #include <set>
 
-#include "automaton/Automaton.h"
 #include "automaton/AutomatonFeatures.h"
 
 namespace automaton {
 
-class RHPDAToPDA : public alib::SingleDispatch<RHPDAToPDA, automaton::Automaton, const automaton::AutomatonBase &> {
+class RHPDAToPDA {
 public:
 	static automaton::DPDA < > convert( const automaton::RealTimeHeightDeterministicDPDA < > & pda);
 	static automaton::DPDA < > convert( const automaton::DPDA < > & pda);
 	static automaton::NPDA < > convert( const automaton::RealTimeHeightDeterministicNPDA < > & pda);
 	static automaton::NPDA < > convert( const automaton::NPDA < > & pda);
-
-	/**
-	 * Computes epsilon closure of a state in epsilon nonfree automaton
-	 */
-	static automaton::Automaton convert( const automaton::Automaton & automaton );
 };
 
 } /* namespace automaton */
-- 
GitLab