diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index 6cbd75faffbb3f8abe29eb56fea702b01b7a8cd2..afb892b509e15006769f5e3e11318103977de018 100644 --- a/alib2data/src/Api.cpp +++ b/alib2data/src/Api.cpp @@ -397,151 +397,151 @@ std::list<sax::Token> api<string::Epsilon>::compose(const string::Epsilon& data) } void ToXMLComposers::Visit(void* data, const container::ObjectsSet& container) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::containerComposer.compose(container)); + *((std::list<sax::Token>*) data) = std::move(api<container::ObjectsSet>::compose(container)); } void ToXMLComposers::Visit(void* data, const exception::AlibException& symbol) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::exceptionComposer.compose(symbol)); + *((std::list<sax::Token>*) data) = std::move(api<exception::AlibException>::compose(symbol)); } void ToXMLComposers::Visit(void* data, const alphabet::BlankSymbol& symbol) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::symbolComposer.compose(symbol)); + *((std::list<sax::Token>*) data) = std::move(api<alphabet::BlankSymbol>::compose(symbol)); } void ToXMLComposers::Visit(void* data, const alphabet::BottomOfTheStackSymbol& symbol) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::symbolComposer.compose(symbol)); + *((std::list<sax::Token>*) data) = std::move(api<alphabet::BottomOfTheStackSymbol>::compose(symbol)); } void ToXMLComposers::Visit(void* data, const alphabet::EndSymbol& symbol) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::symbolComposer.compose(symbol)); + *((std::list<sax::Token>*) data) = std::move(api<alphabet::EndSymbol>::compose(symbol)); } void ToXMLComposers::Visit(void* data, const alphabet::LabeledSymbol& symbol) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::symbolComposer.compose(symbol)); + *((std::list<sax::Token>*) data) = std::move(api<alphabet::LabeledSymbol>::compose(symbol)); } void ToXMLComposers::Visit(void* data, const automaton::UnknownAutomaton& automaton) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::automatonComposer.compose(automaton)); + *((std::list<sax::Token>*) data) = std::move(api<automaton::UnknownAutomaton>::compose(automaton)); } void ToXMLComposers::Visit(void* data, const automaton::EpsilonNFA& automaton) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::automatonComposer.compose(automaton)); + *((std::list<sax::Token>*) data) = std::move(api<automaton::EpsilonNFA>::compose(automaton)); } void ToXMLComposers::Visit(void* data, const automaton::NFA& automaton) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::automatonComposer.compose(automaton)); + *((std::list<sax::Token>*) data) = std::move(api<automaton::NFA>::compose(automaton)); } void ToXMLComposers::Visit(void* data, const automaton::DFA& automaton) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::automatonComposer.compose(automaton)); + *((std::list<sax::Token>*) data) = std::move(api<automaton::DFA>::compose(automaton)); } void ToXMLComposers::Visit(void* data, const automaton::ExtendedNFA& automaton) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::automatonComposer.compose(automaton)); + *((std::list<sax::Token>*) data) = std::move(api<automaton::ExtendedNFA>::compose(automaton)); } void ToXMLComposers::Visit(void* data, const automaton::CompactNFA& automaton) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::automatonComposer.compose(automaton)); + *((std::list<sax::Token>*) data) = std::move(api<automaton::CompactNFA>::compose(automaton)); } void ToXMLComposers::Visit(void* data, const automaton::NPDA& automaton) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::automatonComposer.compose(automaton)); + *((std::list<sax::Token>*) data) = std::move(api<automaton::NPDA>::compose(automaton)); } void ToXMLComposers::Visit(void* data, const automaton::SinglePopNPDA& automaton) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::automatonComposer.compose(automaton)); + *((std::list<sax::Token>*) data) = std::move(api<automaton::SinglePopNPDA>::compose(automaton)); } void ToXMLComposers::Visit(void* data, const automaton::OneTapeDTM& automaton) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::automatonComposer.compose(automaton)); + *((std::list<sax::Token>*) data) = std::move(api<automaton::OneTapeDTM>::compose(automaton)); } void ToXMLComposers::Visit(void* data, const grammar::UnknownGrammar& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::UnknownGrammar>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::LeftLG& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::LeftLG>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::LeftRG& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::LeftRG>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::RightLG& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::RightLG>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::RightRG& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::RightRG>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::LG& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::LG>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::CFG& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::CFG>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::EpsilonFreeCFG& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::EpsilonFreeCFG>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::CNF& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::CNF>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::GNF& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::GNF>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::CSG& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::CSG>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::NonContractingGrammar& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::NonContractingGrammar>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::ContextPreservingUnrestrictedGrammar& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::ContextPreservingUnrestrictedGrammar>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const grammar::UnrestrictedGrammar& grammar) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::grammarComposer.compose(grammar)); + *((std::list<sax::Token>*) data) = std::move(api<grammar::UnrestrictedGrammar>::compose(grammar)); } void ToXMLComposers::Visit(void* data, const label::IntegerLabel& label) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::labelComposer.compose(label)); + *((std::list<sax::Token>*) data) = std::move(api<label::IntegerLabel>::compose(label)); } void ToXMLComposers::Visit(void* data, const label::CharacterLabel& label) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::labelComposer.compose(label)); + *((std::list<sax::Token>*) data) = std::move(api<label::CharacterLabel>::compose(label)); } void ToXMLComposers::Visit(void* data, const label::StringLabel& label) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::labelComposer.compose(label)); + *((std::list<sax::Token>*) data) = std::move(api<label::StringLabel>::compose(label)); } void ToXMLComposers::Visit(void* data, const regexp::UnboundedRegExp& regexp) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::regexpComposer.compose(regexp)); + *((std::list<sax::Token>*) data) = std::move(api<regexp::UnboundedRegExp>::compose(regexp)); } void ToXMLComposers::Visit(void* data, const regexp::FormalRegExp& regexp) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::regexpComposer.compose(regexp)); + *((std::list<sax::Token>*) data) = std::move(api<regexp::FormalRegExp>::compose(regexp)); } void ToXMLComposers::Visit(void* data, const string::Epsilon& string) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::stringComposer.compose(string)); + *((std::list<sax::Token>*) data) = std::move(api<string::Epsilon>::compose(string)); } void ToXMLComposers::Visit(void* data, const string::CyclicString& string) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::stringComposer.compose(string)); + *((std::list<sax::Token>*) data) = std::move(api<string::CyclicString>::compose(string)); } void ToXMLComposers::Visit(void* data, const string::LinearString& string) const { - *((std::list<sax::Token>*) data) = std::move(ToXMLComposers::stringComposer.compose(string)); + *((std::list<sax::Token>*) data) = std::move(api<string::LinearString>::compose(string)); } } /* namespace alib */ diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp index c2ce6cbc026c7b419b2f447ce948d81141f34c31..21204778c74a09a78f0026fde3f6f1ad3614001c 100644 --- a/alib2data/src/Api.hpp +++ b/alib2data/src/Api.hpp @@ -50,9 +50,9 @@ struct api<container::ObjectsSet> { template<> -struct api<alib::Object> { - static alib::Object parse(std::list<sax::Token>& input); - static std::list<sax::Token> compose(const alib::Object& data); +struct api<Object> { + static Object parse(std::list<sax::Token>& input); + static std::list<sax::Token> compose(const Object& data); }; @@ -341,7 +341,7 @@ public: static const automaton::AutomatonFromXMLParser automatonParser; static const grammar::GrammarFromXMLParser grammarParser; static const exception::ExceptionFromXMLParser exceptionParser; - static const alib::ObjectFromXMLParser objectParser; + static const ObjectFromXMLParser objectParser; static const container::ContainerFromXMLParser containerParser; }; @@ -400,7 +400,7 @@ public: static const automaton::AutomatonToXMLComposer automatonComposer; static const grammar::GrammarToXMLComposer grammarComposer; static const exception::ExceptionToXMLComposer exceptionComposer; - static const alib::ObjectToXMLComposer objectComposer; + static const ObjectToXMLComposer objectComposer; static const container::ContainerToXMLComposer containerComposer; static const ToXMLComposers toXMLComposers; diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp index d65be04a760f2d4b764ce1a361c78d459ef1758f..76f674fb8e966274f4d4295f3725433e0168d1a1 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp +++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp @@ -26,7 +26,7 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const SymbolBase& symbol) con std::list<sax::Token> SymbolToXMLComposer::compose(const LabeledSymbol& symbol) const { std::list<sax::Token> out; out.push_back(sax::Token("LabeledSymbol", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::labelComposer.compose(symbol.getLabel())); + out.splice(out.end(), alib::api<label::Label>::compose(symbol.getLabel())); out.push_back(sax::Token("LabeledSymbol", sax::Token::TokenType::END_ELEMENT)); return out; } diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h index 0d06615401b8f2e8426d652148bd3926a9ae5b60..dff6166b3bfc3ed3cdc78b044fddb6cbd8ec22ce 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.h +++ b/alib2data/src/alphabet/SymbolToXMLComposer.h @@ -13,13 +13,19 @@ #include "../sax/Token.h" #include "../label/Label.h" +namespace alib { + +template<typename T> +struct api; + +} /* namespace alib */ + namespace alphabet { /** * This class contains methods to print XML representation of string to the output stream. */ class SymbolToXMLComposer { -public: /** * Prints XML representation of UnknownAutomaton to the output stream. * @param automaton automaton to print @@ -38,6 +44,8 @@ public: std::list<sax::Token> compose(const BlankSymbol& symbol) const; std::list<sax::Token> compose(const BottomOfTheStackSymbol& symbol) const; std::list<sax::Token> compose(const EndSymbol& symbol) const; + + template<typename T> friend class alib::api; }; } /* namespace alphabet */ diff --git a/alib2data/src/automaton/AutomatonToXMLComposer.cpp b/alib2data/src/automaton/AutomatonToXMLComposer.cpp index 2a24812c23a64ef9aafd4211df6b896ae498e5f3..dc493a25de6a8ce231a215bd9532eadc0bcd3c76 100644 --- a/alib2data/src/automaton/AutomatonToXMLComposer.cpp +++ b/alib2data/src/automaton/AutomatonToXMLComposer.cpp @@ -15,7 +15,7 @@ namespace automaton { void AutomatonToXMLComposer::composeStates(std::list<sax::Token>& out, const std::set<State>& states) const { out.push_back(sax::Token("states", sax::Token::TokenType::START_ELEMENT)); for (const auto& state : states) { - out.splice(out.end(), alib::ToXMLComposers::labelComposer.compose(state.getName())); + out.splice(out.end(), alib::api<label::Label>::compose(state.getName())); } out.push_back(sax::Token("states", sax::Token::TokenType::END_ELEMENT)); } @@ -23,7 +23,7 @@ void AutomatonToXMLComposer::composeStates(std::list<sax::Token>& out, const std void AutomatonToXMLComposer::composeInputAlphabet(std::list<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const { out.push_back(sax::Token("inputAlphabet", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("inputAlphabet", sax::Token::TokenType::END_ELEMENT)); } @@ -31,21 +31,21 @@ void AutomatonToXMLComposer::composeInputAlphabet(std::list<sax::Token>& out, co void AutomatonToXMLComposer::composeInitialStates(std::list<sax::Token>& out, const std::set<State>& states) const { out.push_back(sax::Token("initialStates", sax::Token::TokenType::START_ELEMENT)); for (const auto& state : states) { - out.splice(out.end(), alib::ToXMLComposers::labelComposer.compose(state.getName())); + out.splice(out.end(), alib::api<label::Label>::compose(state.getName())); } out.push_back(sax::Token("initialStates", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeInitialState(std::list<sax::Token>& out, const State& state) const { out.push_back(sax::Token("initialState", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::labelComposer.compose(state.getName())); + out.splice(out.end(), alib::api<label::Label>::compose(state.getName())); out.push_back(sax::Token("initialState", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeFinalStates(std::list<sax::Token>& out, const std::set<State>& states) const { out.push_back(sax::Token("finalStates", sax::Token::TokenType::START_ELEMENT)); for (const auto& state : states) { - out.splice(out.end(), alib::ToXMLComposers::labelComposer.compose(state.getName())); + out.splice(out.end(), alib::api<label::Label>::compose(state.getName())); } out.push_back(sax::Token("finalStates", sax::Token::TokenType::END_ELEMENT)); } @@ -53,7 +53,7 @@ void AutomatonToXMLComposer::composeFinalStates(std::list<sax::Token>& out, cons void AutomatonToXMLComposer::composeStackAlphabet(std::list<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const { out.push_back(sax::Token("stackAlphabet", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("stackAlphabet", sax::Token::TokenType::END_ELEMENT)); } @@ -61,28 +61,28 @@ void AutomatonToXMLComposer::composeStackAlphabet(std::list<sax::Token>& out, co void AutomatonToXMLComposer::composeInitialStackSymbols(std::list<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const { out.push_back(sax::Token("initialStackSymbols", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("initialStackSymbols", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeInitialStackSymbol(std::list<sax::Token>& out, const alphabet::Symbol& symbol) const { out.push_back(sax::Token("initialStackSymbol", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); out.push_back(sax::Token("initialStackSymbol", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeTapeAlphabet(std::list<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const { out.push_back(sax::Token("tapeAlphabet", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("tapeAlphabet", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeBlankSymbol(std::list<sax::Token>& out, const alphabet::Symbol& symbol) const { out.push_back(sax::Token("blankSymbol", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); out.push_back(sax::Token("blankSymbol", sax::Token::TokenType::END_ELEMENT)); } @@ -259,13 +259,13 @@ void AutomatonToXMLComposer::composeTransitions(std::list<sax::Token>& out, cons void AutomatonToXMLComposer::composeTransitionTo(std::list<sax::Token>& out, const State& state) const { out.push_back(sax::Token("to", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::labelComposer.compose(state.getName())); + out.splice(out.end(), alib::api<label::Label>::compose(state.getName())); out.push_back(sax::Token("to", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeTransitionFrom(std::list<sax::Token>& out, const State& state) const { out.push_back(sax::Token("from", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::labelComposer.compose(state.getName())); + out.splice(out.end(), alib::api<label::Label>::compose(state.getName())); out.push_back(sax::Token("from", sax::Token::TokenType::END_ELEMENT)); } @@ -278,34 +278,34 @@ void AutomatonToXMLComposer::composeTransitionShift(std::list<sax::Token>& out, void AutomatonToXMLComposer::composeTransitionPop(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols) const { out.push_back(sax::Token("pop", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("pop", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeTransitionSinglePop(std::list<sax::Token>& out, const alphabet::Symbol& symbol) const { out.push_back(sax::Token("pop", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); out.push_back(sax::Token("pop", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeTransitionPush(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols) const { out.push_back(sax::Token("push", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("push", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeTransitionInputSymbol(std::list<sax::Token>& out, const alphabet::Symbol& symbol) const { out.push_back(sax::Token("input", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); out.push_back(sax::Token("input", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeTransitionOutputSymbol(std::list<sax::Token>& out, const alphabet::Symbol& symbol) const { out.push_back(sax::Token("output", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); out.push_back(sax::Token("output", sax::Token::TokenType::END_ELEMENT)); } @@ -315,7 +315,7 @@ void AutomatonToXMLComposer::composeTransitionInputEpsilonSymbol(std::list<sax:: out.push_back(sax::Token("epsilon", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("epsilon", sax::Token::TokenType::END_ELEMENT)); } else { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol.get<alphabet::Symbol>())); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol.get<alphabet::Symbol>())); } out.push_back(sax::Token("input", sax::Token::TokenType::END_ELEMENT)); } @@ -326,20 +326,20 @@ void AutomatonToXMLComposer::composeTransitionOutputEpsilonSymbol(std::list<sax: out.push_back(sax::Token("epsilon", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("epsilon", sax::Token::TokenType::END_ELEMENT)); } else { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol.get<alphabet::Symbol>())); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol.get<alphabet::Symbol>())); } out.push_back(sax::Token("output", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeTransitionInputString(std::list<sax::Token>& out, const string::String& string) const { out.push_back(sax::Token("input", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::stringComposer.compose(string)); + out.splice(out.end(), alib::api<string::String>::compose(string)); out.push_back(sax::Token("input", sax::Token::TokenType::END_ELEMENT)); } void AutomatonToXMLComposer::composeTransitionInputRegexp(std::list<sax::Token>& out, const regexp::RegExp& regexp) const { out.push_back(sax::Token("input", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::regexpComposer.compose(regexp)); + out.splice(out.end(), alib::api<regexp::RegExp>::compose(regexp)); out.push_back(sax::Token("input", sax::Token::TokenType::END_ELEMENT)); } diff --git a/alib2data/src/automaton/AutomatonToXMLComposer.h b/alib2data/src/automaton/AutomatonToXMLComposer.h index 65ea720316b4c0ad4a764fb6519228371cfac99c..6a5cd16aeef93ef791ec0c388987db00a1eb498e 100644 --- a/alib2data/src/automaton/AutomatonToXMLComposer.h +++ b/alib2data/src/automaton/AutomatonToXMLComposer.h @@ -22,13 +22,19 @@ #include "TM/OneTapeDTM.h" #include "../sax/Token.h" +namespace alib { + +template<typename T> +struct api; + +} /* namespace alib */ + namespace automaton { /** * This class contains methods to print XML representation of automata to the output stream. */ class AutomatonToXMLComposer { -protected: void composeStates(std::list<sax::Token>&, const std::set<State>& states) const; void composeInputAlphabet(std::list<sax::Token>&, const std::set<alphabet::Symbol>& symbols) const; void composeInitialStates(std::list<sax::Token>&, const std::set<State>& states) const; @@ -63,7 +69,6 @@ protected: void composeTransitionInputString(std::list<sax::Token>&, const string::String& string) const; void composeTransitionInputRegexp(std::list<sax::Token>&, const regexp::RegExp& regexp) const; -public: /** * Prints XML representation of UnknownAutomaton to the output stream. * @param automaton automaton to print @@ -82,6 +87,8 @@ public: std::list<sax::Token> compose(const NPDA& automaton) const; std::list<sax::Token> compose(const SinglePopNPDA& automaton) const; std::list<sax::Token> compose(const OneTapeDTM& automaton) const; + + template<typename T> friend class alib::api; }; } /* namespace automaton */ diff --git a/alib2data/src/container/ContainerToXMLComposer.hpp b/alib2data/src/container/ContainerToXMLComposer.hpp index ecc2b8d834e29bce50a5d0d96dedc54239177f38..74eb8341f61df8616f1607b0914dde064767da13 100644 --- a/alib2data/src/container/ContainerToXMLComposer.hpp +++ b/alib2data/src/container/ContainerToXMLComposer.hpp @@ -28,7 +28,6 @@ namespace container { * This class contains methods to print XML representation of automata to the output stream. */ class ContainerToXMLComposer { -public: /** * Prints XML representation of UnknownAutomaton to the output stream. * @param automaton automaton to print diff --git a/alib2data/src/exception/ExceptionToXMLComposer.h b/alib2data/src/exception/ExceptionToXMLComposer.h index 54d68dae97a5e84a642091d69948784fdd5917b9..0a6ccc9308f9dc0cc94fa8aa5600ac465a178cb0 100644 --- a/alib2data/src/exception/ExceptionToXMLComposer.h +++ b/alib2data/src/exception/ExceptionToXMLComposer.h @@ -12,19 +12,27 @@ #include "AlibException.h" #include "../sax/Token.h" +namespace alib { + +template<typename T> +struct api; + +} /* namespace alib */ + namespace exception { /** * This class contains methods to print XML representation of string to the output stream. */ class ExceptionToXMLComposer { -public: /** * Prints XML representation of AlibException to the output stream. * @param string Exception to print * @param out output stream to which print the String */ std::list<sax::Token> compose(const AlibException& exception) const; + + template<typename T> friend class alib::api; }; } /* namespace exception */ diff --git a/alib2data/src/grammar/GrammarToXMLComposer.cpp b/alib2data/src/grammar/GrammarToXMLComposer.cpp index 1725cd274ec54f6f09d0cb509400a6d4c2e25218..887456daa1cfaf6f68163076e3cf4fc4b9b1c906 100644 --- a/alib2data/src/grammar/GrammarToXMLComposer.cpp +++ b/alib2data/src/grammar/GrammarToXMLComposer.cpp @@ -223,7 +223,7 @@ std::list<sax::Token> GrammarToXMLComposer::compose(const UnrestrictedGrammar& g void GrammarToXMLComposer::composeNonterminalAlphabet(std::list<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const { out.push_back(sax::Token("nonterminalAlphabet", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("nonterminalAlphabet", sax::Token::TokenType::END_ELEMENT)); } @@ -231,14 +231,14 @@ void GrammarToXMLComposer::composeNonterminalAlphabet(std::list<sax::Token>& out void GrammarToXMLComposer::composeTerminalAlphabet(std::list<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const { out.push_back(sax::Token("terminalAlphabet", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("terminalAlphabet", sax::Token::TokenType::END_ELEMENT)); } void GrammarToXMLComposer::composeInitialSymbol(std::list<sax::Token>& out, const alphabet::Symbol& symbol) const { out.push_back(sax::Token("initialSymbol", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); out.push_back(sax::Token("initialSymbol", sax::Token::TokenType::END_ELEMENT)); } @@ -503,7 +503,7 @@ void GrammarToXMLComposer::composeRuleLContext(std::list<sax::Token>& out, const out.push_back(sax::Token("epsilon", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("epsilon", sax::Token::TokenType::END_ELEMENT)); } else for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("lContext", sax::Token::TokenType::END_ELEMENT)); } @@ -514,7 +514,7 @@ void GrammarToXMLComposer::composeRuleLHS(std::list<sax::Token>& out, const std: out.push_back(sax::Token("epsilon", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("epsilon", sax::Token::TokenType::END_ELEMENT)); } else for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("lhs", sax::Token::TokenType::END_ELEMENT)); } @@ -525,14 +525,14 @@ void GrammarToXMLComposer::composeRuleRContext(std::list<sax::Token>& out, const out.push_back(sax::Token("epsilon", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("epsilon", sax::Token::TokenType::END_ELEMENT)); } else for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("rContext", sax::Token::TokenType::END_ELEMENT)); } void GrammarToXMLComposer::composeRuleSingleSymbolLHS(std::list<sax::Token>& out, const alphabet::Symbol& symbol) const { out.push_back(sax::Token("lhs", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); out.push_back(sax::Token("lhs", sax::Token::TokenType::END_ELEMENT)); } @@ -542,7 +542,7 @@ void GrammarToXMLComposer::composeRuleRHS(std::list<sax::Token>& out, const std: out.push_back(sax::Token("epsilon", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("epsilon", sax::Token::TokenType::END_ELEMENT)); } else for (const auto& symbol : symbols) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("rhs", sax::Token::TokenType::END_ELEMENT)); } @@ -550,11 +550,11 @@ void GrammarToXMLComposer::composeRuleRHS(std::list<sax::Token>& out, const std: void GrammarToXMLComposer::composeRuleOneOrTwoSymbolsRHS(std::list<sax::Token>& out, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& symbols) const { out.push_back(sax::Token("rhs", sax::Token::TokenType::START_ELEMENT)); if(symbols.is<alphabet::Symbol>()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbols.get<alphabet::Symbol>())); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbols.get<alphabet::Symbol>())); } else { const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = symbols.get<std::pair<alphabet::Symbol, alphabet::Symbol>>(); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(rhs.first)); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(rhs.second)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(rhs.first)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(rhs.second)); } out.push_back(sax::Token("rhs", sax::Token::TokenType::END_ELEMENT)); } @@ -562,10 +562,10 @@ void GrammarToXMLComposer::composeRuleOneOrTwoSymbolsRHS(std::list<sax::Token>& void GrammarToXMLComposer::composeRuleGNFRHS(std::list<sax::Token>& out, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>& symbols) const { out.push_back(sax::Token("rhs", sax::Token::TokenType::START_ELEMENT)); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbols.first)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbols.first)); for (const auto& symbol : symbols.second) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("rhs", sax::Token::TokenType::END_ELEMENT)); @@ -579,16 +579,16 @@ void GrammarToXMLComposer::composeRuleLGRHS(std::list<sax::Token>& out, const st out.push_back(sax::Token("epsilon", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("epsilon", sax::Token::TokenType::END_ELEMENT)); } else for (const auto& symbol : symbols.get<std::vector<alphabet::Symbol>>()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } } else { const std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>& rhs = symbols.get<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>>(); for (const auto& symbol : std::get<0>(rhs)) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(std::get<1>(rhs))); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(std::get<1>(rhs))); for (const auto& symbol : std::get<2>(rhs)) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } } out.push_back(sax::Token("rhs", sax::Token::TokenType::END_ELEMENT)); @@ -602,13 +602,13 @@ void GrammarToXMLComposer::composeRuleLeftLGRHS(std::list<sax::Token>& out, cons out.push_back(sax::Token("epsilon", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("epsilon", sax::Token::TokenType::END_ELEMENT)); } else for (const auto& symbol : symbols.get<std::vector<alphabet::Symbol>>()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } } else { const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>& rhs = symbols.get<std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>>(); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(rhs.first)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(rhs.first)); for (const auto& symbol : rhs.second) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } } out.push_back(sax::Token("rhs", sax::Token::TokenType::END_ELEMENT)); @@ -623,15 +623,15 @@ void GrammarToXMLComposer::composeRuleRightLGRHS(std::list<sax::Token>& out, con out.push_back(sax::Token("epsilon", sax::Token::TokenType::END_ELEMENT)); } else { for (const auto& symbol : symbols.get<std::vector<alphabet::Symbol>>()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } } } else { const std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>& rhs = symbols.get<std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>>(); for (const auto& symbol : rhs.first) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(rhs.second)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(rhs.second)); } out.push_back(sax::Token("rhs", sax::Token::TokenType::END_ELEMENT)); } diff --git a/alib2data/src/grammar/GrammarToXMLComposer.h b/alib2data/src/grammar/GrammarToXMLComposer.h index 31c4b9c0a80b5f1f99d15cd6486cf8180b486738..80beb747d1fe5244e6491a40f52260c88699c5ad 100644 --- a/alib2data/src/grammar/GrammarToXMLComposer.h +++ b/alib2data/src/grammar/GrammarToXMLComposer.h @@ -27,6 +27,13 @@ #include "Unrestricted/UnrestrictedGrammar.h" #include "../sax/Token.h" +namespace alib { + +template<typename T> +struct api; + +} /* namespace alib */ + namespace grammar { /** @@ -63,7 +70,7 @@ class GrammarToXMLComposer { void composeRuleLeftLGRHS(std::list<sax::Token>& out, const std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>>& symbols) const; void composeRuleRightLGRHS(std::list<sax::Token>& out, const std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>>& symbols) const; void composeRuleLGRHS(std::list<sax::Token>& out, const std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>>& symbols) const; -public: + /** * Prints XML representation of UnknownGrammar to the output stream. * @param grammar grammar to print @@ -87,6 +94,8 @@ public: std::list<sax::Token> compose(const NonContractingGrammar& grammar) const; std::list<sax::Token> compose(const ContextPreservingUnrestrictedGrammar& grammar) const; std::list<sax::Token> compose(const UnrestrictedGrammar& grammar) const; + + template<typename T> friend class alib::api; }; } /* namespace grammar */ diff --git a/alib2data/src/label/LabelToXMLComposer.h b/alib2data/src/label/LabelToXMLComposer.h index 268a55e658be7b6fd8e0aab41d317c3a1d2b8ada..5f967bea93b438e8d70847fe476de8275be7e0af 100644 --- a/alib2data/src/label/LabelToXMLComposer.h +++ b/alib2data/src/label/LabelToXMLComposer.h @@ -12,13 +12,19 @@ #include "Label.h" #include "../sax/Token.h" +namespace alib { + +template<typename T> +struct api; + +} /* namespace alib */ + namespace label { /** * This class contains methods to print XML representation of string to the output stream. */ class LabelToXMLComposer { -public: /** * Prints XML representation of String to the output stream. * @param string String to print @@ -36,6 +42,8 @@ public: std::list<sax::Token> compose(const StringLabel& label) const; std::list<sax::Token> compose(const IntegerLabel& label) const; std::list<sax::Token> compose(const CharacterLabel& label) const; + + template<typename T> friend class alib::api; }; } /* namespace label */ diff --git a/alib2data/src/object/ObjectToXMLComposer.h b/alib2data/src/object/ObjectToXMLComposer.h index 19716a87e5b89bde669a0af5d3e435b69c7ca9ac..23c69b5380c874daa92b19c9fcb2799f52246b77 100644 --- a/alib2data/src/object/ObjectToXMLComposer.h +++ b/alib2data/src/object/ObjectToXMLComposer.h @@ -15,11 +15,17 @@ namespace alib { +template<typename T> +struct api; + +} /* namespace alib */ + +namespace alib { + /** * This class contains methods to print XML representation of string to the output stream. */ class ObjectToXMLComposer { -public: /** * Prints XML representation of UnknownAutomaton to the output stream. * @param automaton automaton to print @@ -33,6 +39,8 @@ public: * @param out output stream to which print the String */ std::list<sax::Token> compose(const Object& object) const; + + template<typename T> friend class alib::api; }; } /* namespace alib */ diff --git a/alib2data/src/regexp/RegExpToXMLComposer.cpp b/alib2data/src/regexp/RegExpToXMLComposer.cpp index 4142f82e835ec5763485c79a6a7bf67aece0f8b6..10a03c0eb1e20a801fe8d0bf0315b34e36967006 100644 --- a/alib2data/src/regexp/RegExpToXMLComposer.cpp +++ b/alib2data/src/regexp/RegExpToXMLComposer.cpp @@ -46,7 +46,7 @@ void RegExpToXMLComposer::Visit(void* userData, const UnboundedRegExpIteration& void RegExpToXMLComposer::Visit(void* userData, const UnboundedRegExpSymbol& symbol) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol.getSymbol())); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol.getSymbol())); } void RegExpToXMLComposer::Visit(void* userData, const UnboundedRegExpEpsilon&) const { @@ -110,7 +110,7 @@ void RegExpToXMLComposer::Visit(void* userData, const FormalRegExpIteration& ite void RegExpToXMLComposer::Visit(void* userData, const FormalRegExpSymbol& symbol) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol.getSymbol())); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol.getSymbol())); } void RegExpToXMLComposer::Visit(void* userData, const FormalRegExpEpsilon&) const { @@ -145,7 +145,7 @@ std::list<sax::Token> RegExpToXMLComposer::compose(const UnboundedRegExp& regexp { out.push_back(sax::Token("alphabet", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol: regexp.getAlphabet()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("alphabet", sax::Token::TokenType::END_ELEMENT)); } @@ -160,7 +160,7 @@ std::list<sax::Token> RegExpToXMLComposer::compose(const FormalRegExp& regexp) c { out.push_back(sax::Token("alphabet", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol: regexp.getAlphabet()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("alphabet", sax::Token::TokenType::END_ELEMENT)); } diff --git a/alib2data/src/regexp/RegExpToXMLComposer.h b/alib2data/src/regexp/RegExpToXMLComposer.h index bd4adec4fc2a8827f0ab28729434a09f051e6a63..3ec0aed7b560b17739a28b48a016f724c88be9d7 100644 --- a/alib2data/src/regexp/RegExpToXMLComposer.h +++ b/alib2data/src/regexp/RegExpToXMLComposer.h @@ -14,6 +14,13 @@ #include "../std/visitor.hpp" #include "../sax/Token.h" +namespace alib { + +template<typename T> +struct api; + +} /* namespace alib */ + namespace regexp { /** @@ -36,7 +43,6 @@ class RegExpToXMLComposer :public UnboundedRegExpElement::const_visitor_type, pu void Visit(void*, const FormalRegExpEmpty& empty) const; -public: /** * Composes XML token representation of RegExp. * @param regexp RegExp to print @@ -53,6 +59,8 @@ public: std::list<sax::Token> compose(const UnboundedRegExp& regexp) const; std::list<sax::Token> compose(const FormalRegExp& regexp) const; + + template<typename T> friend class alib::api; }; } /* namespace regexp */ diff --git a/alib2data/src/string/StringToXMLComposer.cpp b/alib2data/src/string/StringToXMLComposer.cpp index 2f31ea88cd67fdc16388759b273fce7c0023420a..f45545a17d0ef0f402bdb77ac801db6e4f6da6ba 100644 --- a/alib2data/src/string/StringToXMLComposer.cpp +++ b/alib2data/src/string/StringToXMLComposer.cpp @@ -31,12 +31,12 @@ std::list<sax::Token> StringToXMLComposer::compose(const LinearString& string) c out.push_back(sax::Token("LinearString", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("alphabet", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol: string.getAlphabet()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("alphabet", sax::Token::TokenType::END_ELEMENT)); for(const auto& symbol : string.getContent()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("LinearString", sax::Token::TokenType::END_ELEMENT)); return out; @@ -47,12 +47,12 @@ std::list<sax::Token> StringToXMLComposer::compose(const CyclicString& string) c out.push_back(sax::Token("CyclicString", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("alphabet", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol: string.getAlphabet()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("alphabet", sax::Token::TokenType::END_ELEMENT)); for(const auto& symbol : string.getContent()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("CyclicString", sax::Token::TokenType::END_ELEMENT)); return out; @@ -63,7 +63,7 @@ std::list<sax::Token> StringToXMLComposer::compose(const Epsilon& string) const out.push_back(sax::Token("Epsilon", sax::Token::TokenType::START_ELEMENT)); out.push_back(sax::Token("alphabet", sax::Token::TokenType::START_ELEMENT)); for (const auto& symbol: string.getAlphabet()) { - out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol)); } out.push_back(sax::Token("alphabet", sax::Token::TokenType::END_ELEMENT)); out.push_back(sax::Token("Epsilon", sax::Token::TokenType::END_ELEMENT)); diff --git a/alib2data/src/string/StringToXMLComposer.h b/alib2data/src/string/StringToXMLComposer.h index 5b1f3ad87a323f1b2024624028bf29dc03e581ee..b2d81bd01921459c2c856642c1d12ab8905b5455 100644 --- a/alib2data/src/string/StringToXMLComposer.h +++ b/alib2data/src/string/StringToXMLComposer.h @@ -13,13 +13,19 @@ #include "../sax/Token.h" #include "../alphabet/Symbol.h" +namespace alib { + +template<typename T> +struct api; + +} /* namespace alib */ + namespace string { /** * This class contains methods to print XML representation of string to the output stream. */ class StringToXMLComposer { -public: /** * Prints XML representation of String to the output stream. * @param string String to print @@ -37,6 +43,8 @@ public: std::list<sax::Token> compose(const LinearString& string) const; std::list<sax::Token> compose(const CyclicString& string) const; std::list<sax::Token> compose(const Epsilon& string) const; + + template<typename T> friend class alib::api; }; } /* namespace string */ diff --git a/alib2data/test-src/alphabet/SymbolTest.cpp b/alib2data/test-src/alphabet/SymbolTest.cpp index 72453b6fc54f252a6028126fb502ecca4ee9adf8..21d11460d9bf920ed2ff81d3b873857f3dc25987 100644 --- a/alib2data/test-src/alphabet/SymbolTest.cpp +++ b/alib2data/test-src/alphabet/SymbolTest.cpp @@ -102,8 +102,7 @@ void SymbolTest::testXMLParser() { alphabet::Symbol symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("1")))); { - alphabet::SymbolToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(symbol); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(symbol); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); diff --git a/alib2data/test-src/automaton/AutomatonTest.cpp b/alib2data/test-src/automaton/AutomatonTest.cpp index 59661c21606c4b9657b59a3941172a1cbec00a7f..d7d63c7fb45cfab9d266087719342e8d40de5378 100644 --- a/alib2data/test-src/automaton/AutomatonTest.cpp +++ b/alib2data/test-src/automaton/AutomatonTest.cpp @@ -38,8 +38,7 @@ void AutomatonTest::testXMLParser() { CPPUNIT_ASSERT( automaton == automaton ); { - automaton::AutomatonToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(automaton); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(automaton); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -73,8 +72,7 @@ void AutomatonTest::testDFAParser() { CPPUNIT_ASSERT( automaton == automaton ); { - automaton::AutomatonToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(automaton); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(automaton); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); diff --git a/alib2data/test-src/grammar/GrammarTest.cpp b/alib2data/test-src/grammar/GrammarTest.cpp index 784c7b2afaa717710a856a72cce64600e9d95393..6d8dcf30098309c25e255fafd1aa5b22084d08a5 100644 --- a/alib2data/test-src/grammar/GrammarTest.cpp +++ b/alib2data/test-src/grammar/GrammarTest.cpp @@ -35,8 +35,7 @@ void GrammarTest::testXMLParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -73,8 +72,7 @@ void GrammarTest::testUnrestrictedParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -100,8 +98,7 @@ void GrammarTest::testUnrestrictedParser() { grammar.addRule(std::vector<alphabet::Symbol> {}, alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::vector<alphabet::Symbol> {}, std::vector<alphabet::Symbol> {}); CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -129,8 +126,7 @@ void GrammarTest::testRegularParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -158,8 +154,7 @@ void GrammarTest::testRegularParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -189,8 +184,7 @@ void GrammarTest::testContextFreeParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -218,8 +212,7 @@ void GrammarTest::testContextFreeParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -247,8 +240,7 @@ void GrammarTest::testContextFreeParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -276,8 +268,7 @@ void GrammarTest::testContextFreeParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -305,8 +296,7 @@ void GrammarTest::testContextFreeParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -336,8 +326,7 @@ void GrammarTest::testContextSensitiveParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); @@ -364,8 +353,7 @@ void GrammarTest::testContextSensitiveParser() { CPPUNIT_ASSERT( grammar == grammar ); { - grammar::GrammarToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(grammar); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(grammar); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); diff --git a/alib2data/test-src/label/LabelTest.cpp b/alib2data/test-src/label/LabelTest.cpp index cc28609daabb432cc765823879379e6bd033b46c..953afdefe2a6dc3752b153dce74940dad576ff90 100644 --- a/alib2data/test-src/label/LabelTest.cpp +++ b/alib2data/test-src/label/LabelTest.cpp @@ -81,8 +81,7 @@ void LabelTest::testXMLParser() { label::Label label(label::StringLabel("1")); { - label::LabelToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(label); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(label); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); diff --git a/alib2data/test-src/regexp/RegExpTest.cpp b/alib2data/test-src/regexp/RegExpTest.cpp index eff762cff8066a399984707e0fc0373dd53d031d..7caf0f1e9f9ffeb79a259033748966e98a3b28ab 100644 --- a/alib2data/test-src/regexp/RegExpTest.cpp +++ b/alib2data/test-src/regexp/RegExpTest.cpp @@ -132,8 +132,7 @@ void RegExpTest::testXMLParser() { regexp::RegExp regexp(unboundedRegexp); { - regexp::RegExpToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(regexp); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(regexp); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); diff --git a/alib2data/test-src/string/StringTest.cpp b/alib2data/test-src/string/StringTest.cpp index ecb97ed6fd2b00179e92bd083b57510e3a40aa29..a5086e5376a074aeec1390a9b372068a44bb6f07 100644 --- a/alib2data/test-src/string/StringTest.cpp +++ b/alib2data/test-src/string/StringTest.cpp @@ -118,8 +118,7 @@ void StringTest::testXMLParser() { string::String string(linearString); { - string::StringToXMLComposer composer; - std::list<sax::Token> tokens = composer.compose(string); + std::list<sax::Token> tokens = alib::DataFactory::toTokens(string); std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens);