diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h index 2cd5a6e1ea4ace1f11c98e6d3e5f906d1dcb994d..75e98272caca794e5558fcecc903137c0a921b77 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 1d50753d61ddfe21890cd148c349d2eafc792022..7ca9f9e0370c0b3cb735b9defe0b20c6f335d0d1 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 24f5d08433465d087633a0597ac020c6acb3cf52..9c09db9d51f8a2ad203ea3b9da0319c21ac6cc6a 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 3aec97681e9d13716def77a6121d83fcc2b95c3c..eb75a107e131b2cf71672275a3ad38772f6380ad 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 70c4788526f5d0a9d4a83e633b3828825e7a6213..154c9cf3fe435265e7cdfa6746fc4f5c2ed07797 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 2744723432feb5113d2e59e08a9543acedaea357..d67198a40a129eb25ddfa8f1e745f01125ed517b 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 0b410f1f6496f978715b1baeea8a12824c0d23c9..87f021d7fdca51badafc654bcbc1941912681754 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 09d7f574f50e77aa9912a93525a95c785c3ffa85..bb9aae4f893f1e44765a1d276497ef1d654dd7df 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 9c6dbde56372b36d829a42029d467b9cc9e27f68..43d584169c3f7db743b6bb11f11094e33724d9c4 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 4a4d5c5773269ddd9a470f286d666a406633d636..28326504968c0c9576480b3014a38cad16a4ff38 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 c007dd0e0b03f10730c0d8f3bd3c47f0e53bc4d9..bee0e776c11762c5bef4f5152583edec2190029a 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 f1e9d8a8ab315a8d7ea27ed868af5c3528e7d373..c41a98f7b2ec9bb4ff0483eee16884d7f709e998 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 8ecf7f83ccd2b7daaa1913eaccda2f8815f251d8..e7215bd1ae99ebafa5bf8807fa487327fc3b80c1 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 c755eb0f9b440986fefacfec2ed2a102d1af9096..cadd66bbbfb33a82e486e188ecde5149d60661bd 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 57fe6edaecc746235c64ac1d864793da7dac9b2d..9a1dd622ac9629d9b30536916e8f8ddec7d6aa4f 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 3b16f3518314fc528e50d31585473100c9cd8ab4..819f89621e5e44068d61adcee5d69b3d52d73f80 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 adbbd691520edabcf842ded24cfaf1aa6b454068..6f2858ede0b7bc79331edb82c9f493710682e4f4 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 b05ed48871528b52ec86eea7cc7a591bc79bfe44..55f96356c060c47f0e044ee1d964f83e6afcd304 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 db4497764c9a9575a881cf2d01db8b94a637f2ba..32280ad8b2c13f3b9242b6f39d293c9f36d1e30f 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 bdc5bcd6a58c9f1ee39d2c24967aff8bf91609f6..b70158301affec0276e8d4a35bea48fcad5423ec 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 */