diff --git a/alib2algo/src/automaton/run/Result.h b/alib2algo/src/automaton/run/Result.h index 81761062fa1a7670937e6fc65c48058248ff7ca7..26117df7b745f05c0af3d563f73381efd4e4f162 100644 --- a/alib2algo/src/automaton/run/Result.h +++ b/alib2algo/src/automaton/run/Result.h @@ -27,14 +27,14 @@ public: * Performs conversion. * @return left regular grammar equivalent to source automaton. */ - static label::Label result ( const automaton::Automaton & automaton, const alib::Object & object, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL ); - - static label::Label result ( const automaton::DFA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL ); - static label::Label result ( const automaton::DFTA < > & automaton, const tree::RankedTree < > & tree, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL ); - static label::Label result ( const automaton::InputDrivenDPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL ); - static label::Label result ( const automaton::VisiblyPushdownDPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL ); - static label::Label result ( const automaton::RealTimeHeightDeterministicDPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL ); - static label::Label result ( const automaton::DPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::FAIL_STATE_LABEL ); + static label::Label result ( const automaton::Automaton & automaton, const alib::Object & object, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) ); + + static label::Label result ( const automaton::DFA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) ); + static label::Label result ( const automaton::DFTA < > & automaton, const tree::RankedTree < > & tree, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) ); + static label::Label result ( const automaton::InputDrivenDPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) ); + static label::Label result ( const automaton::VisiblyPushdownDPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) ); + static label::Label result ( const automaton::RealTimeHeightDeterministicDPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) ); + static label::Label result ( const automaton::DPDA < > & automaton, const string::LinearString < > & string, const label::Label & failLabel = label::FailStateLabel::instance < label::Label > ( ) ); }; diff --git a/alib2algo/src/automaton/run/Run.cpp b/alib2algo/src/automaton/run/Run.cpp index cc897cb58fda3313beb36f48fe7da768c338ce3f..0feabbfb5d03b23cd6551949ffac3ce4f460b889 100644 --- a/alib2algo/src/automaton/run/Run.cpp +++ b/alib2algo/src/automaton/run/Run.cpp @@ -125,11 +125,11 @@ std::pair < bool, label::Label > Run::calculateState ( const automaton::DFTA < > states.push_back ( res.second ); } - if ( !sign ) return std::make_pair ( false, label::FailStateLabel::FAIL_STATE_LABEL ); + if ( !sign ) return std::make_pair ( false, label::FailStateLabel::instance < label::Label > ( ) ); const auto & it = automaton.getTransitions ( ).find ( std::make_pair ( node.getData ( ), states ) ); - if ( it == automaton.getTransitions ( ).end ( ) ) return std::make_pair ( false, label::FailStateLabel::FAIL_STATE_LABEL ); + if ( it == automaton.getTransitions ( ).end ( ) ) return std::make_pair ( false, label::FailStateLabel::instance < label::Label > ( ) ); label::Label state = it->second; diff --git a/alib2algo/src/automaton/simplify/Total.cpp b/alib2algo/src/automaton/simplify/Total.cpp index 99c8ac5fa9cd5f7cfd14bb6a222f09f7382057a4..a2669c68e2e6678ce79bbbb00d028e68a909944a 100644 --- a/alib2algo/src/automaton/simplify/Total.cpp +++ b/alib2algo/src/automaton/simplify/Total.cpp @@ -28,7 +28,7 @@ automaton::NFA < > Total::total(const automaton::NFA < > & automaton) { } automaton::NFA < > res(automaton); - label::Label nullState = common::createUnique(label::FailStateLabel::FAIL_STATE_LABEL, automaton.getStates()); + label::Label nullState = common::createUnique(label::FailStateLabel::instance < label::Label > ( ), automaton.getStates()); res.addState(nullState); for(const auto& q : res.getStates()) { @@ -46,7 +46,7 @@ auto TotalNFA = Total::RegistratorWrapper<automaton::NFA < > , automaton::NFA < automaton::DFA < > Total::total(const automaton::DFA < > & automaton) { automaton::DFA < > res(automaton); - label::Label nullState = common::createUnique(label::FailStateLabel::FAIL_STATE_LABEL, automaton.getStates()); + label::Label nullState = common::createUnique(label::FailStateLabel::instance < label::Label > ( ), automaton.getStates()); res.addState(nullState); for(const auto& q : res.getStates()) { diff --git a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp index e4f8c7b6da16238322f25a538234dce468cee98c..044f6cbb7a4dabbd6dbc128e0d6137a76666898f 100644 --- a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp +++ b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp @@ -28,7 +28,7 @@ automaton::EpsilonNFA < > AutomataUnionEpsilonTransition::unification(const auto for(const auto& q : second.getStates()) states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q)); - label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states); + label::Label q0 = common::createUnique(label::InitialStateLabel::instance < label::Label > ( ), states); automaton::EpsilonNFA < > res(q0); for(const auto& a : first.getInputAlphabet()) @@ -67,7 +67,7 @@ automaton::EpsilonNFA < > AutomataUnionEpsilonTransition::unification(const auto for(const auto& q : second.getStates()) states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q)); - label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states); + label::Label q0 = common::createUnique(label::InitialStateLabel::instance < label::Label > ( ), states); automaton::EpsilonNFA < > res(q0); for(const auto& a : first.getInputAlphabet()) @@ -106,7 +106,7 @@ automaton::EpsilonNFA < > AutomataUnionEpsilonTransition::unification(const auto for(const auto& q : second.getStates()) states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q)); - label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states); + label::Label q0 = common::createUnique(label::InitialStateLabel::instance < label::Label > ( ), states); automaton::EpsilonNFA < > res(q0); for(const auto& a : first.getInputAlphabet()) diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp index 3ac0e4571c9592baaded7809649e5d8cd4569263..f9f45d7bb1581896d882cfdc878b84f2cd183b51 100644 --- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp +++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp @@ -36,7 +36,7 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom auto PDAToRHPDARealTimeHeightDeterministicNPDA = PDAToRHPDA::RegistratorWrapper < automaton::RealTimeHeightDeterministicNPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( PDAToRHPDA::convert ); automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const automaton::DPDA < > & pda ) { - label::Label q0 = common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, pda.getStates ( ) ); + label::Label q0 = common::createUnique ( label::InitialStateLabel::instance < label::Label > ( ), pda.getStates ( ) ); RealTimeHeightDeterministicDPDA < > res ( q0, alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); @@ -121,7 +121,7 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom pushdownStoreAlphabet.insert ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); res.setPushdownStoreAlphabet ( pushdownStoreAlphabet ); - label::Label q0 = common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, res.getStates ( ) ); + label::Label q0 = common::createUnique ( label::InitialStateLabel::instance < label::Label > ( ), res.getStates ( ) ); res.addState ( q0 ); res.addInitialState ( q0 ); diff --git a/alib2algo/src/grammar/convert/ToAutomaton.cpp b/alib2algo/src/grammar/convert/ToAutomaton.cpp index e1c7aab5beb6076bf9d6334521ad347e163a227a..628809810e19b82c92d3367c0e9f88e57f017e1e 100644 --- a/alib2algo/src/grammar/convert/ToAutomaton.cpp +++ b/alib2algo/src/grammar/convert/ToAutomaton.cpp @@ -33,7 +33,7 @@ automaton::NFA < > ToAutomaton::convert(const grammar::LeftRG < > & grammar) { } // step 1, 4 - label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states); + label::Label q0 = common::createUnique(label::InitialStateLabel::instance < label::Label > ( ), states); states.insert(q0); automaton::NFA < > automaton(q0); automaton.setInputAlphabet(grammar.getTerminalAlphabet()); @@ -76,7 +76,7 @@ automaton::NFA < > ToAutomaton::convert(const grammar::RightRG < > & grammar) { } // step 1, 4 - label::Label AState = common::createUnique(label::FinalStateLabel::FINAL_STATE_LABEL, states); + label::Label AState = common::createUnique(label::FinalStateLabel::instance < label::Label > ( ), states); states.insert(AState); automaton::NFA < > automaton(stateMap.find(grammar.getInitialSymbol())->second); automaton.setStates(states); @@ -110,7 +110,7 @@ auto ToAutomatonRightRG = ToAutomaton::RegistratorWrapper<automaton::NFA < > , g template <class T> automaton::NPDA < > ToAutomaton::convert(const T& grammar) { - automaton::NPDA < > automaton(label::InitialStateLabel::INITIAL_STATE_LABEL, grammar.getInitialSymbol()); + automaton::NPDA < > automaton(label::InitialStateLabel::instance < label::Label > ( ), grammar.getInitialSymbol()); automaton.setInputAlphabet(grammar.getTerminalAlphabet()); diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp index 6bd1e388d960309a562aebbe0f8e4afe85928abd..1801a727ecf653451d1dff6d9e2881dc275800b4 100644 --- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp +++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp @@ -21,8 +21,8 @@ automaton::Automaton ToAutomatonBottomUp::convert(const grammar::Grammar& gramma template <class T> automaton::NPDA < > ToAutomatonBottomUp::convert(const T& grammar) { - label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL; - label::Label r = label::FinalStateLabel::FINAL_STATE_LABEL; + label::Label q = label::InitialStateLabel::instance < label::Label > ( ); + label::Label r = label::FinalStateLabel::instance < label::Label > ( ); automaton::NPDA < > automaton(q, alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); automaton.addState(r); diff --git a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp index b755827c35af3a515ca77e186a4c5c0ff8d54403..db2e48cfe84719848cfce7a026ac55f8f9901442 100644 --- a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp +++ b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp @@ -44,7 +44,7 @@ void GrammarCFGtoPDATest::testTopDown() grammar.addRule(nF, std::vector<alphabet::Symbol>{tA}); - label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL; + label::Label q = label::InitialStateLabel::instance < label::Label > ( ); automaton::NPDA < > pda(q, nE); pda.setStates(std::set<label::Label>{q}); @@ -89,8 +89,8 @@ void GrammarCFGtoPDATest::testBottomUp() grammar.addRule(nF, std::vector<alphabet::Symbol>{tA}); - label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL; - label::Label r = label::FinalStateLabel::FINAL_STATE_LABEL; + label::Label q = label::InitialStateLabel::instance < label::Label > ( ); + label::Label r = label::FinalStateLabel::instance < label::Label > ( ); alphabet::Symbol bots( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); automaton::NPDA < > pda(q, bots); diff --git a/alib2data/src/automaton/FSM/CompactNFA.h b/alib2data/src/automaton/FSM/CompactNFA.h index 24f460cc6cb0fcc3f4e0b39fe9b1f172e741cb6c..0de2fc7652ea287cbd77c7ad8e2534011738fe00 100644 --- a/alib2data/src/automaton/FSM/CompactNFA.h +++ b/alib2data/src/automaton/FSM/CompactNFA.h @@ -200,7 +200,7 @@ CompactNFA < SymbolType, StateType >::CompactNFA ( const EpsilonNFA < > & other } template < class SymbolType, class StateType > -CompactNFA < SymbolType, StateType >::CompactNFA ( const MultiInitialStateNFA < > & other ) : CompactNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) { +CompactNFA < SymbolType, StateType >::CompactNFA ( const MultiInitialStateNFA < > & other ) : CompactNFA ( 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::vector < SymbolType > > key = std::make_pair ( transition.first.first, std::vector < SymbolType > { transition.first.second } ); transitions[key] = transition.second; diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.h b/alib2data/src/automaton/FSM/EpsilonNFA.h index 98a82fab026c1d15b1c6aa520efd9337a6c5baf6..5ca3f7b7cfb42bd64c81aef6b5b493af9c9550ef 100644 --- a/alib2data/src/automaton/FSM/EpsilonNFA.h +++ b/alib2data/src/automaton/FSM/EpsilonNFA.h @@ -264,7 +264,7 @@ EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( StateType initia template<class SymbolType, class EpsilonType, class StateType > -EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const MultiInitialStateNFA < > & other ) : EpsilonNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) { +EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const MultiInitialStateNFA < > & 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 ) ); transitions[key] = transition.second; diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.h b/alib2data/src/automaton/FSM/ExtendedNFA.h index ea66f192aa40026dcaa8bae074db5b74ce010925..4e08dcf8ac9ba89ac6979714e79866cab18c296f 100644 --- a/alib2data/src/automaton/FSM/ExtendedNFA.h +++ b/alib2data/src/automaton/FSM/ExtendedNFA.h @@ -218,7 +218,7 @@ ExtendedNFA < SymbolType, StateType >::ExtendedNFA ( const EpsilonNFA < > & othe } template<class SymbolType, class StateType > -ExtendedNFA < SymbolType, StateType >::ExtendedNFA ( const MultiInitialStateNFA < > & other ) : ExtendedNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) { +ExtendedNFA < SymbolType, StateType >::ExtendedNFA ( const MultiInitialStateNFA < > & other ) : ExtendedNFA ( 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, regexp::UnboundedRegExpStructure < SymbolType > > key = std::make_pair ( transition.first.first, regexp::UnboundedRegExpStructure < SymbolType > ( regexp::UnboundedRegExpSymbol < SymbolType > ( transition.first.second ) ) ); transitions[key] = transition.second; diff --git a/alib2data/src/label/FailStateLabel.cpp b/alib2data/src/label/FailStateLabel.cpp index 50567d717d5fb3594ef03dc844e5c0a46fbb32b0..b68fa76dc09327ad9be757771d027230321e20eb 100644 --- a/alib2data/src/label/FailStateLabel.cpp +++ b/alib2data/src/label/FailStateLabel.cpp @@ -35,12 +35,9 @@ void FailStateLabel::operator>>(std::ostream& out) const { } FailStateLabel::operator std::string() const { - return "fail"; + return FailStateLabel::instance < std::string > ( ); } -FailStateLabel FailStateLabel::FAIL_STATE = FailStateLabel ( ); -Label FailStateLabel::FAIL_STATE_LABEL = Label ( FailStateLabel ( ) ); - FailStateLabel FailStateLabel::parse(std::deque<sax::Token>::iterator& input) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, FailStateLabel::getXmlTagName()); sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, FailStateLabel::getXmlTagName()); diff --git a/alib2data/src/label/FailStateLabel.h b/alib2data/src/label/FailStateLabel.h index e5ec06158c7b32769564eced44397de22999d6ae..815f7dd1551c84ae79e64796b1153a99354008fc 100644 --- a/alib2data/src/label/FailStateLabel.h +++ b/alib2data/src/label/FailStateLabel.h @@ -10,6 +10,7 @@ #include "LabelBase.h" #include "Label.h" +#include <object/Object.h> namespace label { @@ -40,8 +41,10 @@ public: virtual explicit operator std::string ( ) const; - static FailStateLabel FAIL_STATE; - static Label FAIL_STATE_LABEL; + template < typename Base > + static inline typename std::enable_if < std::is_integral < Base >::value, Base >::type instance ( ); + template < typename Base > + static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( ); static const std::string & getXmlTagName() { static std::string xmlTagName = "FailStateLabel"; @@ -56,6 +59,31 @@ public: virtual LabelBase * inc ( ) &&; }; +template < typename Base > +inline typename std::enable_if < std::is_integral < Base >::value, Base >::type FailStateLabel::instance ( ) { + return -1; +} + +template < > +inline std::string FailStateLabel::instance < std::string > ( ) { + return std::string ( "fail" ); +} + +template < > +inline FailStateLabel FailStateLabel::instance < FailStateLabel > ( ) { + return FailStateLabel ( ); +} + +template < > +inline Label FailStateLabel::instance < Label > ( ) { + return Label ( FailStateLabel ( ) ); +} + +template < > +inline alib::Object FailStateLabel::instance < alib::Object > ( ) { + return alib::Object ( FailStateLabel ( ) ); +} + } /* namespace label */ #endif /* FAIL_STATE_LABEL_H_ */ diff --git a/alib2data/src/label/FinalStateLabel.cpp b/alib2data/src/label/FinalStateLabel.cpp index a7e2b97032e6344045b098768607877d3618977a..69b6a35f39fad7a1ec3546313b13bdadc8134ec5 100644 --- a/alib2data/src/label/FinalStateLabel.cpp +++ b/alib2data/src/label/FinalStateLabel.cpp @@ -35,12 +35,9 @@ void FinalStateLabel::operator>>(std::ostream& out) const { } FinalStateLabel::operator std::string() const { - return "f"; + return FinalStateLabel::instance < std::string > ( ); } -FinalStateLabel FinalStateLabel::FINAL_STATE = FinalStateLabel ( ); -Label FinalStateLabel::FINAL_STATE_LABEL = Label ( FinalStateLabel ( ) ); - FinalStateLabel FinalStateLabel::parse(std::deque<sax::Token>::iterator& input) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, FinalStateLabel::getXmlTagName()); sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, FinalStateLabel::getXmlTagName()); diff --git a/alib2data/src/label/FinalStateLabel.h b/alib2data/src/label/FinalStateLabel.h index 037c26a618f56f76502bf0f62f93c2d12254ade6..81b39a2b330d6c1d6fa8a0a649f01370a831772d 100644 --- a/alib2data/src/label/FinalStateLabel.h +++ b/alib2data/src/label/FinalStateLabel.h @@ -10,6 +10,8 @@ #include "LabelBase.h" #include "Label.h" +#include <object/Object.h> +#include <limits> namespace label { @@ -40,8 +42,10 @@ public: virtual explicit operator std::string ( ) const; - static FinalStateLabel FINAL_STATE; - static Label FINAL_STATE_LABEL; + template < typename Base > + static inline typename std::enable_if < std::is_integral < Base >::value, Base >::type instance ( ); + template < typename Base > + static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( ); static const std::string & getXmlTagName() { static std::string xmlTagName = "FinalStateLabel"; @@ -56,6 +60,31 @@ public: virtual LabelBase * inc ( ) &&; }; +template < typename Base > +inline typename std::enable_if < std::is_integral < Base >::value, Base >::type FinalStateLabel::instance ( ) { + return std::numeric_limits < Base >::max(); +} + +template < > +inline std::string FinalStateLabel::instance < std::string > ( ) { + return std::string ( "final" ); +} + +template < > +inline FinalStateLabel FinalStateLabel::instance < FinalStateLabel > ( ) { + return FinalStateLabel ( ); +} + +template < > +inline Label FinalStateLabel::instance < Label > ( ) { + return Label ( FinalStateLabel ( ) ); +} + +template < > +inline alib::Object FinalStateLabel::instance < alib::Object > ( ) { + return alib::Object ( FinalStateLabel ( ) ); +} + } /* namespace label */ #endif /* FINAL_STATE_LABEL_H_ */ diff --git a/alib2data/src/label/InitialStateLabel.cpp b/alib2data/src/label/InitialStateLabel.cpp index 92a5f7a75d065781836f715621530d3b5acf648e..3e668edd0df67ecfc5989a22f5bb379f148b32d6 100644 --- a/alib2data/src/label/InitialStateLabel.cpp +++ b/alib2data/src/label/InitialStateLabel.cpp @@ -35,12 +35,9 @@ void InitialStateLabel::operator>>(std::ostream& out) const { } InitialStateLabel::operator std::string() const { - return "q0"; + return InitialStateLabel::instance < std::string > ( ); } -InitialStateLabel InitialStateLabel::INITIAL_STATE = InitialStateLabel ( ); -Label InitialStateLabel::INITIAL_STATE_LABEL = Label ( InitialStateLabel ( ) ); - InitialStateLabel InitialStateLabel::parse(std::deque<sax::Token>::iterator& input) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, InitialStateLabel::getXmlTagName()); sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, InitialStateLabel::getXmlTagName()); diff --git a/alib2data/src/label/InitialStateLabel.h b/alib2data/src/label/InitialStateLabel.h index 0db1bc89a7bc9589961caf9559a509077df8cf5c..7dce852e83e62b86540290b1907cf3d394b49775 100644 --- a/alib2data/src/label/InitialStateLabel.h +++ b/alib2data/src/label/InitialStateLabel.h @@ -10,6 +10,7 @@ #include "LabelBase.h" #include "Label.h" +#include <object/Object.h> namespace label { @@ -40,8 +41,10 @@ public: virtual explicit operator std::string ( ) const; - static InitialStateLabel INITIAL_STATE; - static Label INITIAL_STATE_LABEL; + template < typename Base > + static inline typename std::enable_if < std::is_integral < Base >::value, Base >::type instance ( ); + template < typename Base > + static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( ); static const std::string & getXmlTagName() { static std::string xmlTagName = "InitialStateLabel"; @@ -56,6 +59,31 @@ public: virtual LabelBase * inc ( ) &&; }; +template < typename Base > +inline typename std::enable_if < std::is_integral < Base >::value, Base >::type InitialStateLabel::instance ( ) { + return 0; +} + +template < > +inline std::string InitialStateLabel::instance < std::string > ( ) { + return std::string ( "initial" ); +} + +template < > +inline InitialStateLabel InitialStateLabel::instance < InitialStateLabel > ( ) { + return InitialStateLabel ( ); +} + +template < > +inline Label InitialStateLabel::instance < Label > ( ) { + return Label ( InitialStateLabel ( ) ); +} + +template < > +inline alib::Object InitialStateLabel::instance < alib::Object > ( ) { + return alib::Object ( InitialStateLabel ( ) ); +} + } /* namespace label */ #endif /* INITIAL_STATE_LABEL_H_ */