diff --git a/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx index a7fed4fb757a635bfa4d1cef6135729cacbabf3c..7c2a496509ae853f1a5887294cea1696838a5651 100644 --- a/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx +++ b/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx @@ -15,7 +15,7 @@ namespace automaton { namespace determinize { -void addRetTransition(const DefaultStateType& from, const std::variant<DefaultEpsilonType, DefaultSymbolType>& input, const DefaultSymbolType& dvpdaSymbol, const DefaultStateType& to, automaton::RealTimeHeightDeterministicDPDA < > & deterministic) { +void addRetTransition(const DefaultStateType& from, const ext::variant<DefaultEpsilonType, DefaultSymbolType>& input, const DefaultSymbolType& dvpdaSymbol, const DefaultStateType& to, automaton::RealTimeHeightDeterministicDPDA < > & deterministic) { deterministic.addState(from); deterministic.addState(to); deterministic.addPushdownStoreSymbol(dvpdaSymbol); @@ -23,7 +23,7 @@ void addRetTransition(const DefaultStateType& from, const std::variant<DefaultEp deterministic.addReturnTransition(from, input, dvpdaSymbol, to); } -void retInitial(const DefaultStateType& state, const DefaultSymbolType& pdaSymbol, const std::variant<DefaultEpsilonType, DefaultSymbolType>& input, const automaton::RealTimeHeightDeterministicNPDA < > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < > & deterministic, std::map<std::tuple<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType>, DefaultStateType>& rubbishReturnTransitions) { +void retInitial(const DefaultStateType& state, const DefaultSymbolType& pdaSymbol, const ext::variant<DefaultEpsilonType, DefaultSymbolType>& input, const automaton::RealTimeHeightDeterministicNPDA < > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < > & deterministic, std::map<std::tuple<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType>, DefaultStateType>& rubbishReturnTransitions) { const std::set<std::pair<DefaultStateType, DefaultStateType>> & S = unpackFromStateLabel(state); std::set<std::pair<DefaultStateType, DefaultStateType>> S1; @@ -46,16 +46,16 @@ void retInitial(const DefaultStateType& state, const DefaultSymbolType& pdaSymbo bool S1Empty = S1.empty(); DefaultStateType to(packToStateLabel(std::move(S1))); if(S1Empty) { - std::tuple<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType> key(state, input, pdaSymbol); + std::tuple<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType> key(state, input, pdaSymbol); rubbishReturnTransitions.insert(std::make_pair(key, to)); } else { addRetTransition(state, input, pdaSymbol, to, deterministic); } } -void ret(const DefaultStateType& state, const DefaultSymbolType& pdaSymbol, const std::variant<DefaultEpsilonType, DefaultSymbolType>& input, const automaton::RealTimeHeightDeterministicNPDA < > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < > & deterministic, std::map<std::tuple<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType>, DefaultStateType>& rubbishReturnTransitions) { +void ret(const DefaultStateType& state, const DefaultSymbolType& pdaSymbol, const ext::variant<DefaultEpsilonType, DefaultSymbolType>& input, const automaton::RealTimeHeightDeterministicNPDA < > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < > & deterministic, std::map<std::tuple<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType>, DefaultStateType>& rubbishReturnTransitions) { const std::set<std::pair<DefaultStateType, DefaultStateType>> & S = unpackFromStateLabel(state); - const std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>> & pdaSymbolUnpack = unpackFromDRHDPDAStackSymbol(pdaSymbol); + const std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>> & pdaSymbolUnpack = unpackFromDRHDPDAStackSymbol(pdaSymbol); const std::set<std::pair<DefaultStateType, DefaultStateType>>& S1 = unpackFromStateLabel ( pdaSymbolUnpack.first ); std::set<std::pair<DefaultStateType, DefaultStateType>> update; @@ -103,14 +103,14 @@ void ret(const DefaultStateType& state, const DefaultSymbolType& pdaSymbol, cons bool S2Empty = S2.empty(); DefaultStateType to(packToStateLabel(std::move(S2))); if(S2Empty) { - std::tuple<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType> key(state, input, pdaSymbol); + std::tuple<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType> key(state, input, pdaSymbol); rubbishReturnTransitions.insert(std::make_pair(key, to)); } else { addRetTransition(state, input, pdaSymbol, to, deterministic); } } -void addCallTransition(const DefaultStateType& from, const std::variant<DefaultEpsilonType, DefaultSymbolType>& input, const DefaultStateType& to, const DefaultSymbolType& dvpdaSymbol, automaton::RealTimeHeightDeterministicDPDA < > & deterministic) { +void addCallTransition(const DefaultStateType& from, const ext::variant<DefaultEpsilonType, DefaultSymbolType>& input, const DefaultStateType& to, const DefaultSymbolType& dvpdaSymbol, automaton::RealTimeHeightDeterministicDPDA < > & deterministic) { deterministic.addState(from); deterministic.addState(to); deterministic.addPushdownStoreSymbol(dvpdaSymbol); @@ -118,7 +118,7 @@ void addCallTransition(const DefaultStateType& from, const std::variant<DefaultE deterministic.addCallTransition(from, input, to, dvpdaSymbol); } -void call(const DefaultStateType& state, const std::variant<DefaultEpsilonType, DefaultSymbolType>& input, const automaton::RealTimeHeightDeterministicNPDA < > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < > & deterministic, std::map<std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>>, std::pair<DefaultStateType, DefaultSymbolType> >& rubbishCallTransitions) { +void call(const DefaultStateType& state, const ext::variant<DefaultEpsilonType, DefaultSymbolType>& input, const automaton::RealTimeHeightDeterministicNPDA < > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < > & deterministic, std::map<std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>>, std::pair<DefaultStateType, DefaultSymbolType> >& rubbishCallTransitions) { const std::set<std::pair<DefaultStateType, DefaultStateType>> & S = unpackFromStateLabel(state); std::set<DefaultStateType> R = retrieveDSubSet(S); @@ -147,14 +147,14 @@ void call(const DefaultStateType& state, const std::variant<DefaultEpsilonType, } } -void addLocalTransition(const DefaultStateType& from, const std::variant<DefaultEpsilonType, DefaultSymbolType>& input, const DefaultStateType& to, automaton::RealTimeHeightDeterministicDPDA < > & deterministic) { +void addLocalTransition(const DefaultStateType& from, const ext::variant<DefaultEpsilonType, DefaultSymbolType>& input, const DefaultStateType& to, automaton::RealTimeHeightDeterministicDPDA < > & deterministic) { deterministic.addState(from); deterministic.addState(to); deterministic.addLocalTransition(from, input, to); } -void local(const DefaultStateType& state, const std::variant<DefaultEpsilonType, DefaultSymbolType>& input, const automaton::RealTimeHeightDeterministicNPDA < > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < > & deterministic, std::map<std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>>, DefaultStateType>& rubbishLocalTransitions ) { +void local(const DefaultStateType& state, const ext::variant<DefaultEpsilonType, DefaultSymbolType>& input, const automaton::RealTimeHeightDeterministicNPDA < > & nondeterministic, automaton::RealTimeHeightDeterministicDPDA < > & deterministic, std::map<std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>>, DefaultStateType>& rubbishLocalTransitions ) { const std::set<std::pair<DefaultStateType, DefaultStateType>> & S = unpackFromStateLabel(state); std::set<std::pair<DefaultStateType, DefaultStateType>> S1; @@ -182,10 +182,10 @@ void local(const DefaultStateType& state, const std::variant<DefaultEpsilonType, } } -std::tuple<std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>> getLocalCallRetPartitioning(const automaton::RealTimeHeightDeterministicNPDA < > & n, const DefaultStateType& state) { - std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>> local; - std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>> call; - std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>> ret; +std::tuple<std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>> getLocalCallRetPartitioning(const automaton::RealTimeHeightDeterministicNPDA < > & n, const DefaultStateType& state) { + std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>> local; + std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>> call; + std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>> ret; const std::set<DefaultStateType> dSubSet = retrieveDSubSet(unpackFromStateLabel(state)); @@ -214,9 +214,9 @@ automaton::RealTimeHeightDeterministicDPDA < > Determinize::determinize(const au d.setInputAlphabet(n.getInputAlphabet()); std::set<DefaultStateType> rubbishStates = {DefaultStateType(packToStateLabel({}))}; - std::map<std::tuple<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType>, DefaultStateType> rubbishReturnTransitions; - std::map<std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>>, std::pair<DefaultStateType, DefaultSymbolType> > rubbishCallTransitions; - std::map<std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>>, DefaultStateType> rubbishLocalTransitions; + std::map<std::tuple<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType>, DefaultStateType> rubbishReturnTransitions; + std::map<std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>>, std::pair<DefaultStateType, DefaultSymbolType> > rubbishCallTransitions; + std::map<std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>>, DefaultStateType> rubbishLocalTransitions; for(;;) { std::set<std::pair<DefaultStateType, DefaultSymbolType>> stateSymbols = existsDirtyStateSymbol(d, rubbishStates, rubbishCallTransitions, rubbishReturnTransitions, n); @@ -228,9 +228,9 @@ automaton::RealTimeHeightDeterministicDPDA < > Determinize::determinize(const au if ( common::GlobalData::verbose ) std::clog << "Dirty state symbol: " << stateSymbol << std::endl; - std::tuple<std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>> partitioning = getLocalCallRetPartitioning(n, stateSymbol.first); + std::tuple<std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>> partitioning = getLocalCallRetPartitioning(n, stateSymbol.first); - std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>& retPart = std::get<2>(partitioning); + std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>& retPart = std::get<2>(partitioning); for(const auto& symbol : retPart) { if(stateSymbol.second == d.getBottomOfTheStackSymbol()) { @@ -244,10 +244,10 @@ automaton::RealTimeHeightDeterministicDPDA < > Determinize::determinize(const au for(const auto& state : states) { if ( common::GlobalData::verbose ) std::clog << "Dirty state: " << state << std::endl; - std::tuple<std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>> partitioning = getLocalCallRetPartitioning(n, state); + std::tuple<std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>, std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>> partitioning = getLocalCallRetPartitioning(n, state); - std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>& localPart = std::get<0>(partitioning); - std::set<std::variant<DefaultEpsilonType, DefaultSymbolType>>& callPart = std::get<1>(partitioning); + std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>& localPart = std::get<0>(partitioning); + std::set<ext::variant<DefaultEpsilonType, DefaultSymbolType>>& callPart = std::get<1>(partitioning); for(const auto& symbol : localPart) { local(state, symbol, n, d, rubbishLocalTransitions); diff --git a/alib2algo/src/automaton/determinize/common/RHDPDACommon.cpp b/alib2algo/src/automaton/determinize/common/RHDPDACommon.cpp index 990a6433afba3a379eb8bf3ff7385c13281d752b..4949f25245c27b9eafbf72b033ea6221c6119b25 100644 --- a/alib2algo/src/automaton/determinize/common/RHDPDACommon.cpp +++ b/alib2algo/src/automaton/determinize/common/RHDPDACommon.cpp @@ -28,12 +28,12 @@ const std::pair<DefaultStateType, DefaultSymbolType> & unpackFromDVPAStackSymbol return static_cast < const alib::AnyObject < std::pair<DefaultStateType, DefaultSymbolType> > & > ( symbol.getData ( ) ).getData ( ); } -DefaultSymbolType packToStackSymbolLabel(std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>>&& data) { - return DefaultSymbolType ( alib::AnyObject < std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>> > ( std::move ( data ) ) ); +DefaultSymbolType packToStackSymbolLabel(std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>>&& data) { + return DefaultSymbolType ( alib::AnyObject < std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>> > ( std::move ( data ) ) ); } -const std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>> & unpackFromDRHDPDAStackSymbol(const DefaultSymbolType& symbol) { - return static_cast < const alib::AnyObject < std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>> > & > ( symbol.getData ( ) ).getData ( ); +const std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>> & unpackFromDRHDPDAStackSymbol(const DefaultSymbolType& symbol) { + return static_cast < const alib::AnyObject < std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>> > & > ( symbol.getData ( ) ).getData ( ); } std::set<DefaultStateType> retrieveDSubSet(const std::set<std::pair<DefaultStateType, DefaultStateType>>& localOperation) { @@ -105,7 +105,7 @@ std::set<DefaultStateType> existsDirtyState(const T& d, const std::set<DefaultSt } template std::set<DefaultStateType> existsDirtyState(const automaton::VisiblyPushdownDPDA < > & d, const std::set<DefaultStateType>& rubbishStates, const std::map<std::pair<DefaultStateType, DefaultSymbolType>, std::pair<DefaultStateType, DefaultSymbolType> >& rubbishCallTransitions, const std::map<std::pair<DefaultStateType, DefaultSymbolType>, DefaultStateType>& rubbishLocalTransitions, const automaton::VisiblyPushdownNPDA < > & n); -template std::set<DefaultStateType> existsDirtyState(const automaton::RealTimeHeightDeterministicDPDA < > & d, const std::set<DefaultStateType>& rubbishStates, const std::map<std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>>, std::pair<DefaultStateType, DefaultSymbolType> >& rubbishCallTransitions, const std::map<std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>>, DefaultStateType>& rubbishLocalTransitions, const automaton::RealTimeHeightDeterministicNPDA < > & n); +template std::set<DefaultStateType> existsDirtyState(const automaton::RealTimeHeightDeterministicDPDA < > & d, const std::set<DefaultStateType>& rubbishStates, const std::map<std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>>, std::pair<DefaultStateType, DefaultSymbolType> >& rubbishCallTransitions, const std::map<std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>>, DefaultStateType>& rubbishLocalTransitions, const automaton::RealTimeHeightDeterministicNPDA < > & n); void localClosure(std::set<DefaultStateType>& states, const std::set<DefaultStateType>& oldStates, const automaton::RealTimeHeightDeterministicDPDA < > & d) { std::set<DefaultStateType> newStates; @@ -226,7 +226,7 @@ std::set<std::pair<DefaultStateType, DefaultSymbolType>> existsDirtyStateSymbol( } template std::set<std::pair<DefaultStateType, DefaultSymbolType>> existsDirtyStateSymbol(const automaton::VisiblyPushdownDPDA < > & d, const std::set<DefaultStateType>& rubbishStates, const std::map<std::pair<DefaultStateType, DefaultSymbolType>, std::pair<DefaultStateType, DefaultSymbolType> >& rubbishCallTransitions, const std::map<std::tuple<DefaultStateType, DefaultSymbolType, DefaultSymbolType>, DefaultStateType>& rubbishReturnTransitions, const automaton::VisiblyPushdownNPDA < > & n); -template std::set<std::pair<DefaultStateType, DefaultSymbolType>> existsDirtyStateSymbol(const automaton::RealTimeHeightDeterministicDPDA < > & d, const std::set<DefaultStateType>& rubbishStates, const std::map<std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>>, std::pair<DefaultStateType, DefaultSymbolType> >& rubbishCallTransitions, const std::map<std::tuple<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType>, DefaultStateType>& rubbishReturnTransitions, const automaton::RealTimeHeightDeterministicNPDA < > & n); +template std::set<std::pair<DefaultStateType, DefaultSymbolType>> existsDirtyStateSymbol(const automaton::RealTimeHeightDeterministicDPDA < > & d, const std::set<DefaultStateType>& rubbishStates, const std::map<std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>>, std::pair<DefaultStateType, DefaultSymbolType> >& rubbishCallTransitions, const std::map<std::tuple<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultSymbolType>, DefaultStateType>& rubbishReturnTransitions, const automaton::RealTimeHeightDeterministicNPDA < > & n); } /* namespace automaton */ diff --git a/alib2algo/src/automaton/determinize/common/RHDPDACommon.h b/alib2algo/src/automaton/determinize/common/RHDPDACommon.h index ffe0fa28c7aaf18d7478aa576916daea26f543d8..c33e436307e2f6771063bb5450ba931e54acd68b 100644 --- a/alib2algo/src/automaton/determinize/common/RHDPDACommon.h +++ b/alib2algo/src/automaton/determinize/common/RHDPDACommon.h @@ -22,9 +22,9 @@ DefaultSymbolType packToStackSymbolLabel(std::pair<DefaultStateType, DefaultSymb const std::pair<DefaultStateType, DefaultSymbolType> & unpackFromDVPAStackSymbol(const DefaultSymbolType& symbol); -DefaultSymbolType packToStackSymbolLabel(std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>>&& data); +DefaultSymbolType packToStackSymbolLabel(std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>>&& data); -const std::pair<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>> & unpackFromDRHDPDAStackSymbol(const DefaultSymbolType& symbol); +const std::pair<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>> & unpackFromDRHDPDAStackSymbol(const DefaultSymbolType& symbol); std::set<DefaultStateType> retrieveDSubSet(const std::set<std::pair<DefaultStateType, DefaultStateType>>& localOperation); diff --git a/alib2algo/src/automaton/generate/RandomizeAutomaton.h b/alib2algo/src/automaton/generate/RandomizeAutomaton.h index bdb0eeec0fb4fe195499617d83eb16b7f1299b6d..b7267a607a718647446c3535dca762ac5a4f4ae7 100644 --- a/alib2algo/src/automaton/generate/RandomizeAutomaton.h +++ b/alib2algo/src/automaton/generate/RandomizeAutomaton.h @@ -107,7 +107,7 @@ automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > RandomizeAutomaton: for ( const StateType & finalState : origFSM.getFinalStates ( ) ) res.addFinalState ( statePermutationMap.find ( finalState )->second ); - for ( const std::pair < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < SymbolType > > & transition : origFSM.getTransitions ( ) ) + for ( const std::pair < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < SymbolType > > & transition : origFSM.getTransitions ( ) ) for ( const StateType & target : transition.second ) res.addTransition ( statePermutationMap.find ( transition.first.first )->second, transition.first.second, statePermutationMap.find ( target )->second ); diff --git a/alib2algo/src/automaton/properties/EpsilonClosure.h b/alib2algo/src/automaton/properties/EpsilonClosure.h index 380d314bc2886d1af430f6935af9572fbc88a562..0b639089c900bd29725a5609c4e7d69f4531726d 100644 --- a/alib2algo/src/automaton/properties/EpsilonClosure.h +++ b/alib2algo/src/automaton/properties/EpsilonClosure.h @@ -70,7 +70,7 @@ std::set<StateType> EpsilonClosure::epsilonClosure( const automaton::EpsilonNFA visited[ p ] = true; closure.insert( p ); - auto tos = fsm.getTransitions( ).find(std::make_pair ( p, std::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ) ) ); + auto tos = fsm.getTransitions( ).find(std::make_pair ( p, ext::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ) ) ); if(tos == fsm.getTransitions().end()) continue; for( const auto & to : tos->second ) diff --git a/alib2algo/src/automaton/simplify/Normalize.h b/alib2algo/src/automaton/simplify/Normalize.h index 29a678f5fbf8b7ba1ebb0dc9805ab7906222110c..c67f3b6596d07492ab80f6b29945f6bb8339f2fb 100644 --- a/alib2algo/src/automaton/simplify/Normalize.h +++ b/alib2algo/src/automaton/simplify/Normalize.h @@ -91,10 +91,10 @@ automaton::DPDA < InputSymbolType, EpsilonType, unsigned, unsigned > Normalize:: StateType current = std::move ( processingData.front() ); processingData.pop_front(); - std::map < std::pair < std::variant < EpsilonType, InputSymbolType >, std::vector < unsigned > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > transform; + std::map < std::pair < ext::variant < EpsilonType, InputSymbolType >, std::vector < unsigned > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > transform; bool stateFinished = true; // For each transition from state current - for ( const std::pair < const std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > & iter : pda.getTransitionsFromState(current)) { + for ( const std::pair < const std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > & iter : pda.getTransitionsFromState(current)) { // look whether all poped symbols are already transformed if(std::all_of(std::get<2>(iter.first).begin(), std::get<2>(iter.first).end(), [&](const PushdownStoreSymbolType& symbol) { return normalizationDataSymbol.find(symbol) != normalizationDataSymbol.end(); })) { std::vector < unsigned > transformedSymbols; diff --git a/alib2algo/src/grammar/generate/CockeYoungerKasami.h b/alib2algo/src/grammar/generate/CockeYoungerKasami.h index 371b79a401635acaf60f5abf7c8b64769f0dcfa8..b3bdb7bba55b8c7440f0d510efcf9d716b137df1 100644 --- a/alib2algo/src/grammar/generate/CockeYoungerKasami.h +++ b/alib2algo/src/grammar/generate/CockeYoungerKasami.h @@ -44,10 +44,10 @@ bool CockeYoungerKasami::generate ( const grammar::CNF < SymbolType > & grammar, data[i].resize ( stringSize - i ); for ( unsigned i = 0; i < stringSize; i++ ) - for ( const std::pair < const SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > rule : grammar.getRules ( ) ) { + for ( const std::pair < const SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > rule : grammar.getRules ( ) ) { const SymbolType & lhs = rule.first; - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs : rule.second ) + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs : rule.second ) if ( rhs.template is < SymbolType > ( ) && ( rhs.template get < SymbolType > ( ) == string.getContent ( )[i] ) ) data[0][i].insert ( lhs ); @@ -64,10 +64,10 @@ bool CockeYoungerKasami::generate ( const grammar::CNF < SymbolType > & grammar, for ( const SymbolType & verticalElement : vertical ) { for ( const SymbolType & diagonalElement : diagonal ) - for ( const std::pair < const SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > rule : grammar.getRules ( ) ) { + for ( const std::pair < const SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > rule : grammar.getRules ( ) ) { const SymbolType & lhs = rule.first; - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs : rule.second ) + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs : rule.second ) if ( rhs.template is < std::pair < SymbolType, SymbolType > > ( ) ) { const std::pair < SymbolType, SymbolType > rhsp = rhs.template get < std::pair < SymbolType, SymbolType > > ( ); diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.h b/alib2algo/src/grammar/generate/RandomizeGrammar.h index 7b42a8765e7b14c1437c9edd0bfef1ae875cdeec..fc81ebced36a16d19e983c11dfeace34ffc70444 100644 --- a/alib2algo/src/grammar/generate/RandomizeGrammar.h +++ b/alib2algo/src/grammar/generate/RandomizeGrammar.h @@ -49,8 +49,8 @@ grammar::LeftRG < SymbolType > RandomizeGrammar::randomize ( const grammar::Left res.setNonterminalAlphabet ( gram.getNonterminalAlphabet ( ) ); res.setTerminalAlphabet ( gram.getTerminalAlphabet ( ) ); - for ( const std::pair < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : gram.getRules ( ) ) - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) + for ( const std::pair < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : gram.getRules ( ) ) + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) if ( rhs.template is < SymbolType > ( ) ) res.addRule ( symbolPermutationMap.find ( rule.first )->second, rhs ); else @@ -68,8 +68,8 @@ grammar::LeftLG < SymbolType > RandomizeGrammar::randomize ( const grammar::Left res.setNonterminalAlphabet ( gram.getNonterminalAlphabet ( ) ); res.setTerminalAlphabet ( gram.getTerminalAlphabet ( ) ); - for ( const std::pair < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > & rule : gram.getRules ( ) ) - for ( const std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & rhs : rule.second ) + for ( const std::pair < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > & rule : gram.getRules ( ) ) + for ( const ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & rhs : rule.second ) if ( rhs.template is < std::vector < SymbolType > > ( ) ) res.addRule ( symbolPermutationMap.find ( rule.first )->second, rhs ); else @@ -87,8 +87,8 @@ grammar::RightRG < SymbolType > RandomizeGrammar::randomize ( const grammar::Rig res.setNonterminalAlphabet ( gram.getNonterminalAlphabet ( ) ); res.setTerminalAlphabet ( gram.getTerminalAlphabet ( ) ); - for ( const std::pair < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : gram.getRules ( ) ) - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) + for ( const std::pair < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : gram.getRules ( ) ) + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) if ( rhs.template is < SymbolType > ( ) ) res.addRule ( symbolPermutationMap.find ( rule.first )->second, rhs ); else @@ -106,8 +106,8 @@ grammar::RightLG < SymbolType > RandomizeGrammar::randomize ( const grammar::Rig res.setNonterminalAlphabet ( gram.getNonterminalAlphabet ( ) ); res.setTerminalAlphabet ( gram.getTerminalAlphabet ( ) ); - for ( const std::pair < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & rule : gram.getRules ( ) ) - for ( const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rhs : rule.second ) + for ( const std::pair < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & rule : gram.getRules ( ) ) + for ( const ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rhs : rule.second ) if ( rhs.template is < std::vector < SymbolType > > ( ) ) res.addRule ( symbolPermutationMap.find ( rule.first )->second, rhs ); else diff --git a/alib2algo/src/stringology/indexing/SuffixTrieNaive.h b/alib2algo/src/stringology/indexing/SuffixTrieNaive.h index 224936b373c903b2395cfbeb9779bf5e1c6fae90..003379d46186395eb8b4ec55e22bd9ca0b436912 100644 --- a/alib2algo/src/stringology/indexing/SuffixTrieNaive.h +++ b/alib2algo/src/stringology/indexing/SuffixTrieNaive.h @@ -39,19 +39,19 @@ public: template < class SymbolType > indexes::stringology::SuffixTrie < SymbolType > SuffixTrieNaive::construct ( const string::LinearString < SymbolType > & w ) { - std::trie < SymbolType, std::variant < void, unsigned > > trie ( std::variant < void, unsigned > ( ( unsigned ) w.getContent ( ).size ( ) ) ); + std::trie < SymbolType, ext::variant < void, unsigned > > trie ( ext::variant < void, unsigned > ( ( unsigned ) w.getContent ( ).size ( ) ) ); for ( unsigned i = w.getContent ( ).size ( ); i > 0; i-- ) { unsigned k = i - 1; - std::trie < SymbolType, std::variant < void, unsigned > > * n = & trie; + std::trie < SymbolType, ext::variant < void, unsigned > > * n = & trie; // inlined slow_find_one from MI-EVY lectures while ( n->getChildren ( ).count ( w.getContent ( )[k] ) ) n = & n->getChildren ( ).find ( w.getContent ( )[k++] )->second; for ( ; k < w.getContent ( ).size ( ); k++ ) { - std::variant < void, unsigned > node = k + 1 < w.getContent ( ).size ( ) ? std::variant < void, unsigned >::from < void > ( ) : std::variant < void, unsigned > ( i - 1 ); - n = & n->getChildren ( ).insert ( std::make_pair ( w.getContent ( )[k], std::trie < SymbolType, std::variant < void, unsigned > > ( node ) ) ).first->second; + ext::variant < void, unsigned > node = k + 1 < w.getContent ( ).size ( ) ? ext::variant < void, unsigned >::from < void > ( ) : ext::variant < void, unsigned > ( i - 1 ); + n = & n->getChildren ( ).insert ( std::make_pair ( w.getContent ( )[k], std::trie < SymbolType, ext::variant < void, unsigned > > ( node ) ) ).first->second; } } diff --git a/alib2algo/src/stringology/query/SuffixTrieFactors.h b/alib2algo/src/stringology/query/SuffixTrieFactors.h index f13fa3f544c6bece86885a5bfcebc70399925f01..b9e8bb15a94199d6253a2c05ddb4cf19f33c4a17 100644 --- a/alib2algo/src/stringology/query/SuffixTrieFactors.h +++ b/alib2algo/src/stringology/query/SuffixTrieFactors.h @@ -25,11 +25,11 @@ namespace query { class SuffixTrieFactors : public alib::SingleDispatchFirstStaticParam < SuffixTrieFactors, std::set < unsigned >, const indexes::stringology::SuffixTrie < DefaultSymbolType > &, const string::StringBase & > { template < class SymbolType > - static void accumulateResult ( const std::trie < SymbolType, std::variant < void, unsigned > > & trie, std::set < unsigned > & res ) { + static void accumulateResult ( const std::trie < SymbolType, ext::variant < void, unsigned > > & trie, std::set < unsigned > & res ) { if ( trie.getData ( ).template is < unsigned > ( ) ) res.insert ( trie.getData ( ).template get < unsigned > ( ) ); - for ( const std::pair < SymbolType, std::trie < SymbolType, std::variant < void, unsigned > > > & child : trie.getChildren ( ) ) { + for ( const std::pair < SymbolType, std::trie < SymbolType, ext::variant < void, unsigned > > > & child : trie.getChildren ( ) ) { accumulateResult ( child.second, res ); } } @@ -50,7 +50,7 @@ public: template < class SymbolType > std::set < unsigned > SuffixTrieFactors::query ( const indexes::stringology::SuffixTrie < SymbolType > & suffixTrie, const string::LinearString < SymbolType > & string ) { - const std::trie < SymbolType, std::variant < void, unsigned > > * node = & suffixTrie.getRoot ( ); + const std::trie < SymbolType, ext::variant < void, unsigned > > * node = & suffixTrie.getRoot ( ); for ( const SymbolType & symbol : string.getContent ( ) ) { auto iter = node->getChildren ( ).find ( symbol ); if ( iter == node->getChildren ( ).end ( ) ) { diff --git a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp index eefcd92fdbe050a9c1e6c46143428e023419d576..794bc2602768fe239ffb6ecfe7cfac625f2f6df5 100644 --- a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp +++ b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp @@ -31,16 +31,16 @@ grammar::CFG < > DeterministicLL1Grammar::convert ( const grammar::CFG < > & par grammar::CFG < > grammar = param; while ( true ) { - std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > parseTable = LL1ParseTable::parseTable ( grammar ); + std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > parseTable = LL1ParseTable::parseTable ( grammar ); bool deterministic = true; - for ( const std::pair < const std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & elem : parseTable ) + for ( const std::pair < const std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & elem : parseTable ) if ( elem.second.size ( ) > 1 ) if ( elem.first.first.is < string::Epsilon < > > ( ) ) throw exception::CommonException ( "Cant handle conflict in epsilon" ); - for ( const std::pair < const std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & elem : parseTable ) { + for ( const std::pair < const std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & elem : parseTable ) { if ( elem.first.first.is < string::Epsilon < > > ( ) ) continue; const DefaultSymbolType & terminal = elem.first.first.get < DefaultSymbolType > ( ); @@ -58,7 +58,7 @@ grammar::CFG < > DeterministicLL1Grammar::convert ( const grammar::CFG < > & par if ( !deterministic ) continue; - for ( const std::pair < const std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & elem : parseTable ) { + for ( const std::pair < const std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & elem : parseTable ) { if ( elem.first.first.is < string::Epsilon < > > ( ) ) continue; const DefaultSymbolType & terminal = elem.first.first.get < DefaultSymbolType > ( ); diff --git a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1ParseTable.cpp b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1ParseTable.cpp index 63f6e1bcc1e68a72df7b14c4f7c6633cd27747af..298b3b243dabbc42ecbec220de58eb8f039fc258 100644 --- a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1ParseTable.cpp +++ b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1ParseTable.cpp @@ -13,15 +13,15 @@ namespace grammar { namespace parsing { -std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::vector < DefaultSymbolType > > DeterministicLL1ParseTable::parseTable ( const std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & parseTable ) { +std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::vector < DefaultSymbolType > > DeterministicLL1ParseTable::parseTable ( const std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & parseTable ) { - for ( const std::pair < const std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & elem : parseTable ) + for ( const std::pair < const std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & elem : parseTable ) if ( elem.second.size ( ) > 1 ) throw exception::CommonException ( "Cant handle conflict in epsilon" ); - std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::vector < DefaultSymbolType > > res; + std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::vector < DefaultSymbolType > > res; - for ( const std::pair < const std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & elem : parseTable ) + for ( const std::pair < const std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & elem : parseTable ) if ( elem.second.size ( ) == 1 ) res.insert ( std::make_pair ( elem.first, * elem.second.begin ( ) ) ); diff --git a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1ParseTable.h b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1ParseTable.h index 9597e5a50460f6126aad5ef5bfbd91c1d8f42cae..27c9ac72b7a67649fcddd4f841f74ddb1b86e9d5 100644 --- a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1ParseTable.h +++ b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1ParseTable.h @@ -21,7 +21,7 @@ namespace parsing { class DeterministicLL1ParseTable { public: - static std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::vector < DefaultSymbolType > > parseTable ( const std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & parseTable ); + static std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::vector < DefaultSymbolType > > parseTable ( const std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > & parseTable ); }; } /* namespace parsing */ diff --git a/alib2algo_experimental/src/grammar/parsing/First.cpp b/alib2algo_experimental/src/grammar/parsing/First.cpp index 19cd4f71b9aaf6d222ee03070eccd520a2a7466b..a0081d98dce167016b37c0cecba0d463d3e7e681 100644 --- a/alib2algo_experimental/src/grammar/parsing/First.cpp +++ b/alib2algo_experimental/src/grammar/parsing/First.cpp @@ -23,7 +23,7 @@ namespace grammar { namespace parsing { -std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > First::first ( const std::set < DefaultSymbolType > & terminals, const std::set < DefaultSymbolType > & nonterminals, const std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > & firstOfNonterminal, const std::vector < DefaultSymbolType > & rhs ) { +std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > First::first ( const std::set < DefaultSymbolType > & terminals, const std::set < DefaultSymbolType > & nonterminals, const std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > & firstOfNonterminal, const std::vector < DefaultSymbolType > & rhs ) { // 1. FIRST(\varepsilon) = { \varepsilon } if ( rhs.size ( ) == 0 ) { return { string::Epsilon < >::EPSILON }; @@ -41,10 +41,10 @@ std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > First::firs // 5. FIRST(A \alpha) = (first(A) - \varepsilon) \cup FIRST(\alpha) if A \in N and \varepsilon \in first(A) else if ( nonterminals.count ( rhs[0] ) && firstOfNonterminal.find ( rhs[0] )->second.count ( string::Epsilon < >::EPSILON ) ) { - std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > res = firstOfNonterminal.find ( rhs[0] )->second; + std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > res = firstOfNonterminal.find ( rhs[0] )->second; res.erase ( string::Epsilon < >::EPSILON ); - std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > next = first ( terminals, nonterminals, firstOfNonterminal, std::vector < DefaultSymbolType > ( rhs.begin ( ) + 1, rhs.end ( ) ) ); + std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > next = first ( terminals, nonterminals, firstOfNonterminal, std::vector < DefaultSymbolType > ( rhs.begin ( ) + 1, rhs.end ( ) ) ); res.insert ( next.begin ( ), next.end ( ) ); return res; } else { @@ -52,7 +52,7 @@ std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > First::firs } } -std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > First::first ( const std::set < DefaultSymbolType > & terminals, const std::set < DefaultSymbolType > & nonterminals, const std::map < DefaultSymbolType, std::set < std::vector < DefaultSymbolType > > > & rules ) { +std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > First::first ( const std::set < DefaultSymbolType > & terminals, const std::set < DefaultSymbolType > & nonterminals, const std::map < DefaultSymbolType, std::set < std::vector < DefaultSymbolType > > > & rules ) { /* * * 1. foreach A \in N: first(A) = \emptyset @@ -61,17 +61,17 @@ std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, strin * 3. repeat step 2 if at least one set first(A) has changed * */ - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > firstOfNonterminal1; + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > firstOfNonterminal1; for ( const DefaultSymbolType & nonterminal : nonterminals ) firstOfNonterminal1[nonterminal]; - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > firstOfNonterminal2 = firstOfNonterminal1; + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > firstOfNonterminal2 = firstOfNonterminal1; do { for ( const std::pair < const DefaultSymbolType, std::set < std::vector < DefaultSymbolType > > > & rule : rules ) for ( const std::vector < DefaultSymbolType > & rhs : rule.second ) { - std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > newFirst = first ( terminals, nonterminals, firstOfNonterminal1, rhs ); + std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > newFirst = first ( terminals, nonterminals, firstOfNonterminal1, rhs ); firstOfNonterminal2[rule.first].insert ( newFirst.begin ( ), newFirst.end ( ) ); } @@ -86,10 +86,10 @@ std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, strin } template < class T > -std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > First::first ( const T & grammar ) { - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > firstNt = first ( grammar.getTerminalAlphabet ( ), grammar.getNonterminalAlphabet ( ), grammar.getRawRules ( ) ); +std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > First::first ( const T & grammar ) { + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > firstNt = first ( grammar.getTerminalAlphabet ( ), grammar.getNonterminalAlphabet ( ), grammar.getRawRules ( ) ); - std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > res; + std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > res; for ( const std::pair < const DefaultSymbolType, std::set < std::vector < DefaultSymbolType > > > & rule : grammar.getRawRules ( ) ) for ( const std::vector < DefaultSymbolType > & rhs : rule.second ) @@ -99,8 +99,8 @@ std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultS } template < class T > -std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > First::first ( const T & grammar, const std::vector < DefaultSymbolType > & rhs ) { - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > firstNt = first ( grammar.getTerminalAlphabet ( ), grammar.getNonterminalAlphabet ( ), grammar.getRawRules ( ) ); +std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > First::first ( const T & grammar, const std::vector < DefaultSymbolType > & rhs ) { + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > firstNt = first ( grammar.getTerminalAlphabet ( ), grammar.getNonterminalAlphabet ( ), grammar.getRawRules ( ) ); return first ( grammar.getTerminalAlphabet ( ), grammar.getNonterminalAlphabet ( ), firstNt, rhs ); } @@ -115,7 +115,7 @@ auto FirstLeftRG = registration::OverloadRegister < FirstBase1, FirstResult1, gr auto FirstRightLG = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::RightLG < > > ( First::first ); auto FirstRightRG = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::RightRG < > > ( First::first ); -std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > First::first ( const grammar::Grammar & grammar ) { +std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > First::first ( const grammar::Grammar & grammar ) { return FirstBase1::dispatch ( grammar.getData ( ) ); } @@ -129,7 +129,7 @@ auto FirstLeftRG2 = registration::OverloadRegister < FirstBase2, FirstResult2, g auto FirstRightLG2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::RightLG < > > ( First::first ); auto FirstRightRG2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::RightRG < > > ( First::first ); -std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > First::first ( const grammar::Grammar & grammar, const std::vector < DefaultSymbolType > & rhs ) { +std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > First::first ( const grammar::Grammar & grammar, const std::vector < DefaultSymbolType > & rhs ) { return FirstBase2::dispatch ( grammar.getData ( ), rhs ); } diff --git a/alib2algo_experimental/src/grammar/parsing/First.h b/alib2algo_experimental/src/grammar/parsing/First.h index fb99c9c491b6e482486a19159932c51d3b4ccef5..bfb608e81a45e71b8ae122356cd7b5820928cf0d 100644 --- a/alib2algo_experimental/src/grammar/parsing/First.h +++ b/alib2algo_experimental/src/grammar/parsing/First.h @@ -22,16 +22,16 @@ namespace parsing { class First; -typedef std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > FirstResult1; +typedef std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > FirstResult1; typedef alib::SingleDispatch < First, FirstResult1, const grammar::GrammarBase & > FirstBase1; -typedef std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > FirstResult2; +typedef std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > FirstResult2; typedef alib::SingleDispatch < First, FirstResult2, const grammar::GrammarBase &, const std::vector < DefaultSymbolType > & > FirstBase2; class First : public FirstBase1, public FirstBase2 { - static std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > first ( const std::set < DefaultSymbolType > & terminals, const std::set < DefaultSymbolType > & nonterminals, const std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > & firstOfNonterminal, const std::vector < DefaultSymbolType > & rhs ); + static std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > first ( const std::set < DefaultSymbolType > & terminals, const std::set < DefaultSymbolType > & nonterminals, const std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > & firstOfNonterminal, const std::vector < DefaultSymbolType > & rhs ); - static std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > first ( const std::set < DefaultSymbolType > & terminals, const std::set < DefaultSymbolType > & nonterminals, const std::map < DefaultSymbolType, std::set < std::vector < DefaultSymbolType > > > & rules ); + static std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > first ( const std::set < DefaultSymbolType > & terminals, const std::set < DefaultSymbolType > & nonterminals, const std::map < DefaultSymbolType, std::set < std::vector < DefaultSymbolType > > > & rules ); public: template < class T > diff --git a/alib2algo_experimental/src/grammar/parsing/Follow.cpp b/alib2algo_experimental/src/grammar/parsing/Follow.cpp index 05e63a8b97e3ed3c54a8403ba7c23bbb03fbc656..c0eaf41c4c35ea828f5f1149b0cd59672b3a0017 100644 --- a/alib2algo_experimental/src/grammar/parsing/Follow.cpp +++ b/alib2algo_experimental/src/grammar/parsing/Follow.cpp @@ -28,7 +28,7 @@ namespace grammar { namespace parsing { template < class T > -void Follow::follow ( const T & grammar, std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > & followSet ) { +void Follow::follow ( const T & grammar, std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > & followSet ) { for ( const std::pair < const DefaultSymbolType, std::set < std::vector < DefaultSymbolType > > > & rule : grammar.getRawRules ( ) ) { const DefaultSymbolType & X = rule.first; @@ -39,7 +39,7 @@ void Follow::follow ( const T & grammar, std::map < DefaultSymbolType, std::set if ( !grammar.getNonterminalAlphabet ( ).count ( Y ) ) continue; - std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > firstBeta = First::first ( grammar, std::vector < DefaultSymbolType > ( std::next ( it ), rhs.end ( ) ) ); + std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > firstBeta = First::first ( grammar, std::vector < DefaultSymbolType > ( std::next ( it ), rhs.end ( ) ) ); if ( firstBeta.count ( string::Epsilon < >::EPSILON ) ) { firstBeta.erase ( string::Epsilon < >::EPSILON ); @@ -53,7 +53,7 @@ void Follow::follow ( const T & grammar, std::map < DefaultSymbolType, std::set } template < class T > -std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > Follow::follow ( const T & grammar ) { +std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > Follow::follow ( const T & grammar ) { /* * 1. Follow(S) = { \varepsilon } * Follow(A) = {} forall A \in N, A \neq S @@ -65,14 +65,14 @@ std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, strin * 3. goto 2 if any follow set was changed in prev step. */ - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > followSet1; + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > followSet1; for ( const DefaultSymbolType & symb : grammar.getNonterminalAlphabet ( ) ) followSet1[symb]; followSet1[grammar.getInitialSymbol ( )] = { string::Epsilon < >::EPSILON }; - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > followSet2 = followSet1; + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > followSet2 = followSet1; do { follow ( grammar, followSet2 ); @@ -86,7 +86,7 @@ std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, strin } template < class T > -std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > Follow::follow ( const T & grammar, const DefaultSymbolType & nt ) { +std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > Follow::follow ( const T & grammar, const DefaultSymbolType & nt ) { if ( !grammar.getNonterminalAlphabet ( ).count ( nt ) ) throw exception::CommonException ( "Follow: Given symbol is not nonterminal." ); @@ -103,7 +103,7 @@ auto FollowLeftRG = registration::OverloadRegister < FollowBase1, FollowResult1, auto FollowRightLG = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::RightLG < > > ( Follow::follow ); auto FollowRightRG = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::RightRG < > > ( Follow::follow ); -std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > Follow::follow ( const grammar::Grammar & grammar ) { +std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > Follow::follow ( const grammar::Grammar & grammar ) { return FollowBase1::dispatch ( grammar.getData ( ) ); } @@ -117,7 +117,7 @@ auto FollowLeftRG2 = registration::OverloadRegister < FollowBase2, FollowResult2 auto FollowRightLG2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::RightLG < > > ( Follow::follow ); auto FollowRightRG2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::RightRG < > > ( Follow::follow ); -std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > Follow::follow ( const grammar::Grammar & grammar, const DefaultSymbolType & nt ) { +std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > Follow::follow ( const grammar::Grammar & grammar, const DefaultSymbolType & nt ) { return FollowBase2::dispatch ( grammar.getData ( ), nt ); } diff --git a/alib2algo_experimental/src/grammar/parsing/Follow.h b/alib2algo_experimental/src/grammar/parsing/Follow.h index 519e229811234bbfc0a74422d1fa9a43b976b2fc..36307c1644b0dd5d7e7b94843ce4d0e6d9be093b 100644 --- a/alib2algo_experimental/src/grammar/parsing/Follow.h +++ b/alib2algo_experimental/src/grammar/parsing/Follow.h @@ -22,15 +22,15 @@ namespace parsing { class Follow; -typedef std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > FollowResult1; +typedef std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > FollowResult1; typedef alib::SingleDispatch < Follow, FollowResult1, const grammar::GrammarBase & > FollowBase1; -typedef std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > FollowResult2; +typedef std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > FollowResult2; typedef alib::SingleDispatch < Follow, FollowResult2, const grammar::GrammarBase &, const DefaultSymbolType & > FollowBase2; class Follow : public FollowBase1, public FollowBase2 { template < class T > - static void follow ( const T & grammar, std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > & followSet ); + static void follow ( const T & grammar, std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > & followSet ); static Follow & getInstance ( ) { static Follow res; diff --git a/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.cpp b/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.cpp index 2af69eb5bea5110ea6c5fa8cbaf0bd18d0b34fa9..80dddfda3b17f49e5f1e06c175b17f80510405eb 100644 --- a/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.cpp +++ b/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.cpp @@ -25,24 +25,24 @@ namespace grammar { namespace parsing { template < class T > -std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > LL1ParseTable::parseTable ( const T & grammar ) { - std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > res; +std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > LL1ParseTable::parseTable ( const T & grammar ) { + std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > res; - std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > first = First::first ( grammar ); - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > follow = Follow::follow ( grammar ); + std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > first = First::first ( grammar ); + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > follow = Follow::follow ( grammar ); for ( const std::pair < const DefaultSymbolType, std::set < std::vector < DefaultSymbolType > > > & transition : grammar.getRawRules ( ) ) { const DefaultSymbolType & lhs = transition.first; for ( const std::vector < DefaultSymbolType > & rhs : transition.second ) { - for ( const std::variant < DefaultSymbolType, string::Epsilon < > > & firstElem : first[rhs] ) { + for ( const ext::variant < DefaultSymbolType, string::Epsilon < > > & firstElem : first[rhs] ) { if ( firstElem.is < string::Epsilon < > > ( ) ) continue; res[std::make_pair ( firstElem, lhs )].insert ( rhs ); } if ( first[rhs].count ( string::Epsilon < >::EPSILON ) ) - for ( const std::variant < DefaultSymbolType, string::Epsilon < > > & followElem : follow[lhs] ) + for ( const ext::variant < DefaultSymbolType, string::Epsilon < > > & followElem : follow[lhs] ) res[std::make_pair ( followElem, lhs )].insert ( rhs ); } @@ -51,17 +51,17 @@ std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, return res; } -auto LL1ParseTableCFG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::CFG < > > ( LL1ParseTable::parseTable ); -auto LL1ParseTableEpsilonFreeCFG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::EpsilonFreeCFG < > > ( LL1ParseTable::parseTable ); -auto LL1ParseTableGNF = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::GNF < > > ( LL1ParseTable::parseTable ); -auto LL1ParseTableCNF = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::CNF < > > ( LL1ParseTable::parseTable ); -auto LL1ParseTableLG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LG < > > ( LL1ParseTable::parseTable ); -auto LL1ParseTableLeftLG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LeftLG < > > ( LL1ParseTable::parseTable ); -auto LL1ParseTableLeftRG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LeftRG < > > ( LL1ParseTable::parseTable ); -auto LL1ParseTableRightLG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::RightLG < > > ( LL1ParseTable::parseTable ); -auto LL1ParseTableRightRG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::RightRG < > > ( LL1ParseTable::parseTable ); - -std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > LL1ParseTable::parseTable ( const grammar::Grammar & grammar ) { +auto LL1ParseTableCFG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::CFG < > > ( LL1ParseTable::parseTable ); +auto LL1ParseTableEpsilonFreeCFG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::EpsilonFreeCFG < > > ( LL1ParseTable::parseTable ); +auto LL1ParseTableGNF = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::GNF < > > ( LL1ParseTable::parseTable ); +auto LL1ParseTableCNF = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::CNF < > > ( LL1ParseTable::parseTable ); +auto LL1ParseTableLG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LG < > > ( LL1ParseTable::parseTable ); +auto LL1ParseTableLeftLG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LeftLG < > > ( LL1ParseTable::parseTable ); +auto LL1ParseTableLeftRG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LeftRG < > > ( LL1ParseTable::parseTable ); +auto LL1ParseTableRightLG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::RightLG < > > ( LL1ParseTable::parseTable ); +auto LL1ParseTableRightRG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::RightRG < > > ( LL1ParseTable::parseTable ); + +std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > LL1ParseTable::parseTable ( const grammar::Grammar & grammar ) { return dispatch ( grammar.getData ( ) ); } diff --git a/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.h b/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.h index 068036c91f26953c6fc7bd2facaaf94589ab1153..7ba2cca746b9116344c67db9b0e533818cc4a204 100644 --- a/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.h +++ b/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.h @@ -21,12 +21,12 @@ namespace grammar { namespace parsing { -class LL1ParseTable : public alib::SingleDispatch < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, const grammar::GrammarBase & > { +class LL1ParseTable : public alib::SingleDispatch < LL1ParseTable, std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, const grammar::GrammarBase & > { public: template < class T > - static std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > parseTable ( const T & grammar ); + static std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > parseTable ( const T & grammar ); - static std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > parseTable ( const grammar::Grammar & grammar ); + static std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > parseTable ( const grammar::Grammar & grammar ); }; diff --git a/alib2algo_experimental/src/grammar/parsing/SLR1ParseTable.cpp b/alib2algo_experimental/src/grammar/parsing/SLR1ParseTable.cpp index 15425f86279e580b4b4aad8477dce994fe624da7..b4ad8ae343add1071bd0251343e96f80b228d0ab 100644 --- a/alib2algo_experimental/src/grammar/parsing/SLR1ParseTable.cpp +++ b/alib2algo_experimental/src/grammar/parsing/SLR1ParseTable.cpp @@ -47,7 +47,7 @@ LRActionTable SLR1ParseTable::getActionTable ( grammar::CFG < > originalGrammar grammar::parsing::FollowResult2 followSet = grammar::parsing::Follow::follow ( augmentedGrammar, leftHandSide ); std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > currentRule = { leftHandSide, rightHandSide }; - for ( const std::variant < DefaultSymbolType, string::Epsilon < > > & followSymbol : followSet ) { + for ( const ext::variant < DefaultSymbolType, string::Epsilon < > > & followSymbol : followSet ) { if ( followSymbol.is < DefaultSymbolType > ( ) ) { insertToActionTable(actionTable, { state, followSymbol.get < DefaultSymbolType > ( ) }, { LRAction::Reduce, currentRule } ); } else { diff --git a/alib2algo_experimental/test-src/grammar/parsing/FirstTest.cpp b/alib2algo_experimental/test-src/grammar/parsing/FirstTest.cpp index f0b21a96a68279ff1506ebb63898eab8d01748ff..e609e47419b17ebd940a40a6687e4ebdd98dcc0b 100644 --- a/alib2algo_experimental/test-src/grammar/parsing/FirstTest.cpp +++ b/alib2algo_experimental/test-src/grammar/parsing/FirstTest.cpp @@ -44,30 +44,30 @@ void FirstTest::testFirst ( ) { grammar.addRule ( nF, rhsF2 ); // -------------------------------------------------- - std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > first; + std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > first; - first[rhsE1] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsE1] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tA, tL }; - first[rhsE2] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsE2] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tA, tL }; - first[rhsT1] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsT1] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tA, tL }; - first[rhsT2] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsT2] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tA, tL }; - first[rhsF1] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsF1] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tA }; - first[rhsF2] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsF2] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tL }; // -------------------------------------------------- - std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > firstAlgo; + std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > firstAlgo; for ( const auto & rule : grammar.getRawRules ( ) ) for ( const auto & rhs : rule.second ) @@ -126,54 +126,54 @@ void FirstTest::testFirst ( ) { grammar.addRule ( nF, rhsF2 ); // -------------------------------------------------- - std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > first; + std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > first; - first[rhsS1] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsS1] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tA, tB }; - first[rhsS2] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsS2] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tD }; - first[rhsS3] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsS3] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tC }; - first[rhsA1] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsA1] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tA }; - first[rhsA2] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsA2] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tB }; - first[rhsB1] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsB1] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tA }; - first[rhsB2] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsB2] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tB }; - first[rhsC1] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsC1] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tA }; - first[rhsC2] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsC2] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tE }; - first[rhsD1] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsD1] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tC }; - first[rhsE1] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsE1] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tC }; - first[rhsE2] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsE2] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { string::Epsilon < >::EPSILON }; - first[rhsF1] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsF1] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tE }; - first[rhsF2] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + first[rhsF2] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { string::Epsilon < >::EPSILON }; // -------------------------------------------------- - std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > firstAlgo; + std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > firstAlgo; for ( const auto & rule : grammar.getRawRules ( ) ) for ( const auto & rhs : rule.second ) @@ -197,7 +197,7 @@ void FirstTest::testFirst2 ( ) { grammar.addRule ( A, std::vector < DefaultSymbolType > { A, c } ); grammar.addRule ( A, std::vector < DefaultSymbolType > { d } ); - std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > res = { { { d }, { d } }, { { A, c }, { d } } }; + std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > res = { { { d }, { d } }, { { A, c }, { d } } }; CPPUNIT_ASSERT ( res == grammar::parsing::First::first ( grammar ) ); } @@ -224,7 +224,7 @@ void FirstTest::testFirst3 ( ) { grammar.addRule ( B, std::vector < DefaultSymbolType > { f, S } ); grammar.addRule ( B, std::vector < DefaultSymbolType > { } ); - std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > res = + std::map < std::vector < DefaultSymbolType >, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > res = { { { A, a }, { c, f, a } }, { { b, S }, { b } }, { { c, A, d }, { c } }, { { B }, { f, string::Epsilon < >::EPSILON } }, { { f, S }, { f } }, { { }, { string::Epsilon < >::EPSILON } } }; diff --git a/alib2algo_experimental/test-src/grammar/parsing/FollowTest.cpp b/alib2algo_experimental/test-src/grammar/parsing/FollowTest.cpp index d416735cba3003a8dc3024a36b775d01e14d20b6..d7b1fcf6e62b38b5c3c1c8837ea468c7b94170be 100644 --- a/alib2algo_experimental/test-src/grammar/parsing/FollowTest.cpp +++ b/alib2algo_experimental/test-src/grammar/parsing/FollowTest.cpp @@ -44,21 +44,21 @@ void FollowTest::testFollow ( ) { grammar.addRule ( nF, rhsF2 ); // -------------------------------------------------- - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > follow; + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > follow; - follow[nE] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + follow[nE] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { string::Epsilon < >::EPSILON, tP, tR }; - follow[nT] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + follow[nT] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { string::Epsilon < >::EPSILON, tP, tR, tS }; - follow[nF] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + follow[nF] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { string::Epsilon < >::EPSILON, tP, tR, tS }; // -------------------------------------------------- - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > followAlgo; + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > followAlgo; for ( const auto & nt : grammar.getNonterminalAlphabet ( ) ) followAlgo[nt] = grammar::parsing::Follow::follow ( grammar, nt ); @@ -118,33 +118,33 @@ void FollowTest::testFollow ( ) { grammar.addRule ( nF, rhsF2 ); // -------------------------------------------------- - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > follow; + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > follow; - follow[nS] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + follow[nS] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { string::Epsilon < >::EPSILON }; - follow[nA] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + follow[nA] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { string::Epsilon < >::EPSILON }; - follow[nB] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + follow[nB] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tD }; - follow[nC] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + follow[nC] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { string::Epsilon < >::EPSILON }; - follow[nD] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + follow[nD] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tD }; - follow[nE] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + follow[nE] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { string::Epsilon < >::EPSILON }; - follow[nF] = std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > { + follow[nF] = std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > { tD }; // -------------------------------------------------- - std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > followAlgo; + std::map < DefaultSymbolType, std::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > followAlgo; for ( const auto & nt : grammar.getNonterminalAlphabet ( ) ) followAlgo[nt] = grammar::parsing::Follow::follow ( grammar, nt ); diff --git a/alib2algo_experimental/test-src/grammar/parsing/LL1ParseTable.cpp b/alib2algo_experimental/test-src/grammar/parsing/LL1ParseTable.cpp index 9080e3e7f78f09a354f2ab6421251c581e600db3..bd3387b749afc246102fcef470c8cbae70e1a888 100644 --- a/alib2algo_experimental/test-src/grammar/parsing/LL1ParseTable.cpp +++ b/alib2algo_experimental/test-src/grammar/parsing/LL1ParseTable.cpp @@ -50,7 +50,7 @@ void LL1ParseTable::testLL1Table ( ) { grammar.addRule ( nF, rhsF2 ); // -------------------------------------------------- - std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > parseTable; + std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > parseTable; parseTable[std::make_pair ( tA, nE )].insert ( rhsE1 ); parseTable[std::make_pair ( tL, nE )].insert ( rhsE1 ); @@ -72,7 +72,7 @@ void LL1ParseTable::testLL1Table ( ) { // -------------------------------------------------- - std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > parseTableAlgo = grammar::parsing::LL1ParseTable::parseTable ( grammar ); + std::map < std::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > parseTableAlgo = grammar::parsing::LL1ParseTable::parseTable ( grammar ); std::cout << parseTable << std::endl; std::cout << parseTableAlgo << std::endl; diff --git a/alib2common/src/container/ObjectsVariant.h b/alib2common/src/container/ObjectsVariant.h index 22a8f2709c1c181a479d4d410c004c6b7fa803c5..838e91d18276a78454a5d8a08cd4d35732b711c4 100644 --- a/alib2common/src/container/ObjectsVariant.h +++ b/alib2common/src/container/ObjectsVariant.h @@ -26,10 +26,10 @@ private: public: template < class ... Ts > - static std::variant < Ts ... > parseRaw ( std::deque < sax::Token >::iterator & input ); + static ext::variant < Ts ... > parseRaw ( std::deque < sax::Token >::iterator & input ); template < class ... Ts > - static void compose ( std::deque < sax::Token > & out, const std::variant < Ts ... > & input ); + static void compose ( std::deque < sax::Token > & out, const ext::variant < Ts ... > & input ); }; template < typename T > @@ -58,8 +58,8 @@ T parseVariantHelper ( std::deque < sax::Token >::iterator & input ) { } template < typename ... Ts > -std::variant < Ts ... > ObjectsVariant::parseRaw ( std::deque < sax::Token >::iterator & input ) { - return parseVariantHelper < std::variant < Ts ... >, Ts ... > ( input ); +ext::variant < Ts ... > ObjectsVariant::parseRaw ( std::deque < sax::Token >::iterator & input ) { + return parseVariantHelper < ext::variant < Ts ... >, Ts ... > ( input ); } template < typename T > @@ -99,8 +99,8 @@ void composeVariantHelper ( std::deque < sax::Token > & out, const T & container } template < typename ... Ts > -void ObjectsVariant::compose ( std::deque < sax::Token > & out, const std::variant < Ts ... > & container ) { - composeVariantHelper < std::variant < Ts ... >, Ts ... > ( out, container ); +void ObjectsVariant::compose ( std::deque < sax::Token > & out, const ext::variant < Ts ... > & container ) { + composeVariantHelper < ext::variant < Ts ... >, Ts ... > ( out, container ); } } /* namespace container */ @@ -108,30 +108,30 @@ void ObjectsVariant::compose ( std::deque < sax::Token > & out, const std::varia namespace alib { template < typename ... Ts > -struct xmlApi < std::variant < Ts ... > > { - static std::variant < Ts ... > parse ( std::deque < sax::Token >::iterator & input ); +struct xmlApi < ext::variant < Ts ... > > { + static ext::variant < Ts ... > parse ( std::deque < sax::Token >::iterator & input ); static bool first ( const std::deque < sax::Token >::const_iterator & input ); static std::string xmlTagName ( ); - static void compose ( std::deque < sax::Token > & output, const std::variant < Ts ... > & data ); + static void compose ( std::deque < sax::Token > & output, const ext::variant < Ts ... > & data ); }; template < typename ... Ts > -std::variant < Ts ... > xmlApi < std::variant < Ts ... > >::parse ( std::deque < sax::Token >::iterator & input ) { +ext::variant < Ts ... > xmlApi < ext::variant < Ts ... > >::parse ( std::deque < sax::Token >::iterator & input ) { return container::ObjectsVariant::parseRaw < Ts ... > ( input ); } template < typename ... Ts > -bool xmlApi < std::variant < Ts ... > >::first ( const std::deque < sax::Token >::const_iterator & input ) { - return container::firstVariantHelper < std::variant < Ts ... >, Ts ... > ( input ); +bool xmlApi < ext::variant < Ts ... > >::first ( const std::deque < sax::Token >::const_iterator & input ) { + return container::firstVariantHelper < ext::variant < Ts ... >, Ts ... > ( input ); } template < typename ... Ts > -std::string xmlApi < std::variant < Ts ... > >::xmlTagName ( ) { +std::string xmlApi < ext::variant < Ts ... > >::xmlTagName ( ) { throw ::exception::CommonException ( "Variant does not have xmlTagName." ); } template < typename ... Ts > -void xmlApi < std::variant < Ts ... > >::compose ( std::deque < sax::Token > & output, const std::variant < Ts ... > & input ) { +void xmlApi < ext::variant < Ts ... > >::compose ( std::deque < sax::Token > & output, const ext::variant < Ts ... > & input ) { return container::ObjectsVariant::compose < Ts ... > ( output, input ); } diff --git a/alib2common/src/core/visitor.hpp b/alib2common/src/core/visitor.hpp index 1c3b52374850be9e9aac3d5cfd715d842c8605d3..490d8f9e31d2db18afa7435632911dea5feaf57c 100644 --- a/alib2common/src/core/visitor.hpp +++ b/alib2common/src/core/visitor.hpp @@ -8,7 +8,7 @@ #ifndef VISITOR_HPP_ #define VISITOR_HPP_ -#include <variant> +#include <utility> namespace alib { @@ -37,7 +37,7 @@ class VisitorContextBase : public VisitorContextBaseBuilder < Visitables ... > { template < class ReturnType, class Visitor, class ... Params > class VisitorContextAux { - typename std::aligned_storage < std::SizeOf < ReturnType >::size, std::AlignOf < ReturnType >::align >::type result; + typename std::aligned_storage < ext::SizeOf < ReturnType >::size, ext::AlignOf < ReturnType >::align >::type result; std::tuple < Params ... > m_params; diff --git a/alib2common/test-src/container/ContainerTest.cpp b/alib2common/test-src/container/ContainerTest.cpp index e996ef394a4749e8813bf35281f1b8f7e2f70968..25a0cf3cc7eb1ad0284354b12fa883569557918d 100644 --- a/alib2common/test-src/container/ContainerTest.cpp +++ b/alib2common/test-src/container/ContainerTest.cpp @@ -59,13 +59,13 @@ void ContainerTest::testXMLParser ( ) { void ContainerTest::testVariantParsing ( ) { { std::string string = "<String>aaa</String>"; - std::variant < int, std::string > object = alib::XmlDataFactory::fromString ( string ); + ext::variant < int, std::string > object = alib::XmlDataFactory::fromString ( string ); CPPUNIT_ASSERT ( "aaa" == object.get < std::string > ( ) ); std::string string2 = alib::XmlDataFactory::toString ( object ); - std::variant < int, std::string > object2 = alib::XmlDataFactory::fromString ( string2 ); + ext::variant < int, std::string > object2 = alib::XmlDataFactory::fromString ( string2 ); CPPUNIT_ASSERT ( object == object2 ); } diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.h b/alib2data/src/automaton/FSM/EpsilonNFA.h index cc4e806adeba496c8d6b7fc1ae3bdf1ee5341bd1..fbf13d9e8ce35f9d045b88378e0c6171b15399b8 100644 --- a/alib2data/src/automaton/FSM/EpsilonNFA.h +++ b/alib2data/src/automaton/FSM/EpsilonNFA.h @@ -42,7 +42,7 @@ class InitialState; template<class SymbolType, class EpsilonType, class StateType > class EpsilonNFA final : public AutomatonBase, public alib::Components < EpsilonNFA < SymbolType, EpsilonType, StateType >, SymbolType, std::tuple < InputAlphabet >, std::tuple < >, StateType, std::tuple < States, FinalStates >, std::tuple < InitialState > > { protected: - std::map < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > transitions; + std::map < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > transitions; public: explicit EpsilonNFA ( StateType initialState ); @@ -122,7 +122,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addTransition ( StateType from, std::variant < EpsilonType, SymbolType > input, StateType to ); + bool addTransition ( StateType from, ext::variant < EpsilonType, SymbolType > input, StateType to ); /** * Adds transition defined by parameters to the automaton. @@ -148,7 +148,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - void addTransitions ( StateType from, std::variant < EpsilonType, SymbolType > input, std::set < StateType > to ); + void addTransitions ( StateType from, ext::variant < EpsilonType, SymbolType > input, std::set < StateType > to ); /** * Adds transition defined by parameters to the automaton. @@ -184,7 +184,7 @@ public: /** * @return automaton transitions */ - const std::map < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & getTransitions ( ) const; + const std::map < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & getTransitions ( ) const; /** * @return automaton epsilon transitions @@ -199,7 +199,7 @@ public: /** * @return automaton transitions from state */ - std::map < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > getTransitionsFromState ( const StateType & from ) const; + std::map < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > getTransitionsFromState ( const StateType & from ) const; /** * @return automaton epsilon transitions from state @@ -214,7 +214,7 @@ public: /** * @return automaton transitions to state */ - std::map < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > getTransitionsToState ( const StateType & from ) const; + std::map < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > getTransitionsToState ( const StateType & from ) const; /** * @return automaton epsilon transitions to state @@ -289,9 +289,9 @@ public: EpsilonNFA < > * res = new EpsilonNFA < > ( std::move ( states ), std::move ( alphabet ), std::move ( initialState ), std::move ( finalStates ) ); - for ( std::pair < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > && transition : std::make_moveable_map ( transitions ) ) { + for ( std::pair < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > && transition : std::make_moveable_map ( transitions ) ) { DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( transition.first.first ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( transition.first.second ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( transition.first.second ) ); std::set < DefaultStateType > targets = AutomatonNormalize::normalizeStates ( std::move ( transition.second ) ); res->addTransitions ( std::move ( from ), std::move ( input ), std::move ( targets ) ); @@ -321,11 +321,11 @@ EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( StateType initia template<class SymbolType, class EpsilonType, class StateType > EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const MultiInitialStateNFA < SymbolType, StateType > & other ) : EpsilonNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::instance < StateType > ( ), other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::instance < StateType > ( ), other.getStates ( ) ), other.getFinalStates ( ) ) { for ( const auto & transition : other.getTransitions ( ) ) { - std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( transition.first.first, std::variant < EpsilonType, SymbolType > ( transition.first.second ) ); + std::pair < StateType, ext::variant < EpsilonType, SymbolType > > key = std::make_pair ( transition.first.first, ext::variant < EpsilonType, SymbolType > ( transition.first.second ) ); transitions[key] = transition.second; } - std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( getInitialState ( ), std::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ) ); + std::pair < StateType, ext::variant < EpsilonType, SymbolType > > key = std::make_pair ( getInitialState ( ), ext::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ) ); transitions[key] = other.getInitialStates ( ); } @@ -333,7 +333,7 @@ EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const MultiIniti template<class SymbolType, class EpsilonType, class StateType > EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const NFA < SymbolType, StateType > & other ) : EpsilonNFA ( other.getStates ( ), other.getInputAlphabet ( ), other.getInitialState ( ), other.getFinalStates ( ) ) { for ( const auto & transition : other.getTransitions ( ) ) { - std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( transition.first.first, std::variant < EpsilonType, SymbolType > ( transition.first.second ) ); + std::pair < StateType, ext::variant < EpsilonType, SymbolType > > key = std::make_pair ( transition.first.first, ext::variant < EpsilonType, SymbolType > ( transition.first.second ) ); transitions[key] = transition.second; } } @@ -341,7 +341,7 @@ EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const NFA < Symb template<class SymbolType, class EpsilonType, class StateType > EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const DFA < SymbolType, StateType > & other ) : EpsilonNFA ( other.getStates ( ), other.getInputAlphabet ( ), other.getInitialState ( ), other.getFinalStates ( ) ) { for ( const auto & transition : other.getTransitions ( ) ) { - std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( transition.first.first, std::variant < EpsilonType, SymbolType > ( transition.first.second ) ); + std::pair < StateType, ext::variant < EpsilonType, SymbolType > > key = std::make_pair ( transition.first.first, ext::variant < EpsilonType, SymbolType > ( transition.first.second ) ); transitions[key].insert ( transition.second ); } } @@ -357,7 +357,7 @@ AutomatonBase * EpsilonNFA < SymbolType, EpsilonType, StateType >::plunder ( ) & } template<class SymbolType, class EpsilonType, class StateType > -bool EpsilonNFA < SymbolType, EpsilonType, StateType >::addTransition ( StateType from, std::variant < EpsilonType, SymbolType > input, StateType to ) { +bool EpsilonNFA < SymbolType, EpsilonType, StateType >::addTransition ( StateType from, ext::variant < EpsilonType, SymbolType > input, StateType to ) { if ( !getStates ( ).count ( from ) ) throw AutomatonException ( "State \"" + ext::to_string ( from ) + "\" doesn't exist." ); @@ -367,27 +367,27 @@ bool EpsilonNFA < SymbolType, EpsilonType, StateType >::addTransition ( StateTyp if ( !getStates ( ).count ( to ) ) throw AutomatonException ( "State \"" + ext::to_string ( to ) + "\" doesn't exist." ); - std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( std::move ( from ), std::move ( input ) ); + std::pair < StateType, ext::variant < EpsilonType, SymbolType > > key = std::make_pair ( std::move ( from ), std::move ( input ) ); return transitions[std::move ( key )].insert ( std::move ( to ) ).second; } template<class SymbolType, class EpsilonType, class StateType > bool EpsilonNFA < SymbolType, EpsilonType, StateType >::addTransition ( StateType from, SymbolType input, StateType to ) { - std::variant < EpsilonType, SymbolType > inputVariant ( std::move ( input ) ); + ext::variant < EpsilonType, SymbolType > inputVariant ( std::move ( input ) ); return addTransition ( std::move ( from ), std::move ( inputVariant ), std::move ( to ) ); } template<class SymbolType, class EpsilonType, class StateType > bool EpsilonNFA < SymbolType, EpsilonType, StateType >::addTransition ( StateType from, StateType to ) { - auto inputVariant = std::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ); return addTransition ( std::move ( from ), std::move ( inputVariant ), std::move ( to ) ); } template < class SymbolType, class EpsilonType, class StateType > -void EpsilonNFA < SymbolType, EpsilonType, StateType >::addTransitions ( StateType from, std::variant < EpsilonType, SymbolType > input, std::set < StateType > to ) { +void EpsilonNFA < SymbolType, EpsilonType, StateType >::addTransitions ( StateType from, ext::variant < EpsilonType, SymbolType > input, std::set < StateType > to ) { if ( !getStates ( ).count ( from ) ) throw AutomatonException ( "State \"" + ext::to_string ( from ) + "\" doesn't exist." ); @@ -397,44 +397,44 @@ void EpsilonNFA < SymbolType, EpsilonType, StateType >::addTransitions ( StateTy if ( !std::includes ( getStates ( ).begin ( ), getStates ( ).end ( ), to.begin ( ), to.end ( ) ) ) throw AutomatonException ( "Some target states don't exist." ); - std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( std::move ( from ), std::move ( input ) ); + std::pair < StateType, ext::variant < EpsilonType, SymbolType > > key = std::make_pair ( std::move ( from ), std::move ( input ) ); transitions [ std::move ( key ) ].insert ( std::make_moveable_set ( to ).begin ( ), std::make_moveable_set ( to ).end ( ) ); } template<class SymbolType, class EpsilonType, class StateType > void EpsilonNFA < SymbolType, EpsilonType, StateType >::addTransitions ( StateType from, SymbolType input, std::set < StateType > to ) { - std::variant < EpsilonType, SymbolType > inputVariant ( std::move ( input ) ); + ext::variant < EpsilonType, SymbolType > inputVariant ( std::move ( input ) ); addTransitions ( std::move ( from ), std::move ( inputVariant ), std::move ( to ) ); } template<class SymbolType, class EpsilonType, class StateType > void EpsilonNFA < SymbolType, EpsilonType, StateType >::addTransitions ( StateType from, std::set < StateType > to ) { - auto inputVariant = std::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ); addTransitions ( std::move ( from ), std::move ( inputVariant ), std::move ( to ) ); } template<class SymbolType, class EpsilonType, class StateType > bool EpsilonNFA < SymbolType, EpsilonType, StateType >::removeTransition ( const StateType & from, const SymbolType & input, const StateType & to ) { - std::variant < EpsilonType, SymbolType > inputVariant ( input ); - std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( from, inputVariant ); + ext::variant < EpsilonType, SymbolType > inputVariant ( input ); + std::pair < StateType, ext::variant < EpsilonType, SymbolType > > key = std::make_pair ( from, inputVariant ); return transitions[key].erase ( to ); } template<class SymbolType, class EpsilonType, class StateType > bool EpsilonNFA < SymbolType, EpsilonType, StateType >::removeTransition ( const StateType & from, const StateType & to ) { - auto inputVariant = std::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ); - std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( from, inputVariant ); + std::pair < StateType, ext::variant < EpsilonType, SymbolType > > key = std::make_pair ( from, inputVariant ); return transitions[key].erase ( to ); } template<class SymbolType, class EpsilonType, class StateType > -const std::map < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & EpsilonNFA < SymbolType, EpsilonType, StateType >::getTransitions ( ) const { +const std::map < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & EpsilonNFA < SymbolType, EpsilonType, StateType >::getTransitions ( ) const { return transitions; } @@ -442,7 +442,7 @@ template<class SymbolType, class EpsilonType, class StateType > std::map < StateType, std::set < StateType > > EpsilonNFA < SymbolType, EpsilonType, StateType >::getEpsilonTransitions ( ) const { std::map < StateType, std::set < StateType > > result; - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) if ( transition.first.second.template is < EpsilonType > ( ) ) result[transition.first.first].insert ( transition.second.begin ( ), transition.second.end ( ) ); @@ -453,7 +453,7 @@ template<class SymbolType, class EpsilonType, class StateType > std::map < std::pair < StateType, SymbolType >, std::set < StateType > > EpsilonNFA < SymbolType, EpsilonType, StateType >::getSymbolTransitions ( ) const { std::map < std::pair < StateType, SymbolType >, std::set < StateType > > result; - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) if ( transition.first.second.template is < SymbolType > ( ) ) result[std::pair < StateType, SymbolType > ( transition.first.first, transition.first.second.template get < SymbolType > ( ) )].insert ( transition.second.begin ( ), transition.second.end ( ) ); @@ -461,13 +461,13 @@ std::map < std::pair < StateType, SymbolType >, std::set < StateType > > Epsilon } template<class SymbolType, class EpsilonType, class StateType > -std::map < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > EpsilonNFA < SymbolType, EpsilonType, StateType >::getTransitionsFromState ( const StateType & from ) const { +std::map < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > EpsilonNFA < SymbolType, EpsilonType, StateType >::getTransitionsFromState ( const StateType & from ) const { if ( !getStates ( ).count ( from ) ) throw AutomatonException ( "State \"" + ext::to_string ( from ) + "\" doesn't exist" ); - std::map < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > transitionsFromState; + std::map < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > transitionsFromState; - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) if ( transition.first.first == from ) transitionsFromState[transition.first].insert ( transition.second.begin ( ), transition.second.end ( ) ); @@ -479,7 +479,7 @@ std::map < StateType, std::set < StateType > > EpsilonNFA < SymbolType, EpsilonT if ( !getStates ( ).count ( from ) ) throw AutomatonException ( "State \"" + ext::to_string ( from ) + "\" doesn't exist" ); - std::pair < StateType, std::variant < EpsilonType, SymbolType > > key ( from, std::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ) ); + std::pair < StateType, ext::variant < EpsilonType, SymbolType > > key ( from, ext::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ) ); std::map < StateType, std::set < StateType > > res; auto transition = transitions.find ( key ); @@ -496,7 +496,7 @@ std::map < std::pair < StateType, SymbolType >, std::set < StateType > > Epsilon std::map < std::pair < StateType, SymbolType >, std::set < StateType > > transitionsFromState; - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) if ( ( transition.first.first == from ) && transition.first.second.template is < SymbolType > ( ) ) transitionsFromState[std::pair < StateType, SymbolType > ( transition.first.first, transition.first.second.template get < SymbolType > ( ) )].insert ( transition.second.begin ( ), transition.second.end ( ) ); @@ -504,13 +504,13 @@ std::map < std::pair < StateType, SymbolType >, std::set < StateType > > Epsilon } template<class SymbolType, class EpsilonType, class StateType > -std::map < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > EpsilonNFA < SymbolType, EpsilonType, StateType >::getTransitionsToState ( const StateType & to ) const { +std::map < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > EpsilonNFA < SymbolType, EpsilonType, StateType >::getTransitionsToState ( const StateType & to ) const { if ( !getStates ( ).count ( to ) ) throw AutomatonException ( "State \"" + ext::to_string ( to ) + "\" doesn't exist" ); - std::map < std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > transitionsToState; + std::map < std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > transitionsToState; - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) if ( transition.second.find ( to ) != transition.second.end ( ) ) transitionsToState[transition.first].insert ( transition.second.begin ( ), transition.second.end ( ) ); @@ -524,7 +524,7 @@ std::map < StateType, std::set < StateType > > EpsilonNFA < SymbolType, EpsilonT std::map < StateType, std::set < StateType > > transitionsToState; - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) if ( ( transition.second.find ( to ) != transition.second.end ( ) ) && transition.first.second.template is < EpsilonType > ( ) ) transitionsToState[transition.first.first].insert ( transition.second.begin ( ), transition.second.end ( ) ); @@ -538,7 +538,7 @@ std::map < std::pair < StateType, SymbolType >, std::set < StateType > > Epsilon std::map < std::pair < StateType, SymbolType >, std::set < StateType > > transitionsToState; - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) if ( ( transition.second.find ( to ) != transition.second.end ( ) ) && transition.first.second.template is < SymbolType > ( ) ) transitionsToState[std::pair < StateType, SymbolType > ( transition.first.first, transition.first.second.template get < SymbolType > ( ) )].insert ( transition.second.begin ( ), transition.second.end ( ) ); @@ -547,7 +547,7 @@ std::map < std::pair < StateType, SymbolType >, std::set < StateType > > Epsilon template<class SymbolType, class EpsilonType, class StateType > bool EpsilonNFA < SymbolType, EpsilonType, StateType >::isEpsilonFree ( ) const { - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) if ( transition.first.second.template is < EpsilonType > ( ) ) return false; @@ -556,7 +556,7 @@ bool EpsilonNFA < SymbolType, EpsilonType, StateType >::isEpsilonFree ( ) const template<class SymbolType, class EpsilonType, class StateType > bool EpsilonNFA < SymbolType, EpsilonType, StateType >::isDeterministic ( ) const { - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : transitions ) if ( transition.second.size ( ) > 1 ) return false; @@ -621,7 +621,7 @@ template<class SymbolType, class EpsilonType, class StateType > void EpsilonNFA < SymbolType, EpsilonType, StateType >::parseTransition ( std::deque < sax::Token >::iterator & input, EpsilonNFA & automaton ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "transition" ); StateType from = AutomatonFromXMLParser::parseTransitionFrom < StateType > ( input ); - std::variant < EpsilonType, SymbolType > inputVariant = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol < EpsilonType, SymbolType > ( input ); + ext::variant < EpsilonType, SymbolType > inputVariant = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol < EpsilonType, SymbolType > ( input ); StateType to = AutomatonFromXMLParser::parseTransitionTo < StateType > ( input ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "transition" ); @@ -672,7 +672,7 @@ template<class SymbolType, class EpsilonType, class StateType > class ComponentConstraint< automaton::EpsilonNFA < SymbolType, EpsilonType, StateType >, SymbolType, automaton::InputAlphabet > { public: static bool used ( const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton, const SymbolType & symbol ) { - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : automaton.getTransitions ( ) ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : automaton.getTransitions ( ) ) if ( transition.first.second.template is < SymbolType > ( ) && ( transition.first.second.template get < SymbolType > ( ) == symbol ) ) return true; @@ -697,7 +697,7 @@ public: if ( automaton.getFinalStates ( ).count ( state ) ) return true; - for ( const std::pair < const std::pair < StateType, std::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : automaton.getTransitions ( ) ) + for ( const std::pair < const std::pair < StateType, ext::variant < EpsilonType, SymbolType > >, std::set < StateType > > & transition : automaton.getTransitions ( ) ) if ( ( transition.first.first == state ) || transition.second.count ( state ) ) return true; diff --git a/alib2data/src/automaton/PDA/DPDA.h b/alib2data/src/automaton/PDA/DPDA.h index 976f0a370e260c1eeddc3d137a5dbc06b9fb1ea7..e1c0c58e649d629a303ee0c963f01b44ce65f340 100644 --- a/alib2data/src/automaton/PDA/DPDA.h +++ b/alib2data/src/automaton/PDA/DPDA.h @@ -46,7 +46,7 @@ class InitialState; template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > class DPDA final : public AutomatonBase, public alib::Components < DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, std::tuple < InputAlphabet>, std::tuple < >, PushdownStoreSymbolType, std::tuple < PushdownStoreAlphabet >, std::tuple < InitialSymbol >, StateType, std::tuple < States, FinalStates >, std::tuple < InitialState > > { protected: - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > transitions; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > transitions; public: explicit DPDA ( std::set < StateType > states, std::set < InputSymbolType > inputAlphabet, std::set < PushdownStoreSymbolType > pushdownStoreSymbol, StateType initialState, PushdownStoreSymbolType initialPushdownSymbol, std::set < StateType > finalStates ); @@ -150,7 +150,7 @@ public: * @throws AutomatonException when some part of the transition is not present * in the DPDA (state, input symbol, stack symbol) or when transition already exists */ - bool addTransition ( StateType from, std::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push ); + bool addTransition ( StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push ); bool addTransition ( StateType from, InputSymbolType input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push ); @@ -161,7 +161,7 @@ public: * @param transition transition to remove * @throws AutomatonException when transition is not present in the DPDA */ - bool removeTransition ( const StateType & from, const std::variant < EpsilonType, InputSymbolType > & input, const std::vector < PushdownStoreSymbolType > & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); + bool removeTransition ( const StateType & from, const ext::variant < EpsilonType, InputSymbolType > & input, const std::vector < PushdownStoreSymbolType > & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); bool removeTransition ( const StateType & from, const InputSymbolType & input, const std::vector < PushdownStoreSymbolType > & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); @@ -170,17 +170,17 @@ public: /** * @return DPDA transitions */ - const std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > & getTransitions ( ) const; + const std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > & getTransitions ( ) const; /** * @return automaton transitions from state */ - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > getTransitionsFromState ( const StateType & from ) const; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > getTransitionsFromState ( const StateType & from ) const; /** * @return automaton transitions to state */ - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > getTransitionsToState ( const StateType & from ) const; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > getTransitionsToState ( const StateType & from ) const; virtual int compare ( const ObjectBase & other ) const { if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other ); @@ -223,10 +223,10 @@ public: DPDA < > * res = new DPDA < > ( std::move ( states ), std::move ( alphabet ), std::move ( pushdownAlphabet ), std::move ( initialState ), std::move ( initialSymbol ), std::move ( finalStates ) ); - for ( std::pair < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > && transition : std::make_moveable_map ( transitions ) ) { + for ( std::pair < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > && transition : std::make_moveable_map ( transitions ) ) { std::vector < DefaultSymbolType > pop = alphabet::SymbolNormalize::normalizeSymbols ( std::move ( std::get < 2 > ( transition.first ) ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( std::get < 0 > ( transition.first ) ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); DefaultStateType to = AutomatonNormalize::normalizeState ( std::move ( transition.second.first ) ); std::vector < DefaultSymbolType > push = alphabet::SymbolNormalize::normalizeSymbols ( std::move ( transition.second.second ) ); @@ -257,7 +257,7 @@ AutomatonBase* DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, Sta } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, std::variant<EpsilonType, InputSymbolType> input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push) { +bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, ext::variant<EpsilonType, InputSymbolType> input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push) { if (! getStates().count(from)) { throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); } @@ -282,7 +282,7 @@ bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >:: } } - std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> > key(std::move(from), std::move(input), std::move(pop)); + std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> > key(std::move(from), std::move(input), std::move(pop)); std::pair<StateType, std::vector<PushdownStoreSymbolType> > value = std::make_pair(std::move(to), std::move(push)); if (transitions.find(key) != transitions.end()) { @@ -297,7 +297,7 @@ bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >:: } if(std::get<1>(key).template is<EpsilonType>()) { - if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<const std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > & transition) { + if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<const std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > & transition) { if(std::get<0>(transition.first) == std::get<0>(key)) { const std::vector<PushdownStoreSymbolType>& alpha = std::get<2>(transition.first); const std::vector<PushdownStoreSymbolType>& beta = std::get<2>(key); @@ -314,7 +314,7 @@ bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >:: })) throw AutomatonException("Conflicting transition"); } else { - if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<const std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > & transition) { + if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<const std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > & transition) { if(std::get<0>(transition.first) == std::get<0>(key) && ( std::get<1>(transition.first) == std::get<1>(key) || std::get<1>(transition.first).template is<EpsilonType>() )) { const std::vector<PushdownStoreSymbolType>& alpha = std::get<2>(transition.first); const std::vector<PushdownStoreSymbolType>& beta = std::get<2>(key); @@ -338,19 +338,19 @@ bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >:: template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, InputSymbolType input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push) { - std::variant<EpsilonType, InputSymbolType> inputVariant(std::move(input)); + ext::variant<EpsilonType, InputSymbolType> inputVariant(std::move(input)); return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push) { - auto inputVariant = std::variant<EpsilonType, InputSymbolType>::template from < EpsilonType > ( ); + auto inputVariant = ext::variant<EpsilonType, InputSymbolType>::template from < EpsilonType > ( ); return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const std::variant<EpsilonType, InputSymbolType>& input, const std::vector < PushdownStoreSymbolType > & pop, const StateType& to, const std::vector < PushdownStoreSymbolType > & push) { - std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector < PushdownStoreSymbolType > > key(from, input, pop); +bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const ext::variant<EpsilonType, InputSymbolType>& input, const std::vector < PushdownStoreSymbolType > & pop, const StateType& to, const std::vector < PushdownStoreSymbolType > & push) { + std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector < PushdownStoreSymbolType > > key(from, input, pop); std::pair<StateType, std::vector < PushdownStoreSymbolType > > value = std::make_pair(to, push); if (transitions.find(key) == transitions.end()) @@ -371,28 +371,28 @@ bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >:: template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const InputSymbolType& input, const std::vector < PushdownStoreSymbolType > & pop, const StateType& to, const std::vector < PushdownStoreSymbolType > & push) { - std::variant<EpsilonType, InputSymbolType > inputVariant(input); + ext::variant<EpsilonType, InputSymbolType > inputVariant(input); return removeTransition(from, inputVariant, pop, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const std::vector < PushdownStoreSymbolType > & pop, const StateType& to, const std::vector < PushdownStoreSymbolType > & push) { - auto inputVariant = std::variant<EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant<EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeTransition(from, inputVariant, pop, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::tuple<StateType, std::variant<EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitions() const { +const std::map<std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitions() const { return transitions; } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -std::map<std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitionsFromState(const StateType& from) const { +std::map<std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitionsFromState(const StateType& from) const { if( ! getStates().count(from) ) throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist"); - std::map<std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > transitionsFromState; - for (const std::pair<const std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : transitions) { + std::map<std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > transitionsFromState; + for (const std::pair<const std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : transitions) { if (std::get<0>(transition.first) == from) { transitionsFromState.insert(std::make_pair(transition.first, transition.second)); } @@ -402,12 +402,12 @@ std::map<std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std:: } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -std::map<std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitionsToState(const StateType& to) const { +std::map<std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitionsToState(const StateType& to) const { if( ! getStates().count(to)) throw AutomatonException("State \"" + ext::to_string ( to ) + "\" doesn't exist"); - std::map<std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > transitionsToState; - for (const std::pair<const std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : transitions) { + std::map<std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > transitionsToState; + for (const std::pair<const std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : transitions) { if (transition.second.first == to) { transitionsToState.insert(std::make_pair(transition.first, transition.second)); } @@ -472,7 +472,7 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy void DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(std::deque<sax::Token>::iterator& input, DPDA& automaton) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant<EpsilonType, InputSymbolType> inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + ext::variant<EpsilonType, InputSymbolType> inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); std::vector<PushdownStoreSymbolType> pop = AutomatonFromXMLParser::parseTransitionPop<PushdownStoreSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); std::vector<PushdownStoreSymbolType> push = AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); @@ -527,7 +527,7 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy class ComponentConstraint< automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, automaton::InputAlphabet > { public: static bool used ( const automaton::DPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton, const InputSymbolType & symbol ) { - for (const std::pair<const std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) if (std::get<1>(transition.first).template is<InputSymbolType>() && symbol == std::get<1>(transition.first).template get<InputSymbolType>()) return true; @@ -549,7 +549,7 @@ public: if(automaton.getInitialSymbol() == symbol) return true; - for (const std::pair<const std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) { + for (const std::pair<const std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) { const auto & popSymbols = std::get<2>(transition.first); const auto & pushSymbols = transition.second.second; if(std::contains(popSymbols.begin(), popSymbols.end(), symbol ) || std::contains(pushSymbols.begin(), pushSymbols.end(), symbol)) @@ -588,7 +588,7 @@ public: if ( automaton.getFinalStates ( ).count ( state ) ) return true; - for (const std::pair<const std::tuple<StateType, std::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant<EpsilonType, InputSymbolType>, std::vector<PushdownStoreSymbolType> >, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) if ( state == std::get<0>(transition.first) || transition.second.first == state ) return true; diff --git a/alib2data/src/automaton/PDA/NPDA.h b/alib2data/src/automaton/PDA/NPDA.h index 69860da1d0dea1fc4c8cfd626702ec7defe19415..2a9d9138f0366ec46e9362c4ee3e480f00b340b1 100644 --- a/alib2data/src/automaton/PDA/NPDA.h +++ b/alib2data/src/automaton/PDA/NPDA.h @@ -42,7 +42,7 @@ class InitialState; template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > class NPDA final : public AutomatonBase, public alib::Components < NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, std::tuple < InputAlphabet >, std::tuple < >, PushdownStoreSymbolType, std::tuple < PushdownStoreAlphabet >, std::tuple < InitialSymbol >, StateType, std::tuple < States, FinalStates >, std::tuple < InitialState > > { protected: - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > transitions; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > transitions; public: explicit NPDA ( std::set < StateType > states, std::set < InputSymbolType > inputAlphabet, std::set < PushdownStoreSymbolType > pushdownStoreSymbol, StateType initialState, PushdownStoreSymbolType initialPushdownSymbol, std::set < StateType > finalStates ); @@ -146,7 +146,7 @@ public: * @throws AutomatonException when some part of the transition is not present * in the NPDA (state, input symbol, stack symbol) or when transition already exists */ - bool addTransition ( StateType from, std::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push ); + bool addTransition ( StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push ); bool addTransition ( StateType from, InputSymbolType input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push ); @@ -158,7 +158,7 @@ public: * @throws AutomatonException when some part of the transition is not present * in the NPDA (state, input symbol, stack symbol) or when transition already exists */ - void addTransitions ( StateType from, std::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > targets ); + void addTransitions ( StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > targets ); void addTransitions ( StateType from, InputSymbolType input, std::vector < PushdownStoreSymbolType > pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > targets ); @@ -169,7 +169,7 @@ public: * @param transition transition to remove * @throws AutomatonException when transition is not present in the NPDA */ - bool removeTransition ( const StateType & from, const std::variant < EpsilonType, InputSymbolType > & input, const std::vector < PushdownStoreSymbolType > & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); + bool removeTransition ( const StateType & from, const ext::variant < EpsilonType, InputSymbolType > & input, const std::vector < PushdownStoreSymbolType > & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); bool removeTransition ( const StateType & from, const InputSymbolType & input, const std::vector < PushdownStoreSymbolType > & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); @@ -178,7 +178,7 @@ public: /** * @return NPDA transitions */ - const std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > & getTransitions ( ) const; + const std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > & getTransitions ( ) const; virtual int compare ( const ObjectBase & other ) const { if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other ); @@ -221,14 +221,14 @@ public: NPDA < > * res = new NPDA < > ( std::move ( states ), std::move ( alphabet ), std::move ( pushdownAlphabet ), std::move ( initialState ), std::move ( initialSymbol ), std::move ( finalStates ) ); - for ( std::pair < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > && transition : std::make_moveable_map ( transitions ) ) { + for ( std::pair < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > && transition : std::make_moveable_map ( transitions ) ) { std::set < std::pair < DefaultStateType, std::vector < DefaultSymbolType > > > targets; for ( std::pair < StateType, std::vector < PushdownStoreSymbolType > > && target : std::make_moveable_set ( transition.second ) ) targets.insert ( std::make_pair ( AutomatonNormalize::normalizeState ( std::move ( target.first ) ), alphabet::SymbolNormalize::normalizeSymbols ( std::move ( target.second ) ) ) ); std::vector < DefaultSymbolType > pop = alphabet::SymbolNormalize::normalizeSymbols ( std::move ( std::get < 2 > ( transition.first ) ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( std::get < 0 > ( transition.first ) ) ); - std::variant < DefaultEpsilonType, DefaultStateType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); + ext::variant < DefaultEpsilonType, DefaultStateType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); res->addTransitions ( std::move ( from ), std::move ( input ), std::move ( pop ), std::move ( targets ) ); } @@ -256,7 +256,7 @@ AutomatonBase* NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, Sta } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, std::variant < EpsilonType, InputSymbolType > input, std::vector<PushdownStoreSymbolType> pop, StateType to, std::vector<PushdownStoreSymbolType> push) { +bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::vector<PushdownStoreSymbolType> pop, StateType to, std::vector<PushdownStoreSymbolType> push) { if (! getStates().count(from)) throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); @@ -274,7 +274,7 @@ bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >:: if (! getPushdownStoreAlphabet().count(pushSymbol)) throw AutomatonException("Pushdown store symbol \"" + ext::to_string ( pushSymbol ) + "\" doesn't exist."); - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> > key(std::move(from), std::move(input), std::move(pop)); + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> > key(std::move(from), std::move(input), std::move(pop)); std::pair<StateType, std::vector<PushdownStoreSymbolType> > value = std::make_pair(std::move(to), std::move(push)); return transitions[std::move(key)].insert(std::move(value)).second; @@ -282,18 +282,18 @@ bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >:: template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, InputSymbolType input, std::vector<PushdownStoreSymbolType> pop, StateType to, std::vector<PushdownStoreSymbolType> push) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, std::vector<PushdownStoreSymbolType> pop, StateType to, std::vector<PushdownStoreSymbolType> push) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions ( StateType from, std::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > targets ) { +void NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions ( StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > targets ) { if (! getStates().count(from)) throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); @@ -313,26 +313,26 @@ void NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >:: throw AutomatonException("Pushdown store symbol \"" + ext::to_string ( pushSymbol ) + "\" doesn't exist."); } - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> > key(std::move(from), std::move(input), std::move(pop)); + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> > key(std::move(from), std::move(input), std::move(pop)); transitions [ std::move ( key ) ].insert ( std::make_moveable_set ( targets ).begin ( ), std::make_moveable_set ( targets ).end ( ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions ( StateType from, InputSymbolType input, std::vector < PushdownStoreSymbolType > pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > targets ) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); addTransitions ( std::move ( from ), std::move ( inputVariant ), std::move ( pop ), std::move ( targets ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions ( StateType from, std::vector < PushdownStoreSymbolType > pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > targets ) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); addTransitions ( std::move ( from ), std::move ( inputVariant ), std::move ( pop ), std::move ( targets ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const std::variant < EpsilonType, InputSymbolType > & input, const std::vector<PushdownStoreSymbolType>& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> > key(from, input, pop); +bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const ext::variant < EpsilonType, InputSymbolType > & input, const std::vector<PushdownStoreSymbolType>& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> > key(from, input, pop); std::pair<StateType, std::vector < PushdownStoreSymbolType > > value = std::make_pair(to, push); return transitions[key].erase(value); @@ -340,18 +340,18 @@ bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >:: template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const InputSymbolType& input, const std::vector<PushdownStoreSymbolType>& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return removeTransition(from, inputVariant, pop, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const std::vector<PushdownStoreSymbolType>& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeTransition(from, inputVariant, pop, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitions() const { +const std::map<std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitions() const { return transitions; } @@ -411,7 +411,7 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy void NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(std::deque<sax::Token>::iterator& input, NPDA& automaton) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol < EpsilonType, InputSymbolType > ( input ); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol < EpsilonType, InputSymbolType > ( input ); std::vector<PushdownStoreSymbolType> pop = AutomatonFromXMLParser::parseTransitionPop<PushdownStoreSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); std::vector<PushdownStoreSymbolType> push = AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); @@ -468,7 +468,7 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy class ComponentConstraint< automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, automaton::InputAlphabet > { public: static bool used ( const automaton::NPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton, const InputSymbolType & symbol ) { - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) if (std::get<1>(transition.first).template is<InputSymbolType>() && symbol == std::get<1>(transition.first).template get<InputSymbolType>()) return true; @@ -490,7 +490,7 @@ public: if(automaton.getInitialSymbol() == symbol) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) { + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) { for (const PushdownStoreSymbolType& popSymbol : std::get<2>(transition.first)) if (symbol == popSymbol) return true; @@ -532,7 +532,7 @@ public: if ( automaton.getFinalStates ( ).count ( state ) ) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) { + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) { if (state == std::get<0>(transition.first)) return true; for(const std::pair<StateType, std::vector<PushdownStoreSymbolType> >& target : transition.second) diff --git a/alib2data/src/automaton/PDA/NPDTA.h b/alib2data/src/automaton/PDA/NPDTA.h index 9cfe95bb37f7a526905cf4aa6928ac206cc87f1a..de0fcfaf19cd20bc18e6b362e6f9d19cd4fc7cca 100644 --- a/alib2data/src/automaton/PDA/NPDTA.h +++ b/alib2data/src/automaton/PDA/NPDTA.h @@ -43,7 +43,7 @@ class InitialState; template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > class NPDTA final : public AutomatonBase, public alib::Components < NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, std::tuple < InputAlphabet >, std::tuple < >, OutputSymbolType, std::tuple < OutputAlphabet >, std::tuple < >, PushdownStoreSymbolType, std::tuple < PushdownStoreAlphabet >, std::tuple < InitialSymbol >, StateType, std::tuple < States, FinalStates >, std::tuple < InitialState > > { protected: - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > > transitions; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > > transitions; public: explicit NPDTA ( std::set < StateType > states, std::set < InputSymbolType > inputAlphabet, std::set < OutputSymbolType > outputAlphabet, std::set < PushdownStoreSymbolType > pushdownStoreSymbol, StateType initialState, PushdownStoreSymbolType initialPushdownSymbol, std::set < StateType > finalStates ); @@ -168,7 +168,7 @@ public: * @throws AutomatonException when some part of the transition is not present * in the NPDTA (state, input symbol, stack symbol, output symbol) or when transition already exists */ - bool addTransition ( StateType from, std::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push, std::vector < OutputSymbolType > output ); + bool addTransition ( StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push, std::vector < OutputSymbolType > output ); bool addTransition ( StateType from, InputSymbolType input, std::vector < PushdownStoreSymbolType > pop, StateType to, std::vector < PushdownStoreSymbolType > push, std::vector < OutputSymbolType > output ); @@ -180,7 +180,7 @@ public: * @throws AutomatonException when some part of the transition is not present * in the NPDTA (state, input symbol, stack symbol, output symbol) or when transition already exists */ - void addTransitions ( StateType from, std::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > targets ); + void addTransitions ( StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::vector < PushdownStoreSymbolType > pop, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > targets ); void addTransitions ( StateType from, InputSymbolType input, std::vector < PushdownStoreSymbolType > pop, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > targets ); @@ -191,7 +191,7 @@ public: * @param transition transition to remove * @throws AutomatonException when transition is not present in the NPDTA */ - bool removeTransition ( const StateType & from, const std::variant < EpsilonType, InputSymbolType > & input, const std::vector < PushdownStoreSymbolType > & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push, const std::vector < OutputSymbolType > & output ); + bool removeTransition ( const StateType & from, const ext::variant < EpsilonType, InputSymbolType > & input, const std::vector < PushdownStoreSymbolType > & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push, const std::vector < OutputSymbolType > & output ); bool removeTransition ( const StateType & from, const InputSymbolType & input, const std::vector < PushdownStoreSymbolType > & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push, const std::vector < OutputSymbolType > & output ); @@ -200,9 +200,9 @@ public: /** * @return NPDTA transitions */ - const std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > > & getTransitions ( ) const; + const std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > > & getTransitions ( ) const; - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > getTransitionsFromState ( const StateType & from ) const; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > getTransitionsFromState ( const StateType & from ) const; virtual int compare ( const ObjectBase & other ) const { if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other ); @@ -246,14 +246,14 @@ public: NPDTA < > * res = new NPDTA < > ( std::move ( states ), std::move ( alphabet ), std::move ( pushdownAlphabet ), std::move ( outputAlphabet ), std::move ( initialState ), std::move ( initialSymbol ), std::move ( finalStates ) ); - for ( std::pair < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > > && transition : std::make_moveable_map ( transitions ) ) { + for ( std::pair < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > > && transition : std::make_moveable_map ( transitions ) ) { std::set < std::tuple < DefaultStateType, std::vector < DefaultSymbolType >, std::vector < DefaultSymbolType > > > targets; for ( std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > && target : std::make_moveable_set ( transition.second ) ) targets.insert ( std::make_tuple ( AutomatonNormalize::normalizeState ( std::move ( std::get < 0 > ( target ) ) ), alphabet::SymbolNormalize::normalizeSymbols ( std::move ( std::get < 1 > ( target ) ) ), alphabet::SymbolNormalize::normalizeSymbols ( std::move ( std::get < 2 > ( target ) ) ) ) ); std::vector < DefaultSymbolType > pop = alphabet::SymbolNormalize::normalizeSymbols ( std::move ( std::get < 2 > ( transition.first ) ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( std::get < 0 > ( transition.first ) ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); res->addTransitions ( std::move ( from ), std::move ( input ), std::move ( pop ), std::move ( targets ) ); } @@ -281,7 +281,7 @@ AutomatonBase* NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownS } template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, std::variant < EpsilonType, InputSymbolType > input, std::vector<PushdownStoreSymbolType> pop, StateType to, std::vector<PushdownStoreSymbolType> push, std::vector < OutputSymbolType > output) { +bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::vector<PushdownStoreSymbolType> pop, StateType to, std::vector<PushdownStoreSymbolType> push, std::vector < OutputSymbolType > output) { if (!getStates().count(from)) { throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); } @@ -312,7 +312,7 @@ bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbol } } - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> > key(std::move(from), std::move(input), std::move(pop)); + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> > key(std::move(from), std::move(input), std::move(pop)); std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector<OutputSymbolType> > value(std::move(to), std::move(push), std::move(output)); return transitions[std::move(key)].insert(std::move(value)).second; @@ -320,18 +320,18 @@ bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbol template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, InputSymbolType input, std::vector<PushdownStoreSymbolType> pop, StateType to, std::vector<PushdownStoreSymbolType> push, std::vector < OutputSymbolType > output) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push), std::move(output)); } template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, std::vector<PushdownStoreSymbolType> pop, StateType to, std::vector<PushdownStoreSymbolType> push, std::vector < OutputSymbolType > output) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push), std::move(output)); } template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions ( StateType from, std::variant < EpsilonType, InputSymbolType > input, std::vector<PushdownStoreSymbolType> pop, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > targets ) { +void NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions ( StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::vector<PushdownStoreSymbolType> pop, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > targets ) { if ( ! getStates ( ).count ( from ) ) throw AutomatonException ( "State \"" + ext::to_string ( from ) + "\" doesn't exist." ); @@ -355,26 +355,26 @@ void NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbol throw AutomatonException ( "Output symbol \"" + ext::to_string ( outputSymbol ) + "\" doesn't exist." ); } - std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > > key ( std::move ( from ), std::move ( input ), std::move ( pop ) ); + std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > > key ( std::move ( from ), std::move ( input ), std::move ( pop ) ); transitions [ std::move ( key ) ].insert ( std::make_moveable_set ( targets ).begin ( ), std::make_moveable_set ( targets ).end ( ) ); } template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions ( StateType from, InputSymbolType input, std::vector<PushdownStoreSymbolType> pop, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > targets ) { - std::variant < EpsilonType, InputSymbolType > inputVariant ( std::move ( input ) ); + ext::variant < EpsilonType, InputSymbolType > inputVariant ( std::move ( input ) ); addTransition ( std::move ( from ), std::move ( inputVariant ), std::move ( pop ), std::move ( targets ) ); } template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions ( StateType from, std::vector<PushdownStoreSymbolType> pop, std::set < std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > targets ) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); addTransition ( std::move ( from ), std::move ( inputVariant ), std::move ( pop ), std::move ( targets ) ); } template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const std::variant < EpsilonType, InputSymbolType >& input, const std::vector < PushdownStoreSymbolType > & pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push, const std::vector < OutputSymbolType > & output) { - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> > key(from, input, pop); +bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const ext::variant < EpsilonType, InputSymbolType >& input, const std::vector < PushdownStoreSymbolType > & pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push, const std::vector < OutputSymbolType > & output) { + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> > key(from, input, pop); std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > value(to, push, output); return transitions[key].erase(value); @@ -382,27 +382,27 @@ bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbol template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const InputSymbolType& input, const std::vector<PushdownStoreSymbolType>& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push, const std::vector < OutputSymbolType > & output) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return removeTransition(from, inputVariant, pop, to, push, output); } template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const std::vector<PushdownStoreSymbolType>& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push, const std::vector < OutputSymbolType > & output) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeTransition(from, inputVariant, pop, to, push, output); } template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > > >& NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitions() const { +const std::map<std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > > >& NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitions() const { return transitions; } template < class InputSymbolType, class OutputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitionsFromState ( const StateType & from ) const { +std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < OutputSymbolType > > > NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitionsFromState ( const StateType & from ) const { if( !getStates().count(from)) throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist"); - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < PushdownStoreSymbolType > > > transitionsFromState; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector < PushdownStoreSymbolType > >, std::tuple < StateType, std::vector < PushdownStoreSymbolType >, std::vector < PushdownStoreSymbolType > > > transitionsFromState; for ( auto transition: transitions ) { for ( auto iter: transition.second ) { if ( std::get<0>(transition.first) == from ) { @@ -474,7 +474,7 @@ template < class InputSymbolType, class OutputSymbolType, class EpsilonType, cla void NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(std::deque<sax::Token>::iterator& input, NPDTA& automaton) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); std::vector<PushdownStoreSymbolType> pop = AutomatonFromXMLParser::parseTransitionPop<PushdownStoreSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); std::vector<PushdownStoreSymbolType> push = AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); @@ -534,7 +534,7 @@ template < class InputSymbolType, class OutputSymbolType, class EpsilonType, cla class ComponentConstraint< automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, automaton::InputAlphabet > { public: static bool used ( const automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton, const InputSymbolType & symbol ) { - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > > >& transition : automaton.getTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > > >& transition : automaton.getTransitions()) if (std::get<1>(transition.first).template is < InputSymbolType >() && symbol == std::get<1>(transition.first).template get < InputSymbolType >()) return true; @@ -553,7 +553,7 @@ template < class InputSymbolType, class OutputSymbolType, class EpsilonType, cla class ComponentConstraint< automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, OutputSymbolType, automaton::OutputAlphabet > { public: static bool used ( const automaton::NPDTA < InputSymbolType, OutputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton, const OutputSymbolType & symbol ) { - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > > >& transition : automaton.getTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > > >& transition : automaton.getTransitions()) for(const std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > >& target : transition.second) if (std::find(std::get<2>(target).begin(), std::get<2>(target).end(), symbol) != std::get<2>(target).end()) return true; @@ -576,7 +576,7 @@ public: if(automaton.getInitialSymbol() == symbol) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > > >& transition : automaton.getTransitions()) { + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > > >& transition : automaton.getTransitions()) { for (const PushdownStoreSymbolType& popSymbol : std::get<2>(transition.first)) if (symbol == popSymbol) return true; @@ -618,7 +618,7 @@ public: if ( automaton.getFinalStates ( ).count ( state ) ) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > > >& transition : automaton.getTransitions()) { + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, std::vector<PushdownStoreSymbolType> >, std::set<std::tuple<StateType, std::vector<PushdownStoreSymbolType>, std::vector < OutputSymbolType > > > >& transition : automaton.getTransitions()) { if (state == std::get<0>(transition.first)) return true; diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h index f65ec876fc7e1944919624dfac02bbf8dcdc882e..daea9a38109faf69d82ddf1bacf60747fd9bb814 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h @@ -42,9 +42,9 @@ class InitialState; template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > class RealTimeHeightDeterministicDPDA final : public AutomatonBase, public alib::Components < RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, std::tuple < InputAlphabet >, std::tuple < >, PushdownStoreSymbolType, std::tuple < PushdownStoreAlphabet >, std::tuple < BottomOfTheStackSymbol >, StateType, std::tuple < States, FinalStates >, std::tuple < InitialState > > { protected: - std::map < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, std::pair < StateType, PushdownStoreSymbolType > > callTransitions; - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, StateType > returnTransitions; - std::map < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, StateType > localTransitions; + std::map < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, std::pair < StateType, PushdownStoreSymbolType > > callTransitions; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, StateType > returnTransitions; + std::map < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, StateType > localTransitions; public: explicit RealTimeHeightDeterministicDPDA ( std::set < StateType > states, std::set < InputSymbolType > inputAlphabet, std::set < PushdownStoreSymbolType > pushdownStoreSymbol, StateType initialState, PushdownStoreSymbolType bottomOfTheStackSymbol, std::set < StateType > finalStates ); @@ -149,7 +149,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addCallTransition ( StateType current, std::variant < EpsilonType, InputSymbolType > input, StateType next, PushdownStoreSymbolType push ); + bool addCallTransition ( StateType current, ext::variant < EpsilonType, InputSymbolType > input, StateType next, PushdownStoreSymbolType push ); bool addCallTransition ( StateType current, StateType next, PushdownStoreSymbolType push ); bool addCallTransition ( StateType current, InputSymbolType input, StateType next, PushdownStoreSymbolType push ); @@ -160,7 +160,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addReturnTransition ( StateType current, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType next ); + bool addReturnTransition ( StateType current, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType next ); bool addReturnTransition ( StateType current, PushdownStoreSymbolType pop, StateType next ); bool addReturnTransition ( StateType current, InputSymbolType input, PushdownStoreSymbolType pop, StateType next ); @@ -171,7 +171,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addLocalTransition ( StateType current, std::variant < EpsilonType, InputSymbolType > input, StateType next ); + bool addLocalTransition ( StateType current, ext::variant < EpsilonType, InputSymbolType > input, StateType next ); bool addLocalTransition ( StateType current, StateType next ); bool addLocalTransition ( StateType current, InputSymbolType input, StateType next ); @@ -180,7 +180,7 @@ public: * @param transition transition to remove * @throws AutomatonException when transition doesn't exists. */ - bool removeCallTransition ( const StateType & current, const std::variant < EpsilonType, InputSymbolType > & input, const StateType & next, const PushdownStoreSymbolType & push ); + bool removeCallTransition ( const StateType & current, const ext::variant < EpsilonType, InputSymbolType > & input, const StateType & next, const PushdownStoreSymbolType & push ); bool removeCallTransition ( const StateType & current, const StateType & next, const PushdownStoreSymbolType & push ); bool removeCallTransition ( const StateType & current, const InputSymbolType & input, const StateType & next, const PushdownStoreSymbolType & push ); @@ -189,7 +189,7 @@ public: * @param transition transition to remove * @throws AutomatonException when transition doesn't exists. */ - bool removeReturnTransition ( const StateType & current, const std::variant < EpsilonType, InputSymbolType > & input, const PushdownStoreSymbolType & pop, const StateType & next ); + bool removeReturnTransition ( const StateType & current, const ext::variant < EpsilonType, InputSymbolType > & input, const PushdownStoreSymbolType & pop, const StateType & next ); bool removeReturnTransition ( const StateType & current, const PushdownStoreSymbolType & pop, const StateType & next ); bool removeReturnTransition ( const StateType & current, const InputSymbolType & input, const PushdownStoreSymbolType & pop, const StateType & next ); @@ -198,15 +198,15 @@ public: * @param transition transition to remove * @throws AutomatonException when transition doesn't exists. */ - bool removeLocalTransition ( const StateType & current, const std::variant < EpsilonType, InputSymbolType > & input, const StateType & next ); + bool removeLocalTransition ( const StateType & current, const ext::variant < EpsilonType, InputSymbolType > & input, const StateType & next ); bool removeLocalTransition ( const StateType & current, const StateType & next ); bool removeLocalTransition ( const StateType & current, const InputSymbolType & input, const StateType & next ); - const std::map < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, std::pair < StateType, PushdownStoreSymbolType > > & getCallTransitions ( ) const; + const std::map < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, std::pair < StateType, PushdownStoreSymbolType > > & getCallTransitions ( ) const; - const std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, StateType > & getReturnTransitions ( ) const; + const std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, StateType > & getReturnTransitions ( ) const; - const std::map < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, StateType > & getLocalTransitions ( ) const; + const std::map < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, StateType > & getLocalTransitions ( ) const; virtual int compare ( const ObjectBase & other ) const { if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other ); @@ -249,31 +249,31 @@ public: RealTimeHeightDeterministicDPDA < > * res = new RealTimeHeightDeterministicDPDA < > ( std::move ( states ), std::move ( alphabet ), std::move ( pushdownAlphabet ), std::move ( initialState ), std::move ( bottomSymbol ), std::move ( finalStates ) ); - for ( std::pair < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, std::pair < StateType, PushdownStoreSymbolType > > && transition : std::make_moveable_map ( callTransitions ) ) { + for ( std::pair < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, std::pair < StateType, PushdownStoreSymbolType > > && transition : std::make_moveable_map ( callTransitions ) ) { DefaultStateType to = AutomatonNormalize::normalizeState ( std::move ( transition.second.first ) ); DefaultSymbolType push = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( transition.second.second ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( transition.first.first ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( transition.first.second ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( transition.first.second ) ); res->addCallTransition ( std::move ( from ), std::move ( input ), std::move ( to ), std::move ( push ) ); } - for ( std::pair < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, StateType > && transition : std::make_moveable_map ( returnTransitions ) ) { + for ( std::pair < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, StateType > && transition : std::make_moveable_map ( returnTransitions ) ) { DefaultStateType to = AutomatonNormalize::normalizeState ( std::move ( transition.second ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( std::get < 0 > ( transition.first ) ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); DefaultSymbolType pop = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( std::get < 2 > ( transition.first ) ) ); res->addReturnTransition ( std::move ( from ), std::move ( input ), std::move ( pop ), std::move ( to ) ); } - for ( std::pair < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, StateType > && transition : std::make_moveable_map ( localTransitions ) ) { + for ( std::pair < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, StateType > && transition : std::make_moveable_map ( localTransitions ) ) { DefaultStateType to = AutomatonNormalize::normalizeState ( std::move ( transition.second ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( transition.first.first ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( transition.first.second ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( transition.first.second ) ); res->addLocalTransition ( std::move ( from ), std::move ( input ), std::move ( to ) ); } @@ -300,7 +300,7 @@ AutomatonBase* RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, P } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransition(StateType from, std::variant < EpsilonType, InputSymbolType > input, StateType to, PushdownStoreSymbolType push) { +bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransition(StateType from, ext::variant < EpsilonType, InputSymbolType > input, StateType to, PushdownStoreSymbolType push) { if (!getStates().count(from)) { throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); } @@ -320,7 +320,7 @@ bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto if(getBottomOfTheStackSymbol() == push) throw AutomatonException("Pushdown store symbol \"" + ext::to_string ( push ) + "\" is bottom of the stack."); - std::pair<StateType, std::variant < EpsilonType, InputSymbolType >> key(std::move(from), std::move(input)); + std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >> key(std::move(from), std::move(input)); std::pair<StateType, PushdownStoreSymbolType> value = std::make_pair(std::move(to), std::move(push)); if(callTransitions.find(key) != callTransitions.end() && callTransitions.find(key)->second == value) @@ -358,18 +358,18 @@ bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransition(StateType from, StateType to, PushdownStoreSymbolType push) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransition(StateType from, InputSymbolType input, StateType to, PushdownStoreSymbolType push) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransition(StateType from, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to) { +bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransition(StateType from, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to) { if (!getStates().count(from)) { throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); } @@ -386,7 +386,7 @@ bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto throw AutomatonException("Pushdown store symbol \"" + ext::to_string ( pop ) + "\" doesn't exist."); } - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); if(returnTransitions.find(key) != returnTransitions.end() && returnTransitions.find(key)->second == to) return false; @@ -423,18 +423,18 @@ bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransition(StateType from, PushdownStoreSymbolType pop, StateType to) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransition(StateType from, InputSymbolType input, PushdownStoreSymbolType pop, StateType to) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransition(StateType from, std::variant < EpsilonType, InputSymbolType > input, StateType to) { +bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransition(StateType from, ext::variant < EpsilonType, InputSymbolType > input, StateType to) { if (!getStates().count(from)) { throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); } @@ -447,7 +447,7 @@ bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto throw AutomatonException("State \"" + ext::to_string ( to ) + "\" doesn't exist."); } - std::pair<StateType, std::variant < EpsilonType, InputSymbolType >> key(std::move(from), std::move(input)); + std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >> key(std::move(from), std::move(input)); if(localTransitions.find(key) != localTransitions.end() && localTransitions.find(key)->second == to) return false; @@ -484,19 +484,19 @@ bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransition(StateType from, StateType to) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransition(StateType from, InputSymbolType input, StateType to) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeCallTransition(const StateType& from, const std::variant < EpsilonType, InputSymbolType >& input, const StateType& to, const PushdownStoreSymbolType& push) { - std::pair<StateType, std::variant < EpsilonType, InputSymbolType >> key(from, input); +bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeCallTransition(const StateType& from, const ext::variant < EpsilonType, InputSymbolType >& input, const StateType& to, const PushdownStoreSymbolType& push) { + std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >> key(from, input); std::pair<StateType, PushdownStoreSymbolType> value = std::make_pair(to, push); if (callTransitions.find(key) == callTransitions.end()) @@ -511,19 +511,19 @@ bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeCallTransition(const StateType& from, const StateType& to, const PushdownStoreSymbolType& push) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeCallTransition(from, inputVariant, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeCallTransition(const StateType& from, const InputSymbolType& input, const StateType& to, const PushdownStoreSymbolType& push) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return removeCallTransition(from, inputVariant, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeReturnTransition(const StateType& from, const std::variant < EpsilonType, InputSymbolType >& input, const PushdownStoreSymbolType& pop, const StateType& to) { - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(from, input, pop); +bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeReturnTransition(const StateType& from, const ext::variant < EpsilonType, InputSymbolType >& input, const PushdownStoreSymbolType& pop, const StateType& to) { + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(from, input, pop); if (returnTransitions.find(key) == returnTransitions.end()) return false; @@ -537,19 +537,19 @@ bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeReturnTransition(const StateType& from, const PushdownStoreSymbolType& pop, const StateType& to) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeReturnTransition(from, inputVariant, pop, to); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeReturnTransition(const StateType& from, const InputSymbolType& input, const PushdownStoreSymbolType& pop, const StateType& to) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return removeReturnTransition(from, inputVariant, pop, to); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeLocalTransition(const StateType& from, const std::variant < EpsilonType, InputSymbolType >& input, const StateType& to) { - std::pair<StateType, std::variant < EpsilonType, InputSymbolType >> key(from, input); +bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeLocalTransition(const StateType& from, const ext::variant < EpsilonType, InputSymbolType >& input, const StateType& to) { + std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >> key(from, input); if (localTransitions.find(key) == localTransitions.end()) return false; @@ -563,28 +563,28 @@ bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeLocalTransition(const StateType& from, const StateType& to) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeLocalTransition(from, inputVariant, to); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeLocalTransition(const StateType& from, const InputSymbolType& input, const StateType& to) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return removeLocalTransition(from, inputVariant, to); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::pair<StateType, PushdownStoreSymbolType> >& RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getCallTransitions() const { +const std::map<std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::pair<StateType, PushdownStoreSymbolType> >& RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getCallTransitions() const { return callTransitions; } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, StateType>& RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getReturnTransitions() const { +const std::map<std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, StateType>& RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getReturnTransitions() const { return returnTransitions; } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, StateType>& RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getLocalTransitions() const { +const std::map<std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, StateType>& RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getLocalTransitions() const { return localTransitions; } @@ -647,7 +647,7 @@ void RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition")) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); PushdownStoreSymbolType push = AutomatonFromXMLParser::parseTransitionSinglePush<PushdownStoreSymbolType>(input); @@ -656,7 +656,7 @@ void RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto } else if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition")) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); PushdownStoreSymbolType pop = AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); @@ -665,7 +665,7 @@ void RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownSto } else { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "localTransition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType,InputSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); automaton.addLocalTransition(std::move(from), std::move(inputSymbol), std::move(to)); @@ -736,15 +736,15 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy class ComponentConstraint< automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, automaton::InputAlphabet > { public: static bool used ( const automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton, const InputSymbolType & symbol ) { - for (const std::pair<const std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::pair<StateType, PushdownStoreSymbolType> >& callTransition : automaton.getCallTransitions()) + for (const std::pair<const std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::pair<StateType, PushdownStoreSymbolType> >& callTransition : automaton.getCallTransitions()) if (callTransition.first.second.template is < InputSymbolType >() && symbol == callTransition.first.second.template get < InputSymbolType >()) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, StateType>& returnTransition : automaton.getReturnTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, StateType>& returnTransition : automaton.getReturnTransitions()) if (std::get<1>(returnTransition.first).template is < InputSymbolType >() && symbol == std::get<1>(returnTransition.first).template get < InputSymbolType >()) return true; - for (const std::pair<const std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, StateType>& localTransition : automaton.getLocalTransitions()) + for (const std::pair<const std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, StateType>& localTransition : automaton.getLocalTransitions()) if (localTransition.first.second.template is < InputSymbolType >() && symbol == localTransition.first.second.template get < InputSymbolType >()) return true; @@ -763,11 +763,11 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy class ComponentConstraint< automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, PushdownStoreSymbolType, automaton::PushdownStoreAlphabet > { public: static bool used ( const automaton::RealTimeHeightDeterministicDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton, const PushdownStoreSymbolType & symbol ) { - for (const std::pair<const std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::pair<StateType, PushdownStoreSymbolType> >& callTransition : automaton.getCallTransitions()) + for (const std::pair<const std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::pair<StateType, PushdownStoreSymbolType> >& callTransition : automaton.getCallTransitions()) if (symbol == callTransition.second.second) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, StateType>& returnTransition : automaton.getReturnTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, StateType>& returnTransition : automaton.getReturnTransitions()) if (symbol == std::get<2>(returnTransition.first)) return true; @@ -806,15 +806,15 @@ public: if ( automaton.getFinalStates ( ).count ( state ) ) return true; - for (const std::pair<const std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::pair<StateType, PushdownStoreSymbolType> >& callTransition : automaton.getCallTransitions()) + for (const std::pair<const std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::pair<StateType, PushdownStoreSymbolType> >& callTransition : automaton.getCallTransitions()) if (state == callTransition.first.first || callTransition.second.first == state) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, StateType>& returnTransition : automaton.getReturnTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, StateType>& returnTransition : automaton.getReturnTransitions()) if (state == std::get<0>(returnTransition.first) || returnTransition.second == state) return true; - for (const std::pair<const std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, StateType>& localTransition : automaton.getLocalTransitions()) + for (const std::pair<const std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, StateType>& localTransition : automaton.getLocalTransitions()) if (state == localTransition.first.first || localTransition.second == state) return true; diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h index 6ea0eb56f64c882cfddd597b6f1422b87d0152f3..bf28e24914af3ddfb6be778fcaed1598b8283901 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h @@ -42,9 +42,9 @@ class InitialStates; template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > class RealTimeHeightDeterministicNPDA final : public AutomatonBase, public alib::Components < RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, std::tuple < InputAlphabet >, std::tuple < >, PushdownStoreSymbolType, std::tuple < PushdownStoreAlphabet >, std::tuple < BottomOfTheStackSymbol >, StateType, std::tuple < States, InitialStates, FinalStates >, std::tuple < > > { protected: - std::map < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, std::set < std::pair < StateType, PushdownStoreSymbolType > > > callTransitions; - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < StateType > > returnTransitions; - std::map < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, std::set < StateType > > localTransitions; + std::map < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, std::set < std::pair < StateType, PushdownStoreSymbolType > > > callTransitions; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < StateType > > returnTransitions; + std::map < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, std::set < StateType > > localTransitions; public: explicit RealTimeHeightDeterministicNPDA ( std::set < StateType > states, std::set < InputSymbolType > inputAlphabet, std::set < PushdownStoreSymbolType > pushdownStoreSymbol, std::set < StateType > initialStates, PushdownStoreSymbolType bottomOfTheStackSymbol, std::set < StateType > finalStates ); @@ -157,7 +157,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addCallTransition ( StateType current, std::variant < EpsilonType, InputSymbolType > input, StateType next, PushdownStoreSymbolType push ); + bool addCallTransition ( StateType current, ext::variant < EpsilonType, InputSymbolType > input, StateType next, PushdownStoreSymbolType push ); bool addCallTransition ( StateType current, StateType next, PushdownStoreSymbolType push ); bool addCallTransition ( StateType current, InputSymbolType input, StateType next, PushdownStoreSymbolType push ); @@ -168,7 +168,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addReturnTransition ( StateType current, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType next ); + bool addReturnTransition ( StateType current, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType next ); bool addReturnTransition ( StateType current, PushdownStoreSymbolType pop, StateType next ); bool addReturnTransition ( StateType current, InputSymbolType input, PushdownStoreSymbolType pop, StateType next ); @@ -179,7 +179,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - bool addLocalTransition ( StateType current, std::variant < EpsilonType, InputSymbolType > input, StateType next ); + bool addLocalTransition ( StateType current, ext::variant < EpsilonType, InputSymbolType > input, StateType next ); bool addLocalTransition ( StateType current, StateType next ); bool addLocalTransition ( StateType current, InputSymbolType input, StateType next ); @@ -190,7 +190,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - void addCallTransitions ( StateType current, std::variant < EpsilonType, InputSymbolType > input, std::set < std::pair < StateType, PushdownStoreSymbolType > > targets ); + void addCallTransitions ( StateType current, ext::variant < EpsilonType, InputSymbolType > input, std::set < std::pair < StateType, PushdownStoreSymbolType > > targets ); void addCallTransitions ( StateType current, std::set < std::pair < StateType, PushdownStoreSymbolType > > targets ); void addCallTransitions ( StateType current, InputSymbolType input, std::set < std::pair < StateType, PushdownStoreSymbolType > > targets ); @@ -201,7 +201,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - void addReturnTransitions ( StateType current, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, std::set < StateType > next ); + void addReturnTransitions ( StateType current, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, std::set < StateType > next ); void addReturnTransitions ( StateType current, PushdownStoreSymbolType pop, std::set < StateType > next ); void addReturnTransitions ( StateType current, InputSymbolType input, PushdownStoreSymbolType pop, std::set < StateType > next ); @@ -212,7 +212,7 @@ public: * @param next next state * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton */ - void addLocalTransitions ( StateType current, std::variant < EpsilonType, InputSymbolType > input, std::set < StateType > next ); + void addLocalTransitions ( StateType current, ext::variant < EpsilonType, InputSymbolType > input, std::set < StateType > next ); void addLocalTransitions ( StateType current, std::set < StateType > next ); void addLocalTransitions ( StateType current, InputSymbolType input, std::set < StateType > next ); @@ -221,7 +221,7 @@ public: * @param transition transition to remove * @throws AutomatonException when transition doesn't exists. */ - bool removeCallTransition ( const StateType & current, const std::variant < EpsilonType, InputSymbolType > & input, const StateType & next, const PushdownStoreSymbolType & push ); + bool removeCallTransition ( const StateType & current, const ext::variant < EpsilonType, InputSymbolType > & input, const StateType & next, const PushdownStoreSymbolType & push ); bool removeCallTransition ( const StateType & current, const StateType & next, const PushdownStoreSymbolType & push ); bool removeCallTransition ( const StateType & current, const InputSymbolType & input, const StateType & next, const PushdownStoreSymbolType & push ); @@ -230,7 +230,7 @@ public: * @param transition transition to remove * @throws AutomatonException when transition doesn't exists. */ - bool removeReturnTransition ( const StateType & current, const std::variant < EpsilonType, InputSymbolType > & input, const PushdownStoreSymbolType & pop, const StateType & next ); + bool removeReturnTransition ( const StateType & current, const ext::variant < EpsilonType, InputSymbolType > & input, const PushdownStoreSymbolType & pop, const StateType & next ); bool removeReturnTransition ( const StateType & current, const PushdownStoreSymbolType & pop, const StateType & next ); bool removeReturnTransition ( const StateType & current, const InputSymbolType & input, const PushdownStoreSymbolType & pop, const StateType & next ); @@ -239,15 +239,15 @@ public: * @param transition transition to remove * @throws AutomatonException when transition doesn't exists. */ - bool removeLocalTransition ( const StateType & current, const std::variant < EpsilonType, InputSymbolType > & input, const StateType & next ); + bool removeLocalTransition ( const StateType & current, const ext::variant < EpsilonType, InputSymbolType > & input, const StateType & next ); bool removeLocalTransition ( const StateType & current, const StateType & next ); bool removeLocalTransition ( const StateType & current, const InputSymbolType & input, const StateType & next ); - const std::map < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, std::set < std::pair < StateType, PushdownStoreSymbolType > > > & getCallTransitions ( ) const; + const std::map < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, std::set < std::pair < StateType, PushdownStoreSymbolType > > > & getCallTransitions ( ) const; - const std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < StateType > > & getReturnTransitions ( ) const; + const std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < StateType > > & getReturnTransitions ( ) const; - const std::map < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, std::set < StateType > > & getLocalTransitions ( ) const; + const std::map < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, std::set < StateType > > & getLocalTransitions ( ) const; virtual int compare ( const ObjectBase & other ) const { if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other ); @@ -290,31 +290,31 @@ public: RealTimeHeightDeterministicNPDA < > * res = new RealTimeHeightDeterministicNPDA < > ( std::move ( states ), std::move ( alphabet ), std::move ( pushdownAlphabet ), std::move ( initialStates ), std::move ( bottomSymbol ), std::move ( finalStates ) ); - for ( std::pair < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, std::set < std::pair < StateType, PushdownStoreSymbolType > > > && transition : std::make_moveable_map ( callTransitions ) ) { + for ( std::pair < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, std::set < std::pair < StateType, PushdownStoreSymbolType > > > && transition : std::make_moveable_map ( callTransitions ) ) { std::set < std::pair < DefaultStateType, DefaultSymbolType > > targets; for ( std::pair < StateType, PushdownStoreSymbolType > && target : std::make_moveable_set ( transition.second ) ) targets.insert ( std::make_pair ( AutomatonNormalize::normalizeState ( std::move ( target.first ) ), alphabet::SymbolNormalize::normalizeSymbol ( std::move ( target.second ) ) ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( transition.first.first ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( transition.first.second ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( transition.first.second ) ); res->addCallTransitions ( std::move ( from ), std::move ( input ), std::move ( targets ) ); } - for ( std::pair < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < StateType > > && transition : std::make_moveable_map ( returnTransitions ) ) { + for ( std::pair < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < StateType > > && transition : std::make_moveable_map ( returnTransitions ) ) { std::set < DefaultStateType > targets = AutomatonNormalize::normalizeStates ( std::move ( transition.second ) ); DefaultSymbolType pop = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( std::get < 2 > ( transition.first ) ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( std::get < 0 > ( transition.first ) ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); res->addReturnTransitions ( std::move ( from ), std::move ( input ), std::move ( pop ), std::move ( targets ) ); } - for ( std::pair < std::pair < StateType, std::variant < EpsilonType, InputSymbolType > >, std::set < StateType > > && transition : std::make_moveable_map ( localTransitions ) ) { + for ( std::pair < std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > >, std::set < StateType > > && transition : std::make_moveable_map ( localTransitions ) ) { std::set < DefaultStateType > targets = AutomatonNormalize::normalizeStates ( std::move ( transition.second ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( transition.first.first ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( transition.first.second ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( transition.first.second ) ); res->addLocalTransitions ( std::move ( from ), std::move ( input ), std::move ( targets ) ); } @@ -342,7 +342,7 @@ AutomatonBase* RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, P } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransition(StateType from, std::variant < EpsilonType, InputSymbolType > input, StateType to, PushdownStoreSymbolType push) { +bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransition(StateType from, ext::variant < EpsilonType, InputSymbolType > input, StateType to, PushdownStoreSymbolType push) { if (! getStates().count(from)) { throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); } @@ -359,7 +359,7 @@ bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto throw AutomatonException("Pushdown store symbol \"" + ext::to_string ( push ) + "\" doesn't exist."); } - std::pair<StateType, std::variant < EpsilonType, InputSymbolType >> key(std::move(from), std::move(input)); + std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >> key(std::move(from), std::move(input)); std::pair<StateType, PushdownStoreSymbolType> value = std::make_pair(std::move(to), std::move(push)); return callTransitions[std::move(key)].insert(std::move(value)).second; @@ -367,18 +367,18 @@ bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransition(StateType from, StateType to, PushdownStoreSymbolType push) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransition(StateType from, InputSymbolType input, StateType to, PushdownStoreSymbolType push) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransition(StateType from, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to) { +bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransition(StateType from, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to) { if (! getStates().count(from)) { throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); } @@ -395,25 +395,25 @@ bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto throw AutomatonException("Pushdown store symbol \"" + ext::to_string ( pop ) + "\" doesn't exist."); } - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); return returnTransitions[std::move(key)].insert(std::move(to)).second; } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransition(StateType from, PushdownStoreSymbolType pop, StateType to) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransition(StateType from, InputSymbolType input, PushdownStoreSymbolType pop, StateType to) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransition(StateType from, std::variant < EpsilonType, InputSymbolType > input, StateType to) { +bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransition(StateType from, ext::variant < EpsilonType, InputSymbolType > input, StateType to) { if (! getStates().count(from)) { throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); } @@ -426,25 +426,25 @@ bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto throw AutomatonException("State \"" + ext::to_string ( to ) + "\" doesn't exist."); } - std::pair<StateType, std::variant < EpsilonType, InputSymbolType >> key(std::move(from), std::move(input)); + std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >> key(std::move(from), std::move(input)); return localTransitions[std::move(key)].insert(std::move(to)).second; } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransition(StateType from, StateType to) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransition(StateType from, InputSymbolType input, StateType to) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransitions(StateType from, std::variant < EpsilonType, InputSymbolType > input, std::set < std::pair < StateType, PushdownStoreSymbolType > > targets ) { +void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransitions(StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::set < std::pair < StateType, PushdownStoreSymbolType > > targets ) { if (! getStates().count(from)) throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); @@ -459,24 +459,24 @@ void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto throw AutomatonException("Pushdown store symbol \"" + ext::to_string ( target.second ) + "\" doesn't exist."); } - std::pair < StateType, std::variant < EpsilonType, InputSymbolType > > key ( std::move ( from ), std::move ( input ) ); + std::pair < StateType, ext::variant < EpsilonType, InputSymbolType > > key ( std::move ( from ), std::move ( input ) ); callTransitions [ std::move ( key ) ].insert ( std::make_moveable_set ( targets ).begin ( ), std::make_moveable_set ( targets ).end ( ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransitions(StateType from, std::set < std::pair < StateType, PushdownStoreSymbolType > > targets ) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); addCallTransitions(std::move(from), std::move(inputVariant), std::move ( targets ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addCallTransitions(StateType from, InputSymbolType input, std::set < std::pair < StateType, PushdownStoreSymbolType > > targets ) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); addCallTransitions(std::move(from), std::move(inputVariant), std::move ( targets ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransitions(StateType from, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, std::set < StateType > to) { +void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransitions(StateType from, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, std::set < StateType > to) { if (! getStates().count(from)) throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); @@ -489,24 +489,24 @@ void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto if ( ! getPushdownStoreAlphabet().count ( pop ) ) throw AutomatonException("Pushdown store symbol \"" + ext::to_string ( pop ) + "\" doesn't exist."); - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); returnTransitions[std::move(key)].insert ( std::make_moveable_set ( to ).begin ( ), std::make_moveable_set ( to ).end ( ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransitions(StateType from, PushdownStoreSymbolType pop, std::set < StateType > to) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); addReturnTransitions(std::move(from), std::move(inputVariant), std::move(pop), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addReturnTransitions(StateType from, InputSymbolType input, PushdownStoreSymbolType pop, std::set < StateType > to) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); addReturnTransitions(std::move(from), std::move(inputVariant), std::move(pop), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransitions(StateType from, std::variant < EpsilonType, InputSymbolType > input, std::set < StateType > to) { +void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransitions(StateType from, ext::variant < EpsilonType, InputSymbolType > input, std::set < StateType > to) { if (! getStates().count(from)) throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); @@ -516,25 +516,25 @@ void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto if ( !std::includes ( getStates ( ).begin ( ), getStates ( ).end ( ), to.begin ( ), to.end ( ) ) ) throw AutomatonException ( "Some target states don't exist." ); - std::pair<StateType, std::variant < EpsilonType, InputSymbolType >> key(std::move(from), std::move(input)); + std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >> key(std::move(from), std::move(input)); localTransitions[std::move(key)].insert ( std::make_moveable_set ( to ).begin ( ), std::make_moveable_set ( to ).end ( ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransitions(StateType from, std::set < StateType > to) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); addLocalTransitions(std::move(from), std::move(inputVariant), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addLocalTransitions(StateType from, InputSymbolType input, std::set < StateType > to) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); addLocalTransitions(std::move(from), std::move(inputVariant), std::move(to)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeCallTransition(const StateType& from, const std::variant < EpsilonType, InputSymbolType >& input, const StateType& to, const PushdownStoreSymbolType& push) { - std::pair<StateType, std::variant < EpsilonType, InputSymbolType >> key(from, input); +bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeCallTransition(const StateType& from, const ext::variant < EpsilonType, InputSymbolType >& input, const StateType& to, const PushdownStoreSymbolType& push) { + std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >> key(from, input); std::pair<StateType, PushdownStoreSymbolType> value = std::make_pair(to, push); return callTransitions[key].erase(value); @@ -542,66 +542,66 @@ bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeCallTransition(const StateType& from, const StateType& to, const PushdownStoreSymbolType& push) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeCallTransition(from, inputVariant, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeCallTransition(const StateType& from, const InputSymbolType& input, const StateType& to, const PushdownStoreSymbolType& push) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return removeCallTransition(from, inputVariant, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeReturnTransition(const StateType& from, const std::variant < EpsilonType, InputSymbolType >& input, const PushdownStoreSymbolType& pop, const StateType& to) { - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(from, input, pop); +bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeReturnTransition(const StateType& from, const ext::variant < EpsilonType, InputSymbolType >& input, const PushdownStoreSymbolType& pop, const StateType& to) { + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(from, input, pop); return returnTransitions[key].erase(to); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeReturnTransition(const StateType& from, const PushdownStoreSymbolType& pop, const StateType& to) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeReturnTransition(from, inputVariant, pop, to); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeReturnTransition(const StateType& from, const InputSymbolType& input, const PushdownStoreSymbolType& pop, const StateType& to) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return removeReturnTransition(from, inputVariant, pop, to); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeLocalTransition(const StateType& from, const std::variant < EpsilonType, InputSymbolType >& input, const StateType& to) { - std::pair<StateType, std::variant < EpsilonType, InputSymbolType >> key(from, input); +bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeLocalTransition(const StateType& from, const ext::variant < EpsilonType, InputSymbolType >& input, const StateType& to) { + std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >> key(from, input); return localTransitions[key].erase(to); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeLocalTransition(const StateType& from, const StateType& to) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeLocalTransition(from, inputVariant, to); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeLocalTransition(const StateType& from, const InputSymbolType& input, const StateType& to) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return removeLocalTransition(from, inputVariant, to); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::set<std::pair<StateType, PushdownStoreSymbolType> > >& RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getCallTransitions() const { +const std::map<std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::set<std::pair<StateType, PushdownStoreSymbolType> > >& RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getCallTransitions() const { return callTransitions; } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<StateType> >& RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getReturnTransitions() const { +const std::map<std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<StateType> >& RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getReturnTransitions() const { return returnTransitions; } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::set<StateType> >& RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getLocalTransitions() const { +const std::map<std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::set<StateType> >& RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getLocalTransitions() const { return localTransitions; } @@ -665,7 +665,7 @@ void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition")) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "callTransition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); PushdownStoreSymbolType push = AutomatonFromXMLParser::parseTransitionSinglePush<PushdownStoreSymbolType>(input); @@ -674,7 +674,7 @@ void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto } else if(sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition")) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "returnTransition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); PushdownStoreSymbolType pop = AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); @@ -683,7 +683,7 @@ void RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownSto } else { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "localTransition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); automaton.addLocalTransition(std::move(from), std::move(inputSymbol), std::move(to)); @@ -760,15 +760,15 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy class ComponentConstraint< automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, automaton::InputAlphabet > { public: static bool used ( const automaton::RealTimeHeightDeterministicNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton, const InputSymbolType & symbol ) { - for (const std::pair<const std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::set<std::pair<StateType, PushdownStoreSymbolType> > >& callTransition : automaton.getCallTransitions()) + for (const std::pair<const std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::set<std::pair<StateType, PushdownStoreSymbolType> > >& callTransition : automaton.getCallTransitions()) if (callTransition.first.second.template is < InputSymbolType >() && symbol == callTransition.first.second.template get < InputSymbolType >()) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<StateType> >& returnTransition : automaton.getReturnTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<StateType> >& returnTransition : automaton.getReturnTransitions()) if (std::get<1>(returnTransition.first).template is < InputSymbolType >() && symbol == std::get<1>(returnTransition.first).template get < InputSymbolType >()) return true; - for (const std::pair<const std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::set<StateType> >& localTransition : automaton.getLocalTransitions()) + for (const std::pair<const std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::set<StateType> >& localTransition : automaton.getLocalTransitions()) if (localTransition.first.second.template is < InputSymbolType >() && symbol == localTransition.first.second.template get < InputSymbolType >()) return true; @@ -790,12 +790,12 @@ public: if(automaton.getBottomOfTheStackSymbol() == symbol) return true; - for (const std::pair<const std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::set<std::pair<StateType, PushdownStoreSymbolType> > >& callTransition : automaton.getCallTransitions()) + for (const std::pair<const std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::set<std::pair<StateType, PushdownStoreSymbolType> > >& callTransition : automaton.getCallTransitions()) for(const std::pair<StateType, PushdownStoreSymbolType>& to : callTransition.second) if (symbol == to.second) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<StateType> >& returnTransition : automaton.getReturnTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<StateType> >& returnTransition : automaton.getReturnTransitions()) if (symbol == std::get<2>(returnTransition.first)) return true; @@ -831,7 +831,7 @@ public: if ( automaton.getFinalStates ( ).count ( state ) ) return true; - for (const std::pair<const std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::set<std::pair<StateType, PushdownStoreSymbolType> > >& callTransition : automaton.getCallTransitions()) { + for (const std::pair<const std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::set<std::pair<StateType, PushdownStoreSymbolType> > >& callTransition : automaton.getCallTransitions()) { if (state == callTransition.first.first) return true; @@ -840,7 +840,7 @@ public: return true; } - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<StateType> >& returnTransition : automaton.getReturnTransitions()) { + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<StateType> >& returnTransition : automaton.getReturnTransitions()) { if (state == std::get<0>(returnTransition.first)) return true; @@ -849,7 +849,7 @@ public: return true; } - for (const std::pair<const std::pair<StateType, std::variant < EpsilonType, InputSymbolType >>, std::set<StateType> >& localTransition : automaton.getLocalTransitions()) { + for (const std::pair<const std::pair<StateType, ext::variant < EpsilonType, InputSymbolType >>, std::set<StateType> >& localTransition : automaton.getLocalTransitions()) { if (state == localTransition.first.first) return true; diff --git a/alib2data/src/automaton/PDA/SinglePopDPDA.h b/alib2data/src/automaton/PDA/SinglePopDPDA.h index 395d7c448a646cd39217bc4b4bdfddfec9e47e84..cd654d4e2aa96d7fb272758d1d3a733de07b6094 100644 --- a/alib2data/src/automaton/PDA/SinglePopDPDA.h +++ b/alib2data/src/automaton/PDA/SinglePopDPDA.h @@ -47,7 +47,7 @@ class InitialState; template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > class SinglePopDPDA final : public AutomatonBase, public alib::Components < SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, std::tuple < InputAlphabet >, std::tuple < >, PushdownStoreSymbolType, std::tuple < PushdownStoreAlphabet >, std::tuple < InitialSymbol >, StateType, std::tuple < States, FinalStates >, std::tuple < InitialState > > { protected: - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > transitions; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > transitions; public: explicit SinglePopDPDA ( std::set < StateType > states, std::set < InputSymbolType > inputAlphabet, std::set < PushdownStoreSymbolType > pushdownStoreSymbol, StateType initialState, PushdownStoreSymbolType initialPushdownSymbol, std::set < StateType > finalStates ); @@ -151,7 +151,7 @@ public: * @throws AutomatonException when some part of the transition is not present * in the SinglePopDPDA (state, input symbol, stack symbol) or when transition already exists */ - bool addTransition ( StateType from, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to, std::vector < PushdownStoreSymbolType > push ); + bool addTransition ( StateType from, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to, std::vector < PushdownStoreSymbolType > push ); bool addTransition ( StateType from, InputSymbolType input, PushdownStoreSymbolType pop, StateType to, std::vector < PushdownStoreSymbolType > push ); @@ -162,7 +162,7 @@ public: * @param transition transition to remove * @throws AutomatonException when transition is not present in the SinglePopDPDA */ - bool removeTransition ( const StateType & from, const std::variant < EpsilonType, InputSymbolType > & input, const PushdownStoreSymbolType & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); + bool removeTransition ( const StateType & from, const ext::variant < EpsilonType, InputSymbolType > & input, const PushdownStoreSymbolType & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); bool removeTransition ( const StateType & from, const InputSymbolType & input, const PushdownStoreSymbolType & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); @@ -171,7 +171,7 @@ public: /** * @return SinglePopDPDA transitions */ - const std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > & getTransitions ( ) const; + const std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > & getTransitions ( ) const; virtual int compare ( const ObjectBase & other ) const { if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other ); @@ -214,13 +214,13 @@ public: SinglePopDPDA < > * res = new SinglePopDPDA < > ( std::move ( states ), std::move ( alphabet ), std::move ( pushdownAlphabet ), std::move ( initialState ), std::move ( bottomSymbol ), std::move ( finalStates ) ); - for ( std::pair < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > && transition : std::make_moveable_map ( transitions ) ) { + for ( std::pair < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::pair < StateType, std::vector < PushdownStoreSymbolType > > > && transition : std::make_moveable_map ( transitions ) ) { DefaultStateType to = AutomatonNormalize::normalizeState ( std::move ( transition.second.first ) ); std::vector < DefaultSymbolType > push = alphabet::SymbolNormalize::normalizeSymbols ( std::move ( transition.second.second ) ); DefaultSymbolType pop = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( std::get < 2 > ( transition.first ) ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( std::get < 0 > ( transition.first ) ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); res->addTransition ( std::move ( from ), std::move ( input ), std::move ( pop ), std::move ( to ), std::move ( push ) ); } @@ -248,7 +248,7 @@ AutomatonBase* SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbol } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to, std::vector<PushdownStoreSymbolType> push) { +bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to, std::vector<PushdownStoreSymbolType> push) { if (!getStates().count(from)) { throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); } @@ -271,7 +271,7 @@ bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, Stat } } - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); std::pair<StateType, std::vector<PushdownStoreSymbolType> > value = std::make_pair(std::move(to), std::move(push)); if (transitions.find(key) != transitions.end()) { @@ -284,13 +284,13 @@ bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, Stat } if(input.template is<EpsilonType>()) { - if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > & transition) { + if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::pair<StateType, std::vector<PushdownStoreSymbolType> > > & transition) { if(std::get<0>(transition.first) == std::get<0>(key) && std::get<2>(transition.first) == std::get<2>(key)) return true; return false; })) throw AutomatonException("Conflicting transition"); } else { - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key2(std::get<0>(key), std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ), std::get<2>(key)); + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key2(std::get<0>(key), ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ), std::get<2>(key)); if(transitions.find(key2) != transitions.end()) throw AutomatonException("Conflicting transition"); } @@ -301,19 +301,19 @@ bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, Stat template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, InputSymbolType input, PushdownStoreSymbolType pop, StateType to, std::vector<PushdownStoreSymbolType> push) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, PushdownStoreSymbolType pop, StateType to, std::vector<PushdownStoreSymbolType> push) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const std::variant < EpsilonType, InputSymbolType >& input, const PushdownStoreSymbolType& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(from, input, pop); +bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const ext::variant < EpsilonType, InputSymbolType >& input, const PushdownStoreSymbolType& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(from, input, pop); std::pair<StateType, std::vector<PushdownStoreSymbolType> > value = std::make_pair(to, push); if (transitions.find(key) == transitions.end()) @@ -332,18 +332,18 @@ bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, Stat template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const InputSymbolType& input, const PushdownStoreSymbolType& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return removeTransition(from, inputVariant, pop, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const PushdownStoreSymbolType& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeTransition(from, inputVariant, pop, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitions() const { +const std::map<std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitions() const { return transitions; } @@ -403,7 +403,7 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy void SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(std::deque<sax::Token>::iterator& input, SinglePopDPDA& automaton) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); PushdownStoreSymbolType pop = AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); std::vector<PushdownStoreSymbolType> push = AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); @@ -458,7 +458,7 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy class ComponentConstraint< automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, automaton::InputAlphabet > { public: static bool used ( const automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton, const InputSymbolType & symbol ) { - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) if (std::get<1>(transition.first).template is < InputSymbolType >() && symbol == std::get<1>(transition.first).template get < InputSymbolType >()) return true; @@ -477,7 +477,7 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy class ComponentConstraint< automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, PushdownStoreSymbolType, automaton::PushdownStoreAlphabet > { public: static bool used ( const automaton::SinglePopDPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton, const PushdownStoreSymbolType & symbol ) { - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) if (symbol == std::get<2>(transition.first) || std::find(transition.second.second.begin(), transition.second.second.end(), symbol) != transition.second.second.end()) return true; @@ -516,7 +516,7 @@ public: if ( automaton.getFinalStates ( ).count ( state ) ) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::pair<StateType, std::vector<PushdownStoreSymbolType> > >& transition : automaton.getTransitions()) if (state == std::get<0>(transition.first) || transition.second.first == state) return true; diff --git a/alib2data/src/automaton/PDA/SinglePopNPDA.h b/alib2data/src/automaton/PDA/SinglePopNPDA.h index dd531f540658abfea8d6554a2a988960e63986d8..d740e8b7e66e96667087a6fdb2c6c511c0be2b37 100644 --- a/alib2data/src/automaton/PDA/SinglePopNPDA.h +++ b/alib2data/src/automaton/PDA/SinglePopNPDA.h @@ -42,7 +42,7 @@ class InitialState; template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > class SinglePopNPDA final : public AutomatonBase, public alib::Components < SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, std::tuple < InputAlphabet >, std::tuple < >, PushdownStoreSymbolType, std::tuple < PushdownStoreAlphabet >, std::tuple < InitialSymbol >, StateType, std::tuple < States, FinalStates >, std::tuple < InitialState > > { protected: - std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > transitions; + std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > transitions; public: explicit SinglePopNPDA ( std::set < StateType > states, std::set < InputSymbolType > inputAlphabet, std::set < PushdownStoreSymbolType > pushdownStoreSymbol, StateType initialState, PushdownStoreSymbolType initialPushdownSymbol, std::set < StateType > finalStates ); @@ -146,7 +146,7 @@ public: * @throws AutomatonException when some part of the transition is not present * in the SinglePopNPDA (state, input symbol, stack symbol) or when transition already exists */ - bool addTransition ( StateType from, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to, std::vector < PushdownStoreSymbolType > push ); + bool addTransition ( StateType from, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to, std::vector < PushdownStoreSymbolType > push ); bool addTransition ( StateType from, InputSymbolType input, PushdownStoreSymbolType pop, StateType to, std::vector < PushdownStoreSymbolType > push ); @@ -158,7 +158,7 @@ public: * @throws AutomatonException when some part of the transition is not present * in the SinglePopNPDA (state, input symbol, stack symbol) or when transition already exists */ - void addTransitions ( StateType from, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > push ); + void addTransitions ( StateType from, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > push ); void addTransitions ( StateType from, InputSymbolType input, PushdownStoreSymbolType pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > push ); @@ -169,7 +169,7 @@ public: * @param transition transition to remove * @throws AutomatonException when transition is not present in the SinglePopNPDA */ - bool removeTransition ( const StateType & from, const std::variant < EpsilonType, InputSymbolType > & input, const PushdownStoreSymbolType & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); + bool removeTransition ( const StateType & from, const ext::variant < EpsilonType, InputSymbolType > & input, const PushdownStoreSymbolType & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); bool removeTransition ( const StateType & from, const InputSymbolType & input, const PushdownStoreSymbolType & pop, const StateType & to, const std::vector < PushdownStoreSymbolType > & push ); @@ -178,7 +178,7 @@ public: /** * @return SinglePopNPDA transitions */ - const std::map < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > & getTransitions ( ) const; + const std::map < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > & getTransitions ( ) const; virtual int compare ( const ObjectBase & other ) const { if ( std::type_index ( typeid ( * this ) ) == std::type_index ( typeid ( other ) ) ) return this->compare ( ( decltype ( * this ) )other ); @@ -221,14 +221,14 @@ public: SinglePopNPDA < > * res = new SinglePopNPDA < > ( std::move ( states ), std::move ( alphabet ), std::move ( pushdownAlphabet ), std::move ( initialState ), std::move ( bottomSymbol ), std::move ( finalStates ) ); - for ( std::pair < std::tuple < StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > && transition : std::make_moveable_map ( transitions ) ) { + for ( std::pair < std::tuple < StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType >, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > > && transition : std::make_moveable_map ( transitions ) ) { std::set < std::pair < DefaultStateType, std::vector < DefaultSymbolType > > > targets; for ( std::pair < StateType, std::vector < PushdownStoreSymbolType > > && target : std::make_moveable_set ( transition.second ) ) targets.insert ( std::make_pair ( AutomatonNormalize::normalizeState ( std::move ( target.first ) ), alphabet::SymbolNormalize::normalizeSymbols ( std::move ( target.second ) ) ) ); DefaultSymbolType pop = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( std::get < 2 > ( transition.first ) ) ); DefaultStateType from = AutomatonNormalize::normalizeState ( std::move ( std::get < 0 > ( transition.first ) ) ); - std::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); + ext::variant < DefaultEpsilonType, DefaultSymbolType > input = AutomatonNormalize::normalizeSymbolEpsilon ( std::move ( std::get < 1 > ( transition.first ) ) ); res->addTransitions ( std::move ( from ), std::move ( input ), std::move ( pop ), std::move ( targets ) ); } @@ -256,7 +256,7 @@ AutomatonBase* SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbol } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to, std::vector<PushdownStoreSymbolType> push) { +bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, StateType to, std::vector<PushdownStoreSymbolType> push) { if (! getStates().count(from)) { throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); } @@ -279,7 +279,7 @@ bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, Stat } } - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); std::pair<StateType, std::vector<PushdownStoreSymbolType> > value = std::make_pair(std::move(to), std::move(push)); return transitions[std::move(key)].insert(std::move(value)).second; @@ -287,18 +287,18 @@ bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, Stat template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, InputSymbolType input, PushdownStoreSymbolType pop, StateType to, std::vector<PushdownStoreSymbolType> push) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransition(StateType from, PushdownStoreSymbolType pop, StateType to, std::vector<PushdownStoreSymbolType> push) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push)); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -void SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions(StateType from, std::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > targets ) { +void SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions(StateType from, ext::variant < EpsilonType, InputSymbolType > input, PushdownStoreSymbolType pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > targets ) { if (! getStates().count(from)) throw AutomatonException("State \"" + ext::to_string ( from ) + "\" doesn't exist."); @@ -317,25 +317,25 @@ void SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, Stat throw AutomatonException("Pushdown store symbol \"" + ext::to_string ( pushSymbol ) + "\" doesn't exist."); } - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(std::move(from), std::move(input), std::move(pop)); transitions [ std::move ( key ) ].insert ( std::make_moveable_set ( targets ).begin ( ), std::make_moveable_set ( targets ).end ( ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions(StateType from, InputSymbolType input, PushdownStoreSymbolType pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > > targets) { - std::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); + ext::variant < EpsilonType, InputSymbolType > inputVariant(std::move(input)); addTransitions(std::move(from), std::move(inputVariant), std::move(pop), std::move ( targets ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > void SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::addTransitions(StateType from, PushdownStoreSymbolType pop, std::set < std::pair < StateType, std::vector < PushdownStoreSymbolType > > >targets ) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); addTransitions(std::move(from), std::move(inputVariant), std::move(pop), std::move ( targets ) ); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const std::variant < EpsilonType, InputSymbolType >& input, const PushdownStoreSymbolType& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { - std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(from, input, pop); +bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const ext::variant < EpsilonType, InputSymbolType >& input, const PushdownStoreSymbolType& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { + std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType> key(from, input, pop); std::pair<StateType, std::vector<PushdownStoreSymbolType> > value = std::make_pair(to, push); return transitions[key].erase(value); @@ -343,18 +343,18 @@ bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, Stat template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const InputSymbolType& input, const PushdownStoreSymbolType& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { - std::variant < EpsilonType, InputSymbolType > inputVariant(input); + ext::variant < EpsilonType, InputSymbolType > inputVariant(input); return removeTransition(from, inputVariant, pop, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > bool SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::removeTransition(const StateType& from, const PushdownStoreSymbolType& pop, const StateType& to, const std::vector<PushdownStoreSymbolType>& push) { - auto inputVariant = std::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); + auto inputVariant = ext::variant < EpsilonType, InputSymbolType >::template from < EpsilonType > ( ); return removeTransition(from, inputVariant, pop, to, push); } template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType > -const std::map<std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitions() const { +const std::map<std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::getTransitions() const { return transitions; } @@ -414,7 +414,7 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy void SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >::parseTransition(std::deque<sax::Token>::iterator& input, SinglePopNPDA& automaton) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "transition"); StateType from = AutomatonFromXMLParser::parseTransitionFrom<StateType>(input); - std::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); + ext::variant < EpsilonType, InputSymbolType > inputSymbol = AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol<EpsilonType, InputSymbolType>(input); PushdownStoreSymbolType pop = AutomatonFromXMLParser::parseTransitionSinglePop<PushdownStoreSymbolType>(input); StateType to = AutomatonFromXMLParser::parseTransitionTo<StateType>(input); std::vector<PushdownStoreSymbolType> push = AutomatonFromXMLParser::parseTransitionPush<PushdownStoreSymbolType>(input); @@ -471,7 +471,7 @@ template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolTy class ComponentConstraint< automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType >, InputSymbolType, automaton::InputAlphabet > { public: static bool used ( const automaton::SinglePopNPDA < InputSymbolType, EpsilonType, PushdownStoreSymbolType, StateType > & automaton, const InputSymbolType & symbol ) { - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) if (std::get<1>(transition.first).template is < InputSymbolType >() && symbol == std::get<1>(transition.first).template get < InputSymbolType >()) return true; @@ -493,7 +493,7 @@ public: if(automaton.getInitialSymbol() == symbol) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) { + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) { if (symbol == std::get<2>(transition.first)) return true; @@ -534,7 +534,7 @@ public: if ( automaton.getFinalStates ( ).count ( state ) ) return true; - for (const std::pair<const std::tuple<StateType, std::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) { + for (const std::pair<const std::tuple<StateType, ext::variant < EpsilonType, InputSymbolType >, PushdownStoreSymbolType>, std::set<std::pair<StateType, std::vector<PushdownStoreSymbolType> > > >& transition : automaton.getTransitions()) { if (state == std::get<0>(transition.first)) return true; diff --git a/alib2data/src/automaton/common/AutomatonFromXMLParser.h b/alib2data/src/automaton/common/AutomatonFromXMLParser.h index 861f030933c9e2b5601acb06fb73f22de0687914..ca13f9dcbcb92f81470c3cfc23a6f40b74ca0607 100644 --- a/alib2data/src/automaton/common/AutomatonFromXMLParser.h +++ b/alib2data/src/automaton/common/AutomatonFromXMLParser.h @@ -84,14 +84,14 @@ public: template < class SymbolType > static SymbolType parseTransitionInputSymbol(std::deque<sax::Token>::iterator& input); template < class EpsilonType, class SymbolType > - static std::variant<EpsilonType, SymbolType> parseTransitionInputEpsilonSymbol(std::deque<sax::Token>::iterator& input); + static ext::variant<EpsilonType, SymbolType> parseTransitionInputEpsilonSymbol(std::deque<sax::Token>::iterator& input); template < class SymbolType > static std::vector<SymbolType> parseTransitionInputSymbolMultiple(std::deque<sax::Token>::iterator& input); template < class SymbolType > static SymbolType parseTransitionOutputSymbol(std::deque<sax::Token>::iterator& input); template < class EpsilonType, class SymbolType > - static std::variant<EpsilonType, SymbolType> parseTransitionOutputEpsilonSymbol(std::deque<sax::Token>::iterator& input); + static ext::variant<EpsilonType, SymbolType> parseTransitionOutputEpsilonSymbol(std::deque<sax::Token>::iterator& input); template < class SymbolType > static std::vector<SymbolType> parseTransitionOutputSymbolMultiple(std::deque<sax::Token>::iterator& input); @@ -422,34 +422,34 @@ SymbolType AutomatonFromXMLParser::parseTransitionOutputSymbol ( std::deque < sa } template < class EpsilonType, class SymbolType > -std::variant < EpsilonType, SymbolType > AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol ( std::deque < sax::Token >::iterator & input ) { +ext::variant < EpsilonType, SymbolType > AutomatonFromXMLParser::parseTransitionInputEpsilonSymbol ( std::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "input" ); if ( sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, "epsilon" ) ) { - std::variant < EpsilonType, SymbolType > result = std::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ); + ext::variant < EpsilonType, SymbolType > result = ext::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ); ++input; sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "epsilon" ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "input" ); return result; } else { - std::variant < EpsilonType, SymbolType > result ( alib::xmlApi < SymbolType >::parse ( input ) ); + ext::variant < EpsilonType, SymbolType > result ( alib::xmlApi < SymbolType >::parse ( input ) ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "input" ); return result; } } template < class EpsilonType, class SymbolType > -std::variant < EpsilonType, SymbolType > AutomatonFromXMLParser::parseTransitionOutputEpsilonSymbol ( std::deque < sax::Token >::iterator & input ) { +ext::variant < EpsilonType, SymbolType > AutomatonFromXMLParser::parseTransitionOutputEpsilonSymbol ( std::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "output" ); if ( sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, "epsilon" ) ) { - std::variant < EpsilonType, SymbolType > result = std::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ); + ext::variant < EpsilonType, SymbolType > result = ext::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ); ++input; sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "epsilon" ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "output" ); return result; } else { - std::variant < EpsilonType, SymbolType > result ( alib::xmlApi < SymbolType >::parse ( input ) ); + ext::variant < EpsilonType, SymbolType > result ( alib::xmlApi < SymbolType >::parse ( input ) ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "output" ); return result; } diff --git a/alib2data/src/automaton/common/AutomatonNormalize.h b/alib2data/src/automaton/common/AutomatonNormalize.h index 8bfcd22e391c358957b3a5350c7cbb2b7877bd43..e4ef255a922b42c14343e06c5b2b3838f15770b7 100644 --- a/alib2data/src/automaton/common/AutomatonNormalize.h +++ b/alib2data/src/automaton/common/AutomatonNormalize.h @@ -41,7 +41,7 @@ public: static DefaultStateType normalizeState ( StateType && state); template < class EpsilonType, class SymbolType > - static std::variant < DefaultEpsilonType, DefaultSymbolType > normalizeSymbolEpsilon ( std::variant < EpsilonType, SymbolType > && symbol ); + static ext::variant < DefaultEpsilonType, DefaultSymbolType > normalizeSymbolEpsilon ( ext::variant < EpsilonType, SymbolType > && symbol ); template < class SymbolType > static regexp::UnboundedRegExpStructure < DefaultSymbolType > normalizeRegExp ( regexp::UnboundedRegExpStructure < SymbolType > && regexp ); @@ -82,11 +82,11 @@ DefaultStateType AutomatonNormalize::normalizeState ( StateType && state) { } template < class EpsilonType, class SymbolType > -std::variant < DefaultEpsilonType, DefaultSymbolType > AutomatonNormalize::normalizeSymbolEpsilon ( std::variant < EpsilonType, SymbolType > && symbol ) { +ext::variant < DefaultEpsilonType, DefaultSymbolType > AutomatonNormalize::normalizeSymbolEpsilon ( ext::variant < EpsilonType, SymbolType > && symbol ) { if ( symbol.template is < EpsilonType > ( ) ) - return std::variant < DefaultEpsilonType, DefaultSymbolType >::template from < DefaultEpsilonType > ( ); + return ext::variant < DefaultEpsilonType, DefaultSymbolType >::template from < DefaultEpsilonType > ( ); else - return std::variant < DefaultEpsilonType, DefaultSymbolType > ( alphabet::SymbolNormalize::normalizeSymbol ( std::move ( symbol.template get < SymbolType > ( ) ) ) ); + return ext::variant < DefaultEpsilonType, DefaultSymbolType > ( alphabet::SymbolNormalize::normalizeSymbol ( std::move ( symbol.template get < SymbolType > ( ) ) ) ); } template < class SymbolType > diff --git a/alib2data/src/automaton/common/AutomatonToXMLComposer.h b/alib2data/src/automaton/common/AutomatonToXMLComposer.h index 566d1a58828943f9bbe06da2b145d82a312b1072..bb02c87d57697ad026990a919c00e6f7de383aa7 100644 --- a/alib2data/src/automaton/common/AutomatonToXMLComposer.h +++ b/alib2data/src/automaton/common/AutomatonToXMLComposer.h @@ -80,13 +80,13 @@ public: template<class SymbolType> static void composeTransitionInputSymbol(std::deque<sax::Token>&, const SymbolType& symbol); template<class EpsilonType, class SymbolType> - static void composeTransitionInputEpsilonSymbol(std::deque<sax::Token>&, const std::variant<EpsilonType, SymbolType>&); + static void composeTransitionInputEpsilonSymbol(std::deque<sax::Token>&, const ext::variant<EpsilonType, SymbolType>&); template<class SymbolType> static void composeTransitionInputSymbolMultiple(std::deque<sax::Token>&, const std::vector<SymbolType>& symbols); template<class SymbolType> static void composeTransitionOutputSymbol(std::deque<sax::Token>&, const SymbolType& symbol); template<class EpsilonType, class SymbolType> - static void composeTransitionOutputEpsilonSymbol(std::deque<sax::Token>&, const std::variant<EpsilonType, SymbolType>&); + static void composeTransitionOutputEpsilonSymbol(std::deque<sax::Token>&, const ext::variant<EpsilonType, SymbolType>&); template<class SymbolType> static void composeTransitionOutputSymbolMultiple(std::deque<sax::Token>&, const std::vector<SymbolType>& symbols); @@ -341,7 +341,7 @@ void AutomatonToXMLComposer::composeTransitionInputSymbolMultiple(std::deque<sax } template < class EpsilonType, class SymbolType > -void AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(std::deque<sax::Token>& out, const std::variant<EpsilonType, SymbolType>& symbol) { +void AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(std::deque<sax::Token>& out, const ext::variant<EpsilonType, SymbolType>& symbol) { out.emplace_back("input", sax::Token::TokenType::START_ELEMENT); if(symbol.template is<EpsilonType>()) { out.emplace_back("epsilon", sax::Token::TokenType::START_ELEMENT); @@ -353,7 +353,7 @@ void AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(std::deque<sax: } template < class EpsilonType, class SymbolType > -void AutomatonToXMLComposer::composeTransitionOutputEpsilonSymbol(std::deque<sax::Token>& out, const std::variant<EpsilonType, SymbolType>& symbol) { +void AutomatonToXMLComposer::composeTransitionOutputEpsilonSymbol(std::deque<sax::Token>& out, const ext::variant<EpsilonType, SymbolType>& symbol) { out.emplace_back("output", sax::Token::TokenType::START_ELEMENT); if(symbol.template is<EpsilonType>()) { out.emplace_back("epsilon", sax::Token::TokenType::START_ELEMENT); diff --git a/alib2data/src/grammar/ContextFree/CNF.h b/alib2data/src/grammar/ContextFree/CNF.h index fe31f6b744e752cd9fb874b6a783cfb1631be174..fd0ec94710d4dd44763f9bf11010bdfdd9e56823 100644 --- a/alib2data/src/grammar/ContextFree/CNF.h +++ b/alib2data/src/grammar/ContextFree/CNF.h @@ -37,7 +37,7 @@ class InitialSymbol; template < class SymbolType > class CNF final : public GrammarBase, public alib::Components < CNF < SymbolType >, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > { - std::map < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > rules; + std::map < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > rules; bool generatesEpsilon; public: @@ -49,15 +49,15 @@ public: virtual GrammarBase * plunder ( ) &&; - bool addRule ( SymbolType leftHandSide, std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ); + bool addRule ( SymbolType leftHandSide, ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ); bool addRule ( SymbolType leftHandSide, SymbolType rightHandSide ); bool addRule ( SymbolType leftHandSide, std::pair < SymbolType, SymbolType > rightHandSide ); - void addRules ( SymbolType leftHandSide, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ); + void addRules ( SymbolType leftHandSide, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ); - const std::map < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & getRules ( ) const; + const std::map < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & getRules ( ) const; - bool removeRule ( const SymbolType & leftHandSide, const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ); + bool removeRule ( const SymbolType & leftHandSide, const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ); bool removeRule ( const SymbolType & leftHandSide, const SymbolType & rightHandSide ); bool removeRule ( const SymbolType & leftHandSide, const std::pair < SymbolType, SymbolType > & rightHandSide ); @@ -140,10 +140,10 @@ public: CNF < > * res = new CNF < > ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) ); - for ( std::pair < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > && rule : std::make_moveable_map ( rules ) ) { + for ( std::pair < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > && rule : std::make_moveable_map ( rules ) ) { - std::set < std::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > > rhs; - for ( std::variant < SymbolType, std::pair < SymbolType, SymbolType > > && target : std::make_moveable_set ( rule.second ) ) + std::set < ext::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > > rhs; + for ( ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > && target : std::make_moveable_set ( rule.second ) ) rhs.insert ( GrammarNormalize::normalizeRHS ( std::move ( target ) ) ); DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) ); @@ -176,7 +176,7 @@ GrammarBase * CNF < SymbolType >::plunder ( ) && { } template < class SymbolType > -bool CNF < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ) { +bool CNF < SymbolType >::addRule ( SymbolType leftHandSide, ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); @@ -198,24 +198,24 @@ bool CNF < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < Symbo template < class SymbolType > bool CNF < SymbolType >::addRule ( SymbolType leftHandSide, SymbolType rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > bool CNF < SymbolType >::addRule ( SymbolType leftHandSide, std::pair < SymbolType, SymbolType > rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > -void CNF < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ) { +void CNF < SymbolType >::addRules ( SymbolType leftHandSide, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & element : rightHandSide ) { + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & element : rightHandSide ) { if ( element.template is < SymbolType > ( ) ) { if ( !getTerminalAlphabet ( ).count ( element.template get < SymbolType > ( ) ) ) throw GrammarException ( "Rule must rewrite to terminal symbol" ); @@ -234,25 +234,25 @@ void CNF < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std::var } template < class SymbolType > -const std::map < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & CNF < SymbolType >::getRules ( ) const { +const std::map < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & CNF < SymbolType >::getRules ( ) const { return rules; } template < class SymbolType > -bool CNF < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ) { +bool CNF < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ) { return rules[leftHandSide].erase ( rightHandSide ); } template < class SymbolType > bool CNF < SymbolType >::removeRule ( const SymbolType & leftHandSide, const SymbolType & rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } template < class SymbolType > bool CNF < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::pair < SymbolType, SymbolType > & rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } @@ -375,7 +375,7 @@ CNF < SymbolType > CNF < SymbolType >::parse ( std::deque < sax::Token >::iterat template < class SymbolType > void CNF < SymbolType >::parseRule ( std::deque < sax::Token >::iterator & input, CNF & grammar ) { SymbolType lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS < SymbolType > ( input ); - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs = GrammarFromXMLParser::parseRuleOneOrTwoSymbolsRHS < SymbolType > ( input ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs = GrammarFromXMLParser::parseRuleOneOrTwoSymbolsRHS < SymbolType > ( input ); grammar.addRule ( std::move ( lhs ), std::move ( rhs ) ); } @@ -424,8 +424,8 @@ template < class SymbolType > class ComponentConstraint< grammar::CNF < SymbolType >, SymbolType, grammar::TerminalAlphabet > { public: static bool used ( const grammar::CNF < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) + for ( const std::pair < const SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) if ( ( rhs.template is < SymbolType > ( ) && ( rhs.template get < SymbolType > ( ) == symbol ) ) || ( rhs.template get < std::pair < SymbolType, SymbolType > > ( ).first == symbol ) ) return true; @@ -446,11 +446,11 @@ template < class SymbolType > class ComponentConstraint< grammar::CNF < SymbolType >, SymbolType, grammar::NonterminalAlphabet > { public: static bool used ( const grammar::CNF < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) { + for ( const std::pair < const SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) { if ( rule.first == symbol ) return true; - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) if ( rhs.template get < std::pair < SymbolType, SymbolType > > ( ).second == symbol ) return true; diff --git a/alib2data/src/grammar/ContextFree/LG.h b/alib2data/src/grammar/ContextFree/LG.h index 4baf568306da75766734b8324876a420d03dddce..1fdffbe7babd5b13573cb5fa74ddb131dff5e1f3 100644 --- a/alib2data/src/grammar/ContextFree/LG.h +++ b/alib2data/src/grammar/ContextFree/LG.h @@ -38,7 +38,7 @@ class InitialSymbol; template < class SymbolType > class LG final : public GrammarBase, public alib::Components < LG < SymbolType >, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > { - std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > rules; + std::map < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > rules; public: explicit LG ( SymbolType initialSymbol ); @@ -49,15 +49,15 @@ public: virtual GrammarBase * plunder ( ) &&; - bool addRule ( SymbolType leftHandSide, std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rightHandSide ); + bool addRule ( SymbolType leftHandSide, ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rightHandSide ); bool addRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ); bool addRule ( SymbolType leftHandSide, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > rightHandSide ); - void addRules ( SymbolType leftHandSide, std::set < std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > rightHandSide ); + void addRules ( SymbolType leftHandSide, std::set < ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > rightHandSide ); - const std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > & getRules ( ) const; + const std::map < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > & getRules ( ) const; - bool removeRule ( const SymbolType & leftHandSide, const std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > & rightHandSide ); + bool removeRule ( const SymbolType & leftHandSide, const ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > & rightHandSide ); bool removeRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ); bool removeRule ( const SymbolType & leftHandSide, const std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > & rightHandSide ); @@ -137,10 +137,10 @@ public: LG < > * res = new LG < > ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) ); - for ( std::pair < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > && rule : std::make_moveable_map ( rules ) ) { + for ( std::pair < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > && rule : std::make_moveable_map ( rules ) ) { - std::set < std::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < DefaultSymbolType >, DefaultSymbolType, std::vector < DefaultSymbolType > > > > rhs; - for ( std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > && target : std::make_moveable_set ( rule.second ) ) + std::set < ext::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < DefaultSymbolType >, DefaultSymbolType, std::vector < DefaultSymbolType > > > > rhs; + for ( ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > && target : std::make_moveable_set ( rule.second ) ) rhs.insert ( GrammarNormalize::normalizeRHS ( std::move ( target ) ) ); DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) ); @@ -171,7 +171,7 @@ GrammarBase * LG < SymbolType >::plunder ( ) && { } template < class SymbolType > -bool LG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rightHandSide ) { +bool LG < SymbolType >::addRule ( SymbolType leftHandSide, ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); @@ -201,24 +201,24 @@ bool LG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < std::v template < class SymbolType > bool LG < SymbolType >::addRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ) { - std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rhs ( std::move ( rightHandSide ) ); + ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > bool LG < SymbolType >::addRule ( SymbolType leftHandSide, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > rightHandSide ) { - std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rhs ( std::move ( rightHandSide ) ); + ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > -void LG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > rightHandSide ) { +void LG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); - for ( const std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > & element : rightHandSide ) { + for ( const ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > & element : rightHandSide ) { if ( element.template is < std::vector < SymbolType > > ( ) ) { const std::vector < SymbolType > & rhs = element.template get < std::vector < SymbolType > > ( ); @@ -245,25 +245,25 @@ void LG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std::vari } template < class SymbolType > -const std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > & LG < SymbolType >::getRules ( ) const { +const std::map < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > & LG < SymbolType >::getRules ( ) const { return rules; } template < class SymbolType > -bool LG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > & rightHandSide ) { +bool LG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > & rightHandSide ) { return rules[leftHandSide].erase ( rightHandSide ); } template < class SymbolType > bool LG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ) { - std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rhs ( rightHandSide ); + ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } template < class SymbolType > bool LG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > & rightHandSide ) { - std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rhs ( rightHandSide ); + ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } @@ -410,8 +410,8 @@ template < class SymbolType > class ComponentConstraint< grammar::LG < SymbolType >, SymbolType, grammar::TerminalAlphabet > { public: static bool used ( const grammar::LG < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > & rule : grammar.getRules ( ) ) { - for ( const std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > & rhsTmp : rule.second ) + for ( const std::pair < const SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > & rule : grammar.getRules ( ) ) { + for ( const ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > & rhsTmp : rule.second ) if ( rhsTmp.template is < std::vector < SymbolType > > ( ) ) { const std::vector < SymbolType > & rhs = rhsTmp.template get < std::vector < SymbolType > > ( ); @@ -450,11 +450,11 @@ template < class SymbolType > class ComponentConstraint< grammar::LG < SymbolType >, SymbolType, grammar::NonterminalAlphabet > { public: static bool used ( const grammar::LG < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > & rule : grammar.getRules ( ) ) { + for ( const std::pair < const SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > > > & rule : grammar.getRules ( ) ) { if ( rule.first == symbol ) return true; - for ( const std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > & rhsTmp : rule.second ) + for ( const ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > & rhsTmp : rule.second ) if ( rhsTmp.template is < std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > ( ) ) { const std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > & rhs = rhsTmp.template get < std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > ( ); diff --git a/alib2data/src/grammar/Regular/LeftLG.h b/alib2data/src/grammar/Regular/LeftLG.h index cb5f37ebb459ec69384698082c610cb905a0c38a..83fb9f85a0ce7a1af8ba5fc54f3c6139d3f3d18d 100644 --- a/alib2data/src/grammar/Regular/LeftLG.h +++ b/alib2data/src/grammar/Regular/LeftLG.h @@ -67,7 +67,7 @@ class LeftLG final : public GrammarBase, public alib::Components < LeftLG < Symb /** * Rules as mapping from nonterminal symbol on the left hand side to set of either sequence of terminal symbols or doublets of sequence of terminal symbols and nonterminal symbol. */ - std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > rules; + std::map < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > rules; public: /** @@ -106,7 +106,7 @@ public: * * \returns true if the rule was indeed added, false othervise */ - bool addRule ( SymbolType leftHandSide, std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rightHandSide ); + bool addRule ( SymbolType leftHandSide, ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rightHandSide ); /** * \brief Add a new rule of a grammar. @@ -140,14 +140,14 @@ public: * \param leftHandSide the left hand side of the rule * \param rightHandSide a set of right hand sides of the rule */ - void addRules ( SymbolType leftHandSide, std::set < std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > rightHandSide ); + void addRules ( SymbolType leftHandSide, std::set < ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > rightHandSide ); /** * Get rules of the grammar. * * \returns rules of the grammar */ - const std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > & getRules ( ) const; + const std::map < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > & getRules ( ) const; /** * Remove a rule of a grammar in form of A -> aB or A -> a, where A, B \in N and a \in T*. @@ -157,7 +157,7 @@ public: * * \returns true if the rule was indeed removed, false othervise */ - bool removeRule ( const SymbolType & leftHandSide, const std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & rightHandSide ); + bool removeRule ( const SymbolType & leftHandSide, const ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & rightHandSide ); /** * Remove a rule of a grammar in form of A -> a, where A \in N and a \in T*. @@ -378,10 +378,10 @@ public: LeftLG < > * res = new LeftLG < > ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) ); - for ( std::pair < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > && rule : std::make_moveable_map ( rules ) ) { + for ( std::pair < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > && rule : std::make_moveable_map ( rules ) ) { - std::set < std::variant < std::vector < DefaultSymbolType >, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > > rhs; - for ( std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > && target : std::make_moveable_set ( rule.second ) ) + std::set < ext::variant < std::vector < DefaultSymbolType >, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > > rhs; + for ( ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > && target : std::make_moveable_set ( rule.second ) ) rhs.insert ( GrammarNormalize::normalizeRHS ( std::move ( target ) ) ); DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) ); @@ -413,7 +413,7 @@ GrammarBase * LeftLG < SymbolType >::plunder ( ) && { } template < class SymbolType > -bool LeftLG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rightHandSide ) { +bool LeftLG < SymbolType >::addRule ( SymbolType leftHandSide, ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); @@ -437,24 +437,24 @@ bool LeftLG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < st template < class SymbolType > bool LeftLG < SymbolType >::addRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ) { - std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rhs ( std::move ( rightHandSide ) ); + ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > bool LeftLG < SymbolType >::addRule ( SymbolType leftHandSide, std::pair < SymbolType, std::vector < SymbolType > > rightHandSide ) { - std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rhs ( std::move ( rightHandSide ) ); + ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > -void LeftLG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > rightHandSide ) { +void LeftLG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); - for ( const std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & element : rightHandSide ) { + for ( const ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & element : rightHandSide ) { if ( element.template is < std::vector < SymbolType > > ( ) ) { for ( const auto & symbol : element.template get < std::vector < SymbolType > > ( ) ) if ( !getTerminalAlphabet ( ).count ( symbol ) ) @@ -477,25 +477,25 @@ void LeftLG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std:: } template < class SymbolType > -const std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > & LeftLG < SymbolType >::getRules ( ) const { +const std::map < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > & LeftLG < SymbolType >::getRules ( ) const { return rules; } template < class SymbolType > -bool LeftLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & rightHandSide ) { +bool LeftLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & rightHandSide ) { return rules[leftHandSide].erase ( rightHandSide ); } template < class SymbolType > bool LeftLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ) { - std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rhs ( rightHandSide ); + ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } template < class SymbolType > bool LeftLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::pair < SymbolType, std::vector < SymbolType > > & rightHandSide ) { - std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rhs ( rightHandSide ); + ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } @@ -648,8 +648,8 @@ public: * \returns true if the symbol is used, false othervise */ static bool used ( const grammar::LeftLG < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > & rule : grammar.getRules ( ) ) { - for ( const std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & rhsTmp : rule.second ) + for ( const std::pair < const SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > & rule : grammar.getRules ( ) ) { + for ( const ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & rhsTmp : rule.second ) if ( rhsTmp.template is < std::vector < SymbolType > > ( ) ) { const std::vector < SymbolType > & rhs = rhsTmp.template get < std::vector < SymbolType > > ( ); @@ -707,11 +707,11 @@ public: * \returns true if the symbol is used, false othervise */ static bool used ( const grammar::LeftLG < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > & rule : grammar.getRules ( ) ) { + for ( const std::pair < const SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > > > & rule : grammar.getRules ( ) ) { if ( rule.first == symbol ) return true; - for ( const std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & rhsTmp : rule.second ) + for ( const ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > & rhsTmp : rule.second ) if ( rhsTmp.template is < std::pair < SymbolType, std::vector < SymbolType > > > ( ) ) { const std::pair < SymbolType, std::vector < SymbolType > > & rhs = rhsTmp.template get < std::pair < SymbolType, std::vector < SymbolType > > > ( ); diff --git a/alib2data/src/grammar/Regular/LeftRG.h b/alib2data/src/grammar/Regular/LeftRG.h index 7c3e0d3adabf7d38c1bc933bb04c799dc84a0761..716e984503b6312702024ab06017c085cbad68c7 100644 --- a/alib2data/src/grammar/Regular/LeftRG.h +++ b/alib2data/src/grammar/Regular/LeftRG.h @@ -71,7 +71,7 @@ class LeftRG final : public GrammarBase, public alib::Components < LeftRG < Symb /** * Rules as mapping from nonterminal symbol on the left hand side to set of either terminal symbols or doublets of terminal symbol and nonterminal symbol. */ - std::map < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > rules; + std::map < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > rules; /** * Boolean signaling whether grammar generates empty string or don't. @@ -115,7 +115,7 @@ public: * * \returns true if the rule was indeed added, false othervise */ - bool addRule ( SymbolType leftHandSide, std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ); + bool addRule ( SymbolType leftHandSide, ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ); /** * \brief Add a new rule of a grammar. @@ -149,14 +149,14 @@ public: * \param leftHandSide the left hand side of the rule * \param rightHandSide a set of right hand sides of the rule */ - void addRules ( SymbolType leftHandSide, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ); + void addRules ( SymbolType leftHandSide, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ); /** * Get rules of the grammar. * * \returns rules of the grammar */ - const std::map < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & getRules ( ) const; + const std::map < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & getRules ( ) const; /** * Remove a rule of a grammar in form of A -> aB or A -> a, where A, B \in N and a \in T. @@ -166,7 +166,7 @@ public: * * \returns true if the rule was indeed removed, false othervise */ - bool removeRule ( const SymbolType & leftHandSide, const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ); + bool removeRule ( const SymbolType & leftHandSide, const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ); /** * Remove a rule of a grammar in form of A -> a, where A \in N and a \in T. @@ -401,10 +401,10 @@ public: LeftRG < > * res = new LeftRG < > ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) ); - for ( std::pair < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > && rule : std::make_moveable_map ( rules ) ) { + for ( std::pair < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > && rule : std::make_moveable_map ( rules ) ) { - std::set < std::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > > rhs; - for ( std::variant < SymbolType, std::pair < SymbolType, SymbolType > > && target : std::make_moveable_set ( rule.second ) ) + std::set < ext::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > > rhs; + for ( ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > && target : std::make_moveable_set ( rule.second ) ) rhs.insert ( GrammarNormalize::normalizeRHS ( std::move ( target ) ) ); DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) ); @@ -437,7 +437,7 @@ GrammarBase * LeftRG < SymbolType >::plunder ( ) && { } template < class SymbolType > -bool LeftRG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ) { +bool LeftRG < SymbolType >::addRule ( SymbolType leftHandSide, ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); @@ -457,11 +457,11 @@ bool LeftRG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < Sy } template < class SymbolType > -void LeftRG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ) { +void LeftRG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & element : rightHandSide ) { + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & element : rightHandSide ) { if ( element.template is < SymbolType > ( ) ) { const SymbolType & rhs = element.template get < SymbolType > ( ); @@ -481,38 +481,38 @@ void LeftRG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std:: template < class SymbolType > bool LeftRG < SymbolType >::addRule ( SymbolType leftHandSide, SymbolType rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > bool LeftRG < SymbolType >::addRule ( SymbolType leftHandSide, std::pair < SymbolType, SymbolType > rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > -const std::map < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & LeftRG < SymbolType >::getRules ( ) const { +const std::map < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & LeftRG < SymbolType >::getRules ( ) const { return rules; } template < class SymbolType > -bool LeftRG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ) { +bool LeftRG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ) { return rules[leftHandSide].erase ( rightHandSide ); } template < class SymbolType > bool LeftRG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const SymbolType & rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } template < class SymbolType > bool LeftRG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::pair < SymbolType, SymbolType > & rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } @@ -635,7 +635,7 @@ LeftRG < SymbolType > LeftRG < SymbolType >::parse ( std::deque < sax::Token >:: template < class SymbolType > void LeftRG < SymbolType >::parseRule ( std::deque < sax::Token >::iterator & input, LeftRG & grammar ) { SymbolType lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS < SymbolType > ( input ); - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs = GrammarFromXMLParser::parseRuleOneOrTwoSymbolsRHS < SymbolType > ( input ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs = GrammarFromXMLParser::parseRuleOneOrTwoSymbolsRHS < SymbolType > ( input ); grammar.addRule ( std::move ( lhs ), std::move ( rhs ) ); } @@ -697,8 +697,8 @@ public: * \returns true if the symbol is used, false othervise */ static bool used ( const grammar::LeftRG < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) + for ( const std::pair < const SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) if ( ( rhs.template is < SymbolType > ( ) && ( rhs.template get < SymbolType > ( ) == symbol ) ) || ( rhs.template get < std::pair < SymbolType, SymbolType > > ( ).first == symbol ) ) return true; @@ -745,11 +745,11 @@ public: * \returns true if the symbol is used, false othervise */ static bool used ( const grammar::LeftRG < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) { + for ( const std::pair < const SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) { if ( rule.first == symbol ) return true; - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) if ( rhs.template get < std::pair < SymbolType, SymbolType > > ( ).second == symbol ) return true; diff --git a/alib2data/src/grammar/Regular/RightLG.h b/alib2data/src/grammar/Regular/RightLG.h index c9f31d4994d49604ddb130b65bc0b1988e23a33b..e0d4e301ee5f59149fae51bd7cf8d878dda07e9c 100644 --- a/alib2data/src/grammar/Regular/RightLG.h +++ b/alib2data/src/grammar/Regular/RightLG.h @@ -67,7 +67,7 @@ class RightLG final : public GrammarBase, public alib::Components < RightLG < Sy /** * Rules as mapping from nonterminal symbol on the left hand side to set of either sequence of terminal symbols or doublets of sequence of nonterminal symbol and terminal symbols. */ - std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > rules; + std::map < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > rules; public: /** @@ -106,7 +106,7 @@ public: * * \returns true if the rule was indeed added, false othervise */ - bool addRule ( SymbolType leftHandSide, std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rightHandSide ); + bool addRule ( SymbolType leftHandSide, ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rightHandSide ); /** * \brief Add a new rule of a grammar. @@ -140,14 +140,14 @@ public: * \param leftHandSide the left hand side of the rule * \param rightHandSide a set of right hand sides of the rule */ - void addRules ( SymbolType leftHandSide, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > rightHandSide ); + void addRules ( SymbolType leftHandSide, std::set < ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > rightHandSide ); /** * Get rules of the grammar. * * \returns rules of the grammar */ - const std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & getRules ( ) const; + const std::map < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & getRules ( ) const; /** * Remove a rule of a grammar in form of A -> Ba or A -> a, where A, B \in N and a \in T*. @@ -157,7 +157,7 @@ public: * * \returns true if the rule was indeed removed, false othervise */ - bool removeRule ( const SymbolType & leftHandSide, const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rightHandSide ); + bool removeRule ( const SymbolType & leftHandSide, const ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rightHandSide ); /** * Remove a rule of a grammar in form of A -> a, where A \in N and a \in T*. @@ -378,10 +378,10 @@ public: RightLG < > * res = new RightLG < > ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) ); - for ( std::pair < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > && rule : std::make_moveable_map ( rules ) ) { + for ( std::pair < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > && rule : std::make_moveable_map ( rules ) ) { - std::set < std::variant < std::vector < DefaultSymbolType >, std::pair < std::vector < DefaultSymbolType >, DefaultSymbolType > > > rhs; - for ( std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > && target : std::make_moveable_set ( rule.second ) ) + std::set < ext::variant < std::vector < DefaultSymbolType >, std::pair < std::vector < DefaultSymbolType >, DefaultSymbolType > > > rhs; + for ( ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > && target : std::make_moveable_set ( rule.second ) ) rhs.insert ( GrammarNormalize::normalizeRHS ( std::move ( target ) ) ); DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) ); @@ -412,7 +412,7 @@ GrammarBase * RightLG < SymbolType >::plunder ( ) && { } template < class SymbolType > -bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rightHandSide ) { +bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); @@ -436,24 +436,24 @@ bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < s template < class SymbolType > bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ) { - std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( std::move ( rightHandSide ) ); + ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, std::pair < std::vector < SymbolType >, SymbolType > rightHandSide ) { - std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( std::move ( rightHandSide ) ); + ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > -void RightLG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > rightHandSide ) { +void RightLG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); - for ( const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & element : rightHandSide ) { + for ( const ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & element : rightHandSide ) { if ( element.template is < std::vector < SymbolType > > ( ) ) { for ( const auto & symbol : element.template get < std::vector < SymbolType > > ( ) ) if ( !getTerminalAlphabet ( ).count ( symbol ) ) @@ -474,25 +474,25 @@ void RightLG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std: } template < class SymbolType > -const std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & RightLG < SymbolType >::getRules ( ) const { +const std::map < SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & RightLG < SymbolType >::getRules ( ) const { return rules; } template < class SymbolType > -bool RightLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rightHandSide ) { +bool RightLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rightHandSide ) { return rules[leftHandSide].erase ( rightHandSide ); } template < class SymbolType > bool RightLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ) { - std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( rightHandSide ); + ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } template < class SymbolType > bool RightLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::pair < std::vector < SymbolType >, SymbolType > & rightHandSide ) { - std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( rightHandSide ); + ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } @@ -645,8 +645,8 @@ public: * \returns true if the symbol is used, false othervise */ static bool used ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & rule : grammar.getRules ( ) ) { - for ( const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rhsTmp : rule.second ) + for ( const std::pair < const SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & rule : grammar.getRules ( ) ) { + for ( const ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rhsTmp : rule.second ) if ( rhsTmp.template is < std::vector < SymbolType > > ( ) ) { const std::vector < SymbolType > & rhs = rhsTmp.template get < std::vector < SymbolType > > ( ); @@ -704,11 +704,11 @@ public: * \returns true if the symbol is used, false othervise */ static bool used ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & rule : grammar.getRules ( ) ) { + for ( const std::pair < const SymbolType, std::set < ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & rule : grammar.getRules ( ) ) { if ( rule.first == symbol ) return true; - for ( const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rhsTmp : rule.second ) + for ( const ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rhsTmp : rule.second ) if ( rhsTmp.template is < std::pair < std::vector < SymbolType >, SymbolType > > ( ) ) { const std::pair < std::vector < SymbolType >, SymbolType > & rhs = rhsTmp.template get < std::pair < std::vector < SymbolType >, SymbolType > > ( ); diff --git a/alib2data/src/grammar/Regular/RightRG.h b/alib2data/src/grammar/Regular/RightRG.h index 769cf75b134a916acaacfce59025012dd65ddb42..d0904b731ef08ed10299e3a4b5d3f6ca4b6e9713 100644 --- a/alib2data/src/grammar/Regular/RightRG.h +++ b/alib2data/src/grammar/Regular/RightRG.h @@ -71,7 +71,7 @@ class RightRG final : public GrammarBase, public alib::Components < RightRG < Sy /** * Rules function as mapping from nonterminal symbol on the left hand side to set of either terminal symbols or doublets of nonterminal symbol and terminal symbol. */ - std::map < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > rules; + std::map < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > rules; /** * Boolean signaling whether grammar generates empty string or don't. @@ -115,7 +115,7 @@ public: * * \returns true if the rule was indeed added, false othervise */ - bool addRule ( SymbolType leftHandSide, std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ); + bool addRule ( SymbolType leftHandSide, ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ); /** * \brief Add a new rule of a grammar. @@ -149,14 +149,14 @@ public: * \param leftHandSide the left hand side of the rule * \param rightHandSide a set of right hand sides of the rule */ - void addRules ( SymbolType leftHandSide, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ); + void addRules ( SymbolType leftHandSide, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ); /** * Get rules of the grammar. * * \returns rules of the grammar */ - const std::map < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & getRules ( ) const; + const std::map < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & getRules ( ) const; /** * Remove a rule of a grammar in form of A -> Ba or A -> a, where A, B \in N and a \in T. @@ -166,7 +166,7 @@ public: * * \returns true if the rule was indeed removed, false othervise */ - bool removeRule ( const SymbolType & leftHandSide, const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ); + bool removeRule ( const SymbolType & leftHandSide, const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ); /** * Remove a rule of a grammar in form of A -> a, where A \in N and a \in T. @@ -401,10 +401,10 @@ public: RightRG < > * res = new RightRG < > ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) ); - for ( std::pair < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > && rule : std::make_moveable_map ( rules ) ) { + for ( std::pair < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > && rule : std::make_moveable_map ( rules ) ) { - std::set < std::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > > rhs; - for ( std::variant < SymbolType, std::pair < SymbolType, SymbolType > > && target : std::make_moveable_set ( rule.second ) ) + std::set < ext::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > > rhs; + for ( ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > && target : std::make_moveable_set ( rule.second ) ) rhs.insert ( GrammarNormalize::normalizeRHS ( std::move ( target ) ) ); DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) ); @@ -437,7 +437,7 @@ GrammarBase * RightRG < SymbolType >::plunder ( ) && { } template < class SymbolType > -bool RightRG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ) { +bool RightRG < SymbolType >::addRule ( SymbolType leftHandSide, ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); @@ -458,24 +458,24 @@ bool RightRG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < S template < class SymbolType > bool RightRG < SymbolType >::addRule ( SymbolType leftHandSide, SymbolType rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > bool RightRG < SymbolType >::addRule ( SymbolType leftHandSide, std::pair < SymbolType, SymbolType > rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) ); return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); } template < class SymbolType > -void RightRG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ) { +void RightRG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > rightHandSide ) { if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) throw GrammarException ( "Rule must rewrite nonterminal symbol" ); - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & element : rightHandSide ) { + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & element : rightHandSide ) { if ( element.template is < SymbolType > ( ) ) { const SymbolType & rhs = element.template get < SymbolType > ( ); @@ -493,25 +493,25 @@ void RightRG < SymbolType >::addRules ( SymbolType leftHandSide, std::set < std: } template < class SymbolType > -const std::map < SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & RightRG < SymbolType >::getRules ( ) const { +const std::map < SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & RightRG < SymbolType >::getRules ( ) const { return rules; } template < class SymbolType > -bool RightRG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ) { +bool RightRG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rightHandSide ) { return rules[leftHandSide].erase ( rightHandSide ); } template < class SymbolType > bool RightRG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const SymbolType & rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } template < class SymbolType > bool RightRG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::pair < SymbolType, SymbolType > & rightHandSide ) { - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs ( rightHandSide ); return removeRule ( leftHandSide, rhs ); } @@ -632,7 +632,7 @@ RightRG < SymbolType > RightRG < SymbolType >::parse ( std::deque < sax::Token > template < class SymbolType > void RightRG < SymbolType >::parseRule ( std::deque < sax::Token >::iterator & input, RightRG & grammar ) { SymbolType lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS < SymbolType > ( input ); - std::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs = GrammarFromXMLParser::parseRuleOneOrTwoSymbolsRHS < SymbolType > ( input ); + ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > rhs = GrammarFromXMLParser::parseRuleOneOrTwoSymbolsRHS < SymbolType > ( input ); grammar.addRule ( std::move ( lhs ), std::move ( rhs ) ); } @@ -694,8 +694,8 @@ public: * \returns true if the symbol is used, false othervise */ static bool used ( const grammar::RightRG < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) + for ( const std::pair < const SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) if ( ( rhs.template is < SymbolType > ( ) && ( rhs.template get < SymbolType > ( ) == symbol ) ) || ( rhs.template get < std::pair < SymbolType, SymbolType > > ( ).first == symbol ) ) return true; @@ -742,11 +742,11 @@ public: * \returns true if the symbol is used, false othervise */ static bool used ( const grammar::RightRG < SymbolType > & grammar, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::set < std::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) { + for ( const std::pair < const SymbolType, std::set < ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) { if ( rule.first == symbol ) return true; - for ( const std::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) + for ( const ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > & rhs : rule.second ) if ( rhs.template get < std::pair < SymbolType, SymbolType > > ( ).second == symbol ) return true; diff --git a/alib2data/src/grammar/common/GrammarFromXMLParser.h b/alib2data/src/grammar/common/GrammarFromXMLParser.h index 2be79243150633948881fadae71ad98fdf8cdac2..26de0d58243f5c5e1b690e67b0f5142838b6694a 100644 --- a/alib2data/src/grammar/common/GrammarFromXMLParser.h +++ b/alib2data/src/grammar/common/GrammarFromXMLParser.h @@ -60,7 +60,7 @@ public: template < class SymbolType > static std::vector<SymbolType> parseRuleRHS(std::deque<sax::Token>::iterator& input); template < class SymbolType > - static std::variant<SymbolType, std::pair<SymbolType, SymbolType>> parseRuleOneOrTwoSymbolsRHS(std::deque<sax::Token>::iterator& input); + static ext::variant<SymbolType, std::pair<SymbolType, SymbolType>> parseRuleOneOrTwoSymbolsRHS(std::deque<sax::Token>::iterator& input); template<class T> static void parseRules(std::deque<sax::Token>::iterator& input, T& grammar); @@ -173,16 +173,16 @@ std::vector<SymbolType> GrammarFromXMLParser::parseRuleRHS(std::deque<sax::Token } template < class SymbolType > -std::variant<SymbolType, std::pair<SymbolType, SymbolType>> GrammarFromXMLParser::parseRuleOneOrTwoSymbolsRHS(std::deque<sax::Token>::iterator& input) { +ext::variant<SymbolType, std::pair<SymbolType, SymbolType>> GrammarFromXMLParser::parseRuleOneOrTwoSymbolsRHS(std::deque<sax::Token>::iterator& input) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "rhs"); SymbolType first = alib::xmlApi<SymbolType>::parse(input); if(sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { SymbolType second = alib::xmlApi<SymbolType>::parse(input); sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "rhs"); - return std::variant<SymbolType, std::pair<SymbolType, SymbolType>>(std::make_pair(std::move(first), std::move(second))); + return ext::variant<SymbolType, std::pair<SymbolType, SymbolType>>(std::make_pair(std::move(first), std::move(second))); } else { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "rhs"); - return std::variant<SymbolType, std::pair<SymbolType, SymbolType>>(std::move(first)); + return ext::variant<SymbolType, std::pair<SymbolType, SymbolType>>(std::move(first)); } } diff --git a/alib2data/src/grammar/common/GrammarNormalize.h b/alib2data/src/grammar/common/GrammarNormalize.h index 0031f1fb50025160780133c448b7b79f745da7cf..cac417cb0749647c959b6a1ff1b47e4c52a36f35 100644 --- a/alib2data/src/grammar/common/GrammarNormalize.h +++ b/alib2data/src/grammar/common/GrammarNormalize.h @@ -26,16 +26,16 @@ public: static std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > normalizeRHS ( std::pair < SymbolType, std::vector < SymbolType > > && symbol ); template < class SymbolType > - static std::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > normalizeRHS ( std::variant < SymbolType, std::pair < SymbolType, SymbolType > > && symbol ); + static ext::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > normalizeRHS ( ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > && symbol ); template < class SymbolType > - static std::variant < std::vector < DefaultSymbolType >, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > normalizeRHS ( std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > && symbol ); + static ext::variant < std::vector < DefaultSymbolType >, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > normalizeRHS ( ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > && symbol ); template < class SymbolType > - static std::variant < std::vector < DefaultSymbolType >, std::pair < std::vector < DefaultSymbolType >, DefaultSymbolType > > normalizeRHS ( std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > && symbol ); + static ext::variant < std::vector < DefaultSymbolType >, std::pair < std::vector < DefaultSymbolType >, DefaultSymbolType > > normalizeRHS ( ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > && symbol ); template < class SymbolType > - static std::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < DefaultSymbolType >, DefaultSymbolType, std::vector < DefaultSymbolType > > > normalizeRHS ( std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > && symbols ); + static ext::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < DefaultSymbolType >, DefaultSymbolType, std::vector < DefaultSymbolType > > > normalizeRHS ( ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > && symbols ); }; @@ -45,39 +45,39 @@ std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > GrammarNormal } template < class SymbolType > -std::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > GrammarNormalize::normalizeRHS ( std::variant < SymbolType, std::pair < SymbolType, SymbolType > > && symbol ) { +ext::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > GrammarNormalize::normalizeRHS ( ext::variant < SymbolType, std::pair < SymbolType, SymbolType > > && symbol ) { if ( symbol.template is < SymbolType > ( ) ) { - return std::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > ( alphabet::SymbolNormalize::normalizeSymbol ( std::move ( symbol.template get < SymbolType > ( ) ) ) ); + return ext::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > ( alphabet::SymbolNormalize::normalizeSymbol ( std::move ( symbol.template get < SymbolType > ( ) ) ) ); } else { std::pair < SymbolType, SymbolType > & inner = symbol.template get < std::pair < SymbolType, SymbolType > > ( ); - return std::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > ( std::make_pair ( alphabet::SymbolNormalize::normalizeSymbol ( std::move ( inner.first ) ), alphabet::SymbolNormalize::normalizeSymbol ( std::move ( inner.second ) ) ) ); + return ext::variant < DefaultSymbolType, std::pair < DefaultSymbolType, DefaultSymbolType > > ( std::make_pair ( alphabet::SymbolNormalize::normalizeSymbol ( std::move ( inner.first ) ), alphabet::SymbolNormalize::normalizeSymbol ( std::move ( inner.second ) ) ) ); } } template < class SymbolType > -std::variant < std::vector < DefaultSymbolType >, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > GrammarNormalize::normalizeRHS ( std::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > && symbol ) { +ext::variant < std::vector < DefaultSymbolType >, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > GrammarNormalize::normalizeRHS ( ext::variant < std::vector < SymbolType >, std::pair < SymbolType, std::vector < SymbolType > > > && symbol ) { if ( symbol.template is < std::vector < SymbolType > > ( ) ) { - return std::variant < std::vector < DefaultSymbolType >, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > ( alphabet::SymbolNormalize::normalizeSymbols ( std::move ( symbol.template get < std::vector < SymbolType > > ( ) ) ) ); + return ext::variant < std::vector < DefaultSymbolType >, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > ( alphabet::SymbolNormalize::normalizeSymbols ( std::move ( symbol.template get < std::vector < SymbolType > > ( ) ) ) ); } else { std::pair < SymbolType, std::vector < SymbolType > > & inner = symbol.template get < std::pair < SymbolType, std::vector < SymbolType > > > ( ); - return std::variant < std::vector < DefaultSymbolType >, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > ( std::make_pair ( alphabet::SymbolNormalize::normalizeSymbol ( std::move ( inner.first ) ), alphabet::SymbolNormalize::normalizeSymbols ( std::move ( inner.second ) ) ) ); + return ext::variant < std::vector < DefaultSymbolType >, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > ( std::make_pair ( alphabet::SymbolNormalize::normalizeSymbol ( std::move ( inner.first ) ), alphabet::SymbolNormalize::normalizeSymbols ( std::move ( inner.second ) ) ) ); } } template < class SymbolType > -std::variant < std::vector < DefaultSymbolType >, std::pair < std::vector < DefaultSymbolType >, DefaultSymbolType > > GrammarNormalize::normalizeRHS ( std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > && symbol ) { +ext::variant < std::vector < DefaultSymbolType >, std::pair < std::vector < DefaultSymbolType >, DefaultSymbolType > > GrammarNormalize::normalizeRHS ( ext::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > && symbol ) { if ( symbol.template is < std::vector < SymbolType > > ( ) ) { - return std::variant < std::vector < DefaultSymbolType >, std::pair < std::vector < DefaultSymbolType >, DefaultSymbolType > > ( alphabet::SymbolNormalize::normalizeSymbols ( std::move ( symbol.template get < std::vector < SymbolType > > ( ) ) ) ); + return ext::variant < std::vector < DefaultSymbolType >, std::pair < std::vector < DefaultSymbolType >, DefaultSymbolType > > ( alphabet::SymbolNormalize::normalizeSymbols ( std::move ( symbol.template get < std::vector < SymbolType > > ( ) ) ) ); } else { std::pair < std::vector < SymbolType >, SymbolType > & inner = symbol.template get < std::pair < std::vector < SymbolType >, SymbolType > > ( ); - return std::variant < std::vector < DefaultSymbolType >, std::pair < std::vector < DefaultSymbolType >, DefaultSymbolType > > ( std::make_pair ( alphabet::SymbolNormalize::normalizeSymbols ( std::move ( inner.first ) ), alphabet::SymbolNormalize::normalizeSymbol ( std::move ( inner.second ) ) ) ); + return ext::variant < std::vector < DefaultSymbolType >, std::pair < std::vector < DefaultSymbolType >, DefaultSymbolType > > ( std::make_pair ( alphabet::SymbolNormalize::normalizeSymbols ( std::move ( inner.first ) ), alphabet::SymbolNormalize::normalizeSymbol ( std::move ( inner.second ) ) ) ); } } template < class SymbolType > -std::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < DefaultSymbolType >, DefaultSymbolType, std::vector < DefaultSymbolType > > > GrammarNormalize::normalizeRHS ( std::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > && symbols ) { +ext::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < DefaultSymbolType >, DefaultSymbolType, std::vector < DefaultSymbolType > > > GrammarNormalize::normalizeRHS ( ext::variant < std::vector < SymbolType >, std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > && symbols ) { if ( symbols.template is < std::vector < SymbolType > > ( ) ) { - return std::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < DefaultSymbolType >, DefaultSymbolType, std::vector < DefaultSymbolType > > > ( alphabet::SymbolNormalize::normalizeSymbols ( std::move ( symbols.template get < std::vector < SymbolType > > ( ) ) ) ); + return ext::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < DefaultSymbolType >, DefaultSymbolType, std::vector < DefaultSymbolType > > > ( alphabet::SymbolNormalize::normalizeSymbols ( std::move ( symbols.template get < std::vector < SymbolType > > ( ) ) ) ); } else { std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > & inner = symbols.template get < std::tuple < std::vector < SymbolType >, SymbolType, std::vector < SymbolType > > > ( ); @@ -85,7 +85,7 @@ std::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < Def DefaultSymbolType second = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( std::get < 1 > ( inner ) ) ); std::vector < DefaultSymbolType > third = alphabet::SymbolNormalize::normalizeSymbols ( std::move ( std::get < 2 > ( inner ) ) ); - return std::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < DefaultSymbolType >, DefaultSymbolType, std::vector < DefaultSymbolType > > > ( std::make_tuple ( std::move ( first ), std::move ( second ), std::move ( third ) ) ); + return ext::variant < std::vector < DefaultSymbolType >, std::tuple < std::vector < DefaultSymbolType >, DefaultSymbolType, std::vector < DefaultSymbolType > > > ( std::make_tuple ( std::move ( first ), std::move ( second ), std::move ( third ) ) ); } } diff --git a/alib2data/src/grammar/common/GrammarToXMLComposer.h b/alib2data/src/grammar/common/GrammarToXMLComposer.h index 2b5f14830af8b44a69eebdee091312ce016c18b0..8ca48b3e89db74cd89ce2cd29033df35537a0be3 100644 --- a/alib2data/src/grammar/common/GrammarToXMLComposer.h +++ b/alib2data/src/grammar/common/GrammarToXMLComposer.h @@ -54,15 +54,15 @@ public: template < class SymbolType > static void composeRuleRHS(std::deque<sax::Token>& out, const std::vector<SymbolType>& symbols); template < class SymbolType > - static void composeRuleOneOrTwoSymbolsRHS(std::deque<sax::Token>& out, const std::variant<SymbolType, std::pair<SymbolType, SymbolType>>& symbols); + static void composeRuleOneOrTwoSymbolsRHS(std::deque<sax::Token>& out, const ext::variant<SymbolType, std::pair<SymbolType, SymbolType>>& symbols); template < class SymbolType > static void composeRuleGNFRHS(std::deque<sax::Token>& out, const std::pair<SymbolType, std::vector<SymbolType>>& symbols); template < class SymbolType > - static void composeRuleLeftLGRHS(std::deque<sax::Token>& out, const std::variant<std::vector<SymbolType>, std::pair<SymbolType, std::vector<SymbolType>>>& symbols); + static void composeRuleLeftLGRHS(std::deque<sax::Token>& out, const ext::variant<std::vector<SymbolType>, std::pair<SymbolType, std::vector<SymbolType>>>& symbols); template < class SymbolType > - static void composeRuleRightLGRHS(std::deque<sax::Token>& out, const std::variant<std::vector<SymbolType>, std::pair<std::vector<SymbolType>, SymbolType>>& symbols); + static void composeRuleRightLGRHS(std::deque<sax::Token>& out, const ext::variant<std::vector<SymbolType>, std::pair<std::vector<SymbolType>, SymbolType>>& symbols); template < class SymbolType > - static void composeRuleLGRHS(std::deque<sax::Token>& out, const std::variant<std::vector<SymbolType>, std::tuple<std::vector<SymbolType>, SymbolType, std::vector<SymbolType>>>& symbols); + static void composeRuleLGRHS(std::deque<sax::Token>& out, const ext::variant<std::vector<SymbolType>, std::tuple<std::vector<SymbolType>, SymbolType, std::vector<SymbolType>>>& symbols); }; template < class SymbolType > @@ -146,7 +146,7 @@ void GrammarToXMLComposer::composeRuleRHS(std::deque<sax::Token>& out, const std } template < class SymbolType > -void GrammarToXMLComposer::composeRuleOneOrTwoSymbolsRHS(std::deque<sax::Token>& out, const std::variant<SymbolType, std::pair<SymbolType, SymbolType>>& symbols) { +void GrammarToXMLComposer::composeRuleOneOrTwoSymbolsRHS(std::deque<sax::Token>& out, const ext::variant<SymbolType, std::pair<SymbolType, SymbolType>>& symbols) { out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT); if(symbols.template is<SymbolType>()) { alib::xmlApi<SymbolType>::compose(out, symbols.template get<SymbolType>()); @@ -172,7 +172,7 @@ void GrammarToXMLComposer::composeRuleGNFRHS(std::deque<sax::Token>& out, const } template < class SymbolType > -void GrammarToXMLComposer::composeRuleLGRHS(std::deque<sax::Token>& out, const std::variant<std::vector<SymbolType>, std::tuple<std::vector<SymbolType>, SymbolType, std::vector<SymbolType>>>& symbols) { +void GrammarToXMLComposer::composeRuleLGRHS(std::deque<sax::Token>& out, const ext::variant<std::vector<SymbolType>, std::tuple<std::vector<SymbolType>, SymbolType, std::vector<SymbolType>>>& symbols) { out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT); if(symbols.template is<std::vector<SymbolType>>()) { const std::vector<SymbolType>& rhs = symbols.template get<std::vector<SymbolType>>(); @@ -196,7 +196,7 @@ void GrammarToXMLComposer::composeRuleLGRHS(std::deque<sax::Token>& out, const s } template < class SymbolType > -void GrammarToXMLComposer::composeRuleLeftLGRHS(std::deque<sax::Token>& out, const std::variant<std::vector<SymbolType>, std::pair<SymbolType, std::vector<SymbolType>>>& symbols) { +void GrammarToXMLComposer::composeRuleLeftLGRHS(std::deque<sax::Token>& out, const ext::variant<std::vector<SymbolType>, std::pair<SymbolType, std::vector<SymbolType>>>& symbols) { out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT); if(symbols.template is<std::vector<SymbolType>>()) { const std::vector<SymbolType>& rhs = symbols.template get<std::vector<SymbolType>>(); @@ -217,7 +217,7 @@ void GrammarToXMLComposer::composeRuleLeftLGRHS(std::deque<sax::Token>& out, con } template < class SymbolType > -void GrammarToXMLComposer::composeRuleRightLGRHS(std::deque<sax::Token>& out, const std::variant<std::vector<SymbolType>, std::pair<std::vector<SymbolType>, SymbolType>>& symbols) { +void GrammarToXMLComposer::composeRuleRightLGRHS(std::deque<sax::Token>& out, const ext::variant<std::vector<SymbolType>, std::pair<std::vector<SymbolType>, SymbolType>>& symbols) { out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT); if(symbols.template is<std::vector<SymbolType>>()) { const std::vector<SymbolType>& rhs = symbols.template get<std::vector<SymbolType>>(); diff --git a/alib2data/src/indexes/common/IndexesNormalize.h b/alib2data/src/indexes/common/IndexesNormalize.h index 87f8bf8dc3f7f379a18219843407b250b66167aa..d8a09df7cc7cb4fa2b2c4a8db6884127a607f1c6 100644 --- a/alib2data/src/indexes/common/IndexesNormalize.h +++ b/alib2data/src/indexes/common/IndexesNormalize.h @@ -38,7 +38,7 @@ public: static std::trie < DefaultSymbolType, unsigned > normalizeTrie ( std::trie < SymbolType, unsigned > && trie ); template < class SymbolType > - static std::trie < DefaultSymbolType, std::variant < void, unsigned > > normalizeTrie ( std::trie < SymbolType, std::variant < void, unsigned > > && trie ); + static std::trie < DefaultSymbolType, ext::variant < void, unsigned > > normalizeTrie ( std::trie < SymbolType, ext::variant < void, unsigned > > && trie ); }; template < class SymbolType > @@ -47,7 +47,7 @@ std::trie < DefaultSymbolType, unsigned > IndexesNormalize::normalizeTrie ( std: } template < class SymbolType > -std::trie < DefaultSymbolType, std::variant < void, unsigned > > IndexesNormalize::normalizeTrie ( std::trie < SymbolType, std::variant < void, unsigned > > && trie ) { +std::trie < DefaultSymbolType, ext::variant < void, unsigned > > IndexesNormalize::normalizeTrie ( std::trie < SymbolType, ext::variant < void, unsigned > > && trie ) { return normalizeTrieInner ( std::move ( trie ) ) ; } diff --git a/alib2data/src/indexes/stringology/SuffixTrie.h b/alib2data/src/indexes/stringology/SuffixTrie.h index c5bddedd4cb09f6708a32dc303743bfade5cc87f..84e9e2ac17a9d8e30e344b7c71ca90e3bc7f5a3b 100644 --- a/alib2data/src/indexes/stringology/SuffixTrie.h +++ b/alib2data/src/indexes/stringology/SuffixTrie.h @@ -51,7 +51,7 @@ class GeneralAlphabet; template < class SymbolType = DefaultSymbolType > class SuffixTrie final : public alib::ObjectBase, public alib::Components < SuffixTrie < SymbolType >, SymbolType, std::tuple < GeneralAlphabet >, std::tuple < > > { protected: - std::trie < SymbolType, std::variant < void, unsigned > > m_trie; + std::trie < SymbolType, ext::variant < void, unsigned > > m_trie; public: /** @@ -65,15 +65,15 @@ public: virtual ObjectBase * plunder ( ) &&; explicit SuffixTrie ( std::set < SymbolType > edgeAlphabet ); - explicit SuffixTrie ( std::set < SymbolType > edgeAlphabet, std::trie < SymbolType, std::variant < void, unsigned > > trie ); - explicit SuffixTrie ( std::trie < SymbolType, std::variant < void, unsigned > > trie ); + explicit SuffixTrie ( std::set < SymbolType > edgeAlphabet, std::trie < SymbolType, ext::variant < void, unsigned > > trie ); + explicit SuffixTrie ( std::trie < SymbolType, ext::variant < void, unsigned > > trie ); - void checkTrie ( const std::trie < SymbolType, std::variant < void, unsigned > > & trie ); + void checkTrie ( const std::trie < SymbolType, ext::variant < void, unsigned > > & trie ); /** * @return Root node of the trie */ - const std::trie < SymbolType, std::variant < void, unsigned > > & getRoot ( ) const; + const std::trie < SymbolType, ext::variant < void, unsigned > > & getRoot ( ) const; const std::set < SymbolType > & getAlphabet ( ) const { return this->template accessComponent < GeneralAlphabet > ( ).get ( ); @@ -83,7 +83,7 @@ public: * Sets the root node of the regular expression tree * @param tree root node to set */ - void setTree ( std::trie < SymbolType, std::variant < void, unsigned > > tree ); + void setTree ( std::trie < SymbolType, ext::variant < void, unsigned > > tree ); /** * Removes symbol from the alphabet of symbol available in the regular expression @@ -129,7 +129,7 @@ public: return this; std::set < DefaultSymbolType > alphabet = alphabet::SymbolNormalize::normalizeAlphabet ( std::move ( this->template accessComponent < GeneralAlphabet > ( ).get ( ) ) ); - std::trie < DefaultSymbolType, std::variant < void, unsigned > > trie = IndexesNormalize::normalizeTrie ( std::move ( m_trie ) ); + std::trie < DefaultSymbolType, ext::variant < void, unsigned > > trie = IndexesNormalize::normalizeTrie ( std::move ( m_trie ) ); return new SuffixTrie < > ( std::move ( alphabet ), std::move ( trie ) ); } @@ -144,16 +144,16 @@ namespace indexes { namespace stringology { template < class SymbolType > -SuffixTrie < SymbolType >::SuffixTrie ( std::set < SymbolType > edgeAlphabet ) : SuffixTrie ( std::move ( edgeAlphabet ), std::trie < SymbolType, std::variant < void, unsigned > > ( std::variant < void, unsigned >::template from < void > ( ) ) ) { +SuffixTrie < SymbolType >::SuffixTrie ( std::set < SymbolType > edgeAlphabet ) : SuffixTrie ( std::move ( edgeAlphabet ), std::trie < SymbolType, ext::variant < void, unsigned > > ( ext::variant < void, unsigned >::template from < void > ( ) ) ) { } template < class SymbolType > -SuffixTrie < SymbolType >::SuffixTrie ( std::set < SymbolType > edgeAlphabet, std::trie < SymbolType, std::variant < void, unsigned > > trie ) : alib::Components < SuffixTrie, SymbolType, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( edgeAlphabet ) ), std::tuple < > ( ) ), m_trie ( std::move ( trie ) ) { +SuffixTrie < SymbolType >::SuffixTrie ( std::set < SymbolType > edgeAlphabet, std::trie < SymbolType, ext::variant < void, unsigned > > trie ) : alib::Components < SuffixTrie, SymbolType, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( edgeAlphabet ) ), std::tuple < > ( ) ), m_trie ( std::move ( trie ) ) { checkTrie ( this->m_trie ); } template < class SymbolType > -SuffixTrie < SymbolType >::SuffixTrie ( std::trie < SymbolType, std::variant < void, unsigned > > trie ) : SuffixTrie ( computeMinimalEdgeAlphabet ( trie ), trie ) { +SuffixTrie < SymbolType >::SuffixTrie ( std::trie < SymbolType, ext::variant < void, unsigned > > trie ) : SuffixTrie ( computeMinimalEdgeAlphabet ( trie ), trie ) { } template < class SymbolType > @@ -167,8 +167,8 @@ alib::ObjectBase * SuffixTrie < SymbolType >::plunder ( ) && { } template < class SymbolType > -void SuffixTrie < SymbolType >::checkTrie ( const std::trie < SymbolType, std::variant < void, unsigned > > & trie ) { - for ( const std::pair < const SymbolType, std::trie < SymbolType, std::variant < void, unsigned > > > & child : trie.getChildren ( ) ) { +void SuffixTrie < SymbolType >::checkTrie ( const std::trie < SymbolType, ext::variant < void, unsigned > > & trie ) { + for ( const std::pair < const SymbolType, std::trie < SymbolType, ext::variant < void, unsigned > > > & child : trie.getChildren ( ) ) { if ( ! getAlphabet ( ).count ( child.first ) ) throw exception::CommonException ( "Symbol " + ext::to_string ( child.first ) + "not in the alphabet." ); checkTrie ( child.second ); @@ -176,12 +176,12 @@ void SuffixTrie < SymbolType >::checkTrie ( const std::trie < SymbolType, std::v } template < class SymbolType > -const std::trie < SymbolType, std::variant < void, unsigned > > & SuffixTrie < SymbolType >::getRoot ( ) const { +const std::trie < SymbolType, ext::variant < void, unsigned > > & SuffixTrie < SymbolType >::getRoot ( ) const { return m_trie; } template < class SymbolType > -void SuffixTrie < SymbolType >::setTree ( std::trie < SymbolType, std::variant < void, unsigned > > trie ) { +void SuffixTrie < SymbolType >::setTree ( std::trie < SymbolType, ext::variant < void, unsigned > > trie ) { checkTrie ( trie ); this->m_trie = std::move ( trie ).plunder ( ); } @@ -212,7 +212,7 @@ template < class SymbolType > SuffixTrie < SymbolType > SuffixTrie < SymbolType >::parse ( std::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, SuffixTrie::getXmlTagName() ); std::set < SymbolType > edgeAlphabet = alib::xmlApi < std::set < SymbolType > >::parse ( input ); - std::trie < SymbolType, std::variant < void, unsigned > > root = alib::xmlApi < std::trie < SymbolType, std::variant < void, unsigned > > >::parse ( input ); + std::trie < SymbolType, ext::variant < void, unsigned > > root = alib::xmlApi < std::trie < SymbolType, ext::variant < void, unsigned > > >::parse ( input ); SuffixTrie < SymbolType > trie ( std::move ( edgeAlphabet ), std::move ( root ) ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, SuffixTrie::getXmlTagName() ); @@ -223,7 +223,7 @@ template < class SymbolType > void SuffixTrie < SymbolType >::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( SuffixTrie::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); alib::xmlApi < std::set < SymbolType > >::compose ( out, getAlphabet ( ) ); - alib::xmlApi < std::trie < SymbolType, std::variant < void, unsigned > > >::compose ( out, getRoot ( ) ); + alib::xmlApi < std::trie < SymbolType, ext::variant < void, unsigned > > >::compose ( out, getRoot ( ) ); out.emplace_back ( SuffixTrie::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); } @@ -241,8 +241,8 @@ namespace alib { template < class SymbolType > class ComponentConstraint < indexes::stringology::SuffixTrie < SymbolType >, SymbolType, indexes::stringology::GeneralAlphabet > { - static bool used ( const std::trie < SymbolType, std::variant < void, unsigned > > & trie, const SymbolType & symbol ) { - for ( const std::pair < const SymbolType, std::trie < SymbolType, std::variant < void, unsigned > > > & child : trie.getChildren ( ) ) { + static bool used ( const std::trie < SymbolType, ext::variant < void, unsigned > > & trie, const SymbolType & symbol ) { + for ( const std::pair < const SymbolType, std::trie < SymbolType, ext::variant < void, unsigned > > > & child : trie.getChildren ( ) ) { if ( symbol == child.first || checkTrie ( trie, child.second ) ) return true; } diff --git a/alib2data/test-src/string/StringTest.cpp b/alib2data/test-src/string/StringTest.cpp index d869e1776f129e113c31fd91ce544c8934a9e263..033e4e8c75e13f62cc60500e3a13dcb4c12f23c0 100644 --- a/alib2data/test-src/string/StringTest.cpp +++ b/alib2data/test-src/string/StringTest.cpp @@ -74,21 +74,21 @@ void StringTest::testXMLParser ( ) { } void StringTest::testStringInMap ( ) { - std::map < std::variant < string::Epsilon < >, int >, int > testMap; - std::variant < string::Epsilon < >, int > epsVar { + std::map < ext::variant < string::Epsilon < >, int >, int > testMap; + ext::variant < string::Epsilon < >, int > epsVar { string::Epsilon < > { } }; CPPUNIT_ASSERT ( string::Epsilon < >::EPSILON == epsVar.get < string::Epsilon < > > ( ) ); CPPUNIT_ASSERT ( epsVar.get < string::Epsilon < > > ( ) == string::Epsilon < >::EPSILON ); - std::pair < std::variant < string::Epsilon < >, int >, int > epsVarPair = std::make_pair ( epsVar, 10 ); + std::pair < ext::variant < string::Epsilon < >, int >, int > epsVarPair = std::make_pair ( epsVar, 10 ); CPPUNIT_ASSERT ( string::Epsilon < >::EPSILON == epsVarPair.first.get < string::Epsilon < > > ( ) ); CPPUNIT_ASSERT ( epsVarPair.first.get < string::Epsilon < > > ( ) == string::Epsilon < >::EPSILON ); - testMap.insert ( std::make_pair ( std::variant < string::Epsilon < >, int > { string::Epsilon < > { } + testMap.insert ( std::make_pair ( ext::variant < string::Epsilon < >, int > { string::Epsilon < > { } }, 10 ) ); - CPPUNIT_ASSERT ( testMap.find ( std::variant < string::Epsilon < >, int > { string::Epsilon < > { } + CPPUNIT_ASSERT ( testMap.find ( ext::variant < string::Epsilon < >, int > { string::Epsilon < > { } } ) != testMap.end ( ) ); for ( const auto & entry : testMap ) { diff --git a/alib2data_experimental/src/grammar/parsing/LRParserTypes.h b/alib2data_experimental/src/grammar/parsing/LRParserTypes.h index b73cedaf0735a5cf306a6f958123c48ad270c63e..8737ed352c76b4e27a623db4c37550ab9571e82a 100644 --- a/alib2data_experimental/src/grammar/parsing/LRParserTypes.h +++ b/alib2data_experimental/src/grammar/parsing/LRParserTypes.h @@ -27,7 +27,7 @@ enum class LRAction { }; typedef std::map < DefaultSymbolType, std::set < std::pair < unsigned, std::vector < DefaultSymbolType > > > > LR0Items; -typedef std::map < std::pair < DefaultStateType, DefaultSymbolType >, std::pair < LRAction, std::variant < DefaultStateType, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > > > LRActionTable; +typedef std::map < std::pair < DefaultStateType, DefaultSymbolType >, std::pair < LRAction, ext::variant < DefaultStateType, std::pair < DefaultSymbolType, std::vector < DefaultSymbolType > > > > > LRActionTable; typedef std::map < std::pair < DefaultStateType, DefaultSymbolType >, DefaultStateType > LRGotoTable; } /* namespace parsing */ diff --git a/alib2std/src/extensions/utility.hpp b/alib2std/src/extensions/utility.hpp index 768caf76820a3337ac06794bd2f595771e18bc30..f24cfbbcd99e47380bb7a4aeeacc15d3f6feaddd 100644 --- a/alib2std/src/extensions/utility.hpp +++ b/alib2std/src/extensions/utility.hpp @@ -10,6 +10,31 @@ #include <utility> #include "type_traits.hpp" +#include <cstddef> + +namespace ext { + +template<class T> +struct SizeOf { + static const size_t size = sizeof(T); +}; + +template<> +struct SizeOf<void> { + static const size_t size = 1; +}; + +template<class T> +struct AlignOf { + static const size_t align = alignof(T); +}; + +template<> +struct AlignOf<void> { + static const size_t align = 1; +}; + +} /* namespace ext */ namespace std { diff --git a/alib2std/src/extensions/variant.hpp b/alib2std/src/extensions/variant.hpp index 99a947954c6c8d2847f457fbf754dacc91231ff7..013eac0d546a852f5ef5a9ae43f124e3610c4aad 100644 --- a/alib2std/src/extensions/variant.hpp +++ b/alib2std/src/extensions/variant.hpp @@ -19,9 +19,10 @@ #include <sstream> #include "compare.hpp" +#include "utility.hpp" #include "type_traits.hpp" -namespace std { +namespace ext { template <size_t arg1, size_t ... others> struct static_max; @@ -211,26 +212,6 @@ public: variant_base() : variant_base<ST, AT, Ts...>::variant_base ( type_id_hash_code ( typeid(void).hash_code() ) ) { } }; -template<class T> -struct SizeOf { - static const size_t size = sizeof(T); -}; - -template<> -struct SizeOf<void> { - static const size_t size = 1; -}; - -template<class T> -struct AlignOf { - static const size_t align = alignof(T); -}; - -template<> -struct AlignOf<void> { - static const size_t align = 1; -}; - template<typename ... Ts> class variant : public variant_base<static_max<SizeOf<Ts>::size...>, static_max<AlignOf<Ts>::align...>, Ts...> { using helper_t = variant_helper<Ts...>; @@ -363,19 +344,15 @@ public: } }; -} /* namespace std */ - -namespace ext { - template<typename ... Ts> -struct compare<std::variant<Ts...>> { - int operator()(const std::variant<Ts...>& first, const std::variant<Ts...>& second) const { +struct compare<ext::variant<Ts...>> { + int operator()(const ext::variant<Ts...>& first, const ext::variant<Ts...>& second) const { return first.compare(second); } }; template < class ... Ts > -std::string to_string ( const std::variant < Ts ... > & value ) { +std::string to_string ( const ext::variant < Ts ... > & value ) { std::stringstream ss; ss << value; return ss.str(); diff --git a/alib2std/test-src/extensions/VariantTest.cpp b/alib2std/test-src/extensions/VariantTest.cpp index 57a08e5d6d60aa22153a97065f19b46de6c293b9..16f3f56e6286887b803b8322de60721b11b85ed3 100644 --- a/alib2std/test-src/extensions/VariantTest.cpp +++ b/alib2std/test-src/extensions/VariantTest.cpp @@ -13,7 +13,7 @@ void VariantTest::tearDown() { } void VariantTest::testVariant() { - std::variant<int, std::string, VariantTest::test> d(10); + ext::variant<int, std::string, VariantTest::test> d(10); CPPUNIT_ASSERT( d.is<int>() ); CPPUNIT_ASSERT( d.get<int>() == 10 ); @@ -30,7 +30,7 @@ void VariantTest::testVariant() { CPPUNIT_ASSERT( d.is<VariantTest::test>() ); CPPUNIT_ASSERT( d.get<VariantTest::test>() == tmp ); - std::variant<int, std::string, VariantTest::test> e(d); + ext::variant<int, std::string, VariantTest::test> e(d); CPPUNIT_ASSERT( e.get<VariantTest::test>() == tmp ); *(e.get<VariantTest::test>().holder) = 43; @@ -47,7 +47,7 @@ void VariantTest::testVariant() { CPPUNIT_ASSERT( (e == d) == false ); - d = std::variant<int, std::string, VariantTest::test>(0); + d = ext::variant<int, std::string, VariantTest::test>(0); d = e; CPPUNIT_ASSERT( *(d.get<VariantTest::test>().holder) == 43 ); @@ -64,15 +64,15 @@ void VariantTest::testVariantSet() { std::string str = "abcde"; - std::variant<int, std::string, VariantTest::test> d(VariantTest::test {}); + ext::variant<int, std::string, VariantTest::test> d(VariantTest::test {}); *(d.get<VariantTest::test>().holder) = 42; - std::variant<int, std::string, VariantTest::test> e(d); + ext::variant<int, std::string, VariantTest::test> e(d); - std::variant<int, std::string, VariantTest::test> f(5); + ext::variant<int, std::string, VariantTest::test> f(5); - std::variant<int, std::string, VariantTest::test> g(str); + ext::variant<int, std::string, VariantTest::test> g(str); - std::set<std::variant<int, std::string, VariantTest::test>> testSet; + std::set<ext::variant<int, std::string, VariantTest::test>> testSet; testSet.insert(d); testSet.insert(e); testSet.insert(f); @@ -80,7 +80,7 @@ void VariantTest::testVariantSet() { CPPUNIT_ASSERT( testSet.size() == 3 ); - for(std::set<std::variant<int, std::string, VariantTest::test>>::const_iterator iter = testSet.begin(); iter != testSet.end(); iter++) { + for(std::set<ext::variant<int, std::string, VariantTest::test>>::const_iterator iter = testSet.begin(); iter != testSet.end(); iter++) { if(iter->is<int>()) CPPUNIT_ASSERT( iter->get<int>() == 5); if(iter->is<std::string>()) @@ -89,25 +89,25 @@ void VariantTest::testVariantSet() { CPPUNIT_ASSERT( iter->get<VariantTest::test>() == tmp ); } - std::variant<VariantTest::test2, std::string, VariantTest::test> h("aa"); + ext::variant<VariantTest::test2, std::string, VariantTest::test> h("aa"); CPPUNIT_ASSERT( h.is<std::string>() ); - std::map<std::variant<std::string, int>, int> testMap; - testMap.insert(std::make_pair(std::variant<std::string, int> {"aa"}, 10)); + std::map<ext::variant<std::string, int>, int> testMap; + testMap.insert(std::make_pair(ext::variant<std::string, int> {"aa"}, 10)); CPPUNIT_ASSERT( testMap.size() == 1 ); - CPPUNIT_ASSERT( testMap.find(std::variant<std::string, int> {"aa"}) != testMap.end() ); - CPPUNIT_ASSERT( testMap.find(std::variant<std::string, int> {10}) == testMap.end() ); + CPPUNIT_ASSERT( testMap.find(ext::variant<std::string, int> {"aa"}) != testMap.end() ); + CPPUNIT_ASSERT( testMap.find(ext::variant<std::string, int> {10}) == testMap.end() ); - testMap.insert(std::make_pair(std::variant<std::string, int> {"ab"}, 11)); - testMap.insert(std::make_pair(std::variant<std::string, int> {3}, 13)); + testMap.insert(std::make_pair(ext::variant<std::string, int> {"ab"}, 11)); + testMap.insert(std::make_pair(ext::variant<std::string, int> {3}, 13)); - CPPUNIT_ASSERT( testMap.find(std::variant<std::string, int> {"aa"}) != testMap.end() ); - CPPUNIT_ASSERT( testMap.find(std::variant<std::string, int> {10}) == testMap.end() ); + CPPUNIT_ASSERT( testMap.find(ext::variant<std::string, int> {"aa"}) != testMap.end() ); + CPPUNIT_ASSERT( testMap.find(ext::variant<std::string, int> {10}) == testMap.end() ); } void VariantTest::testVariantSet2() { - std::set<std::variant<std::string, int>> s, t, u; + std::set<ext::variant<std::string, int>> s, t, u; s.insert(std::string { "aa" } ); s.insert(123); @@ -117,8 +117,8 @@ void VariantTest::testVariantSet2() { } void VariantTest::testVariantVoid() { - std::variant<void, int> i(1); - std::variant<void, int> v; + ext::variant<void, int> i(1); + ext::variant<void, int> v; CPPUNIT_ASSERT ( v.is < void > ( ) ); CPPUNIT_ASSERT ( i.is < int > ( ) ); @@ -126,7 +126,7 @@ void VariantTest::testVariantVoid() { i.set(); CPPUNIT_ASSERT ( i.is < void > ( ) ); - std::variant<void, int> copy = i; + ext::variant<void, int> copy = i; CPPUNIT_ASSERT ( copy == v ); @@ -134,26 +134,26 @@ void VariantTest::testVariantVoid() { CPPUNIT_ASSERT ( v.get<int>() == 10 ); - std::variant<int, void> v2; + ext::variant<int, void> v2; CPPUNIT_ASSERT ( v2.is < void > ( ) ); } void VariantTest::testVariantDefault() { - std::variant<int, std::string, void> v1 = std::variant<int, std::string, void>::from<std::string>(); + ext::variant<int, std::string, void> v1 = ext::variant<int, std::string, void>::from<std::string>(); CPPUNIT_ASSERT ( v1.get<std::string>() == ""); - std::variant<int, std::string, void> v2 = std::variant<int, std::string, void>::from<void>(); + ext::variant<int, std::string, void> v2 = ext::variant<int, std::string, void>::from<void>(); CPPUNIT_ASSERT ( v2.is<void> ( ) ); - std::variant<int, std::string, void> v3 = std::variant<int, std::string, void>::from<int>(); + ext::variant<int, std::string, void> v3 = ext::variant<int, std::string, void>::from<int>(); CPPUNIT_ASSERT ( v3.get<int> ( ) == 0 ); } void VariantTest::testVariantSameTypes() { - std::variant < int, int, char > v1 ( 1 ); + ext::variant < int, int, char > v1 ( 1 ); CPPUNIT_ASSERT ( v1.get < int > ( ) == 1 ); @@ -167,9 +167,9 @@ void VariantTest::testVariantSameTypes() { } void VariantTest::testSizeT() { - std::variant < size_t, int, void > a ( ( size_t ) 1 ); - std::variant < size_t, int, void > b ( 1 ); - std::variant < size_t, int, void > c; + ext::variant < size_t, int, void > a ( ( size_t ) 1 ); + ext::variant < size_t, int, void > b ( 1 ); + ext::variant < size_t, int, void > c; CPPUNIT_ASSERT ( a.is < size_t > ( ) ); CPPUNIT_ASSERT ( b.is < int > ( ) ); @@ -177,6 +177,6 @@ void VariantTest::testSizeT() { } void VariantTest::testMoveSemantics() { - CPPUNIT_ASSERT ( ( std::is_nothrow_move_constructible < std::variant < void, int, size_t > >::value ) ); - CPPUNIT_ASSERT ( ( std::is_move_constructible < std::variant < void, int, size_t > >::value && std::is_move_assignable < std::variant < void, int, size_t > >::value ) ); + CPPUNIT_ASSERT ( ( std::is_nothrow_move_constructible < ext::variant < void, int, size_t > >::value ) ); + CPPUNIT_ASSERT ( ( std::is_move_constructible < ext::variant < void, int, size_t > >::value && std::is_move_assignable < ext::variant < void, int, size_t > >::value ) ); } diff --git a/alib2str/src/automaton/AutomatonFromStringParser.cpp b/alib2str/src/automaton/AutomatonFromStringParser.cpp index 1682f4ef79732edbf348d55bf06e75daa41ff527..bf58ef54de860828a7307e76a7a13aa7bfe704b7 100644 --- a/alib2str/src/automaton/AutomatonFromStringParser.cpp +++ b/alib2str/src/automaton/AutomatonFromStringParser.cpp @@ -58,7 +58,7 @@ EpsilonNFA < > AutomatonFromStringParser::parseEpsilonNFA(std::istream& input) { if(token.type != AutomatonFromStringLexer::TokenType::EPSILON_NFA) { throw exception::CommonException("Unrecognised ENFA token."); } - std::vector<std::variant<DefaultEpsilonType, DefaultSymbolType> > symbols; + std::vector<ext::variant<DefaultEpsilonType, DefaultSymbolType> > symbols; token = AutomatonFromStringLexer::next(input); while(token.type != AutomatonFromStringLexer::TokenType::NEW_LINE) { @@ -66,10 +66,10 @@ EpsilonNFA < > AutomatonFromStringParser::parseEpsilonNFA(std::istream& input) { AutomatonFromStringLexer::putback(input, token); DefaultSymbolType symbol = alib::stringApi<DefaultSymbolType>::parse(input); - std::variant<DefaultEpsilonType, DefaultSymbolType> symbolVariant(symbol); + ext::variant<DefaultEpsilonType, DefaultSymbolType> symbolVariant(symbol); symbols.push_back(symbolVariant); } else if(token.type == AutomatonFromStringLexer::TokenType::EPSILON) { - symbols.push_back(std::variant<DefaultEpsilonType, DefaultSymbolType>::from < DefaultEpsilonType > ( )); + symbols.push_back(ext::variant<DefaultEpsilonType, DefaultSymbolType>::from < DefaultEpsilonType > ( )); } token = AutomatonFromStringLexer::next(input); @@ -78,7 +78,7 @@ EpsilonNFA < > AutomatonFromStringParser::parseEpsilonNFA(std::istream& input) { DefaultStateType* initialState = NULL; std::set<DefaultStateType> finalStates; std::set<DefaultStateType> states; - std::set<std::tuple<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultStateType>> transitionFunction; + std::set<std::tuple<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultStateType>> transitionFunction; parseEpsilonNFATransition(input, states, symbols, initialState, finalStates, transitionFunction); token = AutomatonFromStringLexer::next(input); @@ -99,13 +99,13 @@ EpsilonNFA < > AutomatonFromStringParser::parseEpsilonNFA(std::istream& input) { EpsilonNFA < > res(*initialState); delete initialState; - for(const std::variant<DefaultEpsilonType, DefaultSymbolType> inputSymbol : symbols) { + for(const ext::variant<DefaultEpsilonType, DefaultSymbolType> inputSymbol : symbols) { if(inputSymbol.is<DefaultSymbolType>()) res.addInputSymbol(inputSymbol.get<DefaultSymbolType>()); } res.setStates(states); res.setFinalStates(finalStates); - for(const std::tuple<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultStateType> transition : transitionFunction) { + for(const std::tuple<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultStateType> transition : transitionFunction) { res.addTransition(std::get<0>(transition), std::get<1>(transition), std::get<2>(transition)); } @@ -277,7 +277,7 @@ void AutomatonFromStringParser::initialFinalState(std::istream& input, bool& ini } -void AutomatonFromStringParser::parseEpsilonNFATransition(std::istream& input, std::set<DefaultStateType>& states, const std::vector<std::variant<DefaultEpsilonType, DefaultSymbolType>>& symbols, DefaultStateType*& initialState, std::set<DefaultStateType>& finalStates, std::set<std::tuple<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultStateType>>& transitionFunction) { +void AutomatonFromStringParser::parseEpsilonNFATransition(std::istream& input, std::set<DefaultStateType>& states, const std::vector<ext::variant<DefaultEpsilonType, DefaultSymbolType>>& symbols, DefaultStateType*& initialState, std::set<DefaultStateType>& finalStates, std::set<std::tuple<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultStateType>>& transitionFunction) { bool initial = false; bool final = false; @@ -292,7 +292,7 @@ void AutomatonFromStringParser::parseEpsilonNFATransition(std::istream& input, s if(final) finalStates.insert(from); AutomatonFromStringLexer::Token token = AutomatonFromStringLexer::next(input); - std::vector<std::variant<DefaultEpsilonType, DefaultSymbolType>>::const_iterator iter = symbols.begin(); + std::vector<ext::variant<DefaultEpsilonType, DefaultSymbolType>>::const_iterator iter = symbols.begin(); while(token.type != AutomatonFromStringLexer::TokenType::NEW_LINE) { if(iter == symbols.end()) throw exception::CommonException("Invalid line format"); diff --git a/alib2str/src/automaton/AutomatonFromStringParser.h b/alib2str/src/automaton/AutomatonFromStringParser.h index eb3a23ad5ba1e4b4bcafd0223e1b091375e03c0a..27492d2cda0522298d57a0cc6905e46d0af4cd51 100644 --- a/alib2str/src/automaton/AutomatonFromStringParser.h +++ b/alib2str/src/automaton/AutomatonFromStringParser.h @@ -25,7 +25,7 @@ namespace automaton { class AutomatonFromStringParser { static void initialFinalState(std::istream& input, bool& initial, bool& final); - static void parseEpsilonNFATransition(std::istream& input, std::set<DefaultStateType>& states, const std::vector<std::variant<DefaultEpsilonType, DefaultSymbolType>>& symbols, DefaultStateType*& initialState, std::set<DefaultStateType>& finalStates, std::set<std::tuple<DefaultStateType, std::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultStateType>>& transitionFunction); + static void parseEpsilonNFATransition(std::istream& input, std::set<DefaultStateType>& states, const std::vector<ext::variant<DefaultEpsilonType, DefaultSymbolType>>& symbols, DefaultStateType*& initialState, std::set<DefaultStateType>& finalStates, std::set<std::tuple<DefaultStateType, ext::variant<DefaultEpsilonType, DefaultSymbolType>, DefaultStateType>>& transitionFunction); static void parseMultiInitialStateNFATransition(std::istream& input, MultiInitialStateNFA < DefaultSymbolType, DefaultStateType > & res, const std::vector<DefaultSymbolType>& symbols); static void parseNFATransition(std::istream& input, std::set<DefaultStateType>& states, const std::vector<DefaultSymbolType>& symbols, DefaultStateType*& initialState, std::set<DefaultStateType>& finalStates, std::set<std::tuple<DefaultStateType, DefaultSymbolType, DefaultStateType>>& transitionFunction); static void parseDFATransition(std::istream& input, std::set<DefaultStateType>& states, const std::vector<DefaultSymbolType>& symbols, DefaultStateType*& initialState, std::set<DefaultStateType>& finalStates, std::set<std::tuple<DefaultStateType, DefaultSymbolType, DefaultStateType>>& transitionFunction);