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