diff --git a/alib2/src/alphabet/BlankSymbol.h b/alib2/src/alphabet/BlankSymbol.h index dca5215d6478a0f010be3fbd920d1b007f4be454..671e7a887d723d274dcc686194f3e4fef3db3e88 100644 --- a/alib2/src/alphabet/BlankSymbol.h +++ b/alib2/src/alphabet/BlankSymbol.h @@ -15,7 +15,7 @@ namespace alphabet { /** * Represents blank symbol in an alphabet. */ -class BlankSymbol : public SymbolBase, public std::element<BlankSymbol, SymbolBase::visitor_type> { +class BlankSymbol : virtual public SymbolBase, public std::element<BlankSymbol, SymbolBase> { public: /** * Creates a blank symbol. diff --git a/alib2/src/alphabet/LabeledSymbol.h b/alib2/src/alphabet/LabeledSymbol.h index 16c0954febcda012c88db7a32393f36a48e7f981..4e8b236ccb1d24a9e8c886b7b905eafcf4933db8 100644 --- a/alib2/src/alphabet/LabeledSymbol.h +++ b/alib2/src/alphabet/LabeledSymbol.h @@ -17,7 +17,7 @@ namespace alphabet { /** * Represents symbol in an alphabet. */ -class LabeledSymbol : public SymbolBase, public std::element<LabeledSymbol, SymbolBase::visitor_type> { +class LabeledSymbol : virtual public SymbolBase, public std::element<LabeledSymbol, SymbolBase> { protected: label::Label label; diff --git a/alib2/src/alphabet/Symbol.h b/alib2/src/alphabet/Symbol.h index 6500eedbac95f9569bd29888579828bc7257df5f..c69839ab0ec2cf8064af6c31a8980a307e647e7f 100644 --- a/alib2/src/alphabet/Symbol.h +++ b/alib2/src/alphabet/Symbol.h @@ -16,7 +16,7 @@ namespace alphabet { /** * Wrapper around automata. */ -class Symbol : public std::element<Symbol, std::visitor<Symbol> > { //TODO toto udělat v std templatované +class Symbol { //TODO toto udělat v std templatované protected: SymbolBase* symbol; public: diff --git a/alib2/src/alphabet/SymbolBase.h b/alib2/src/alphabet/SymbolBase.h index 98de64cf0178dae84a0d07134ea8878c9cd46f5f..717d2e80f626a109312bc07f736ade51594d882c 100644 --- a/alib2/src/alphabet/SymbolBase.h +++ b/alib2/src/alphabet/SymbolBase.h @@ -19,7 +19,7 @@ class BlankSymbol; /** * Represents symbol in an alphabet. */ -class SymbolBase : virtual public std::elementBase<std::visitor<LabeledSymbol, BlankSymbol> > { +class SymbolBase : virtual public std::elementBase<LabeledSymbol, BlankSymbol> { public: virtual ~SymbolBase() noexcept; diff --git a/alib2/src/alphabet/SymbolToStringComposer.h b/alib2/src/alphabet/SymbolToStringComposer.h index 1488a4436270cf1c8480a109065666c100d7ceb2..56acb49b26f015b619ee38259aab0064c72d638a 100644 --- a/alib2/src/alphabet/SymbolToStringComposer.h +++ b/alib2/src/alphabet/SymbolToStringComposer.h @@ -18,7 +18,7 @@ namespace alphabet { /** * This class contains methods to print XML representation of string to the output stream. */ -class SymbolToStringComposer : public Symbol::visitor_type, public SymbolBase::visitor_type { +class SymbolToStringComposer : public SymbolBase::visitor_type { void Visit(void*, const label::Label& label); void Visit(void*, const Symbol& symbol); void Visit(void*, const LabeledSymbol& symbol); diff --git a/alib2/src/alphabet/SymbolToXMLComposer.cpp b/alib2/src/alphabet/SymbolToXMLComposer.cpp index 3eabc5243ef13c2eaae686f73a33b0442da44693..13ec4c900da216522ec3f74a785e46107664e390 100644 --- a/alib2/src/alphabet/SymbolToXMLComposer.cpp +++ b/alib2/src/alphabet/SymbolToXMLComposer.cpp @@ -10,20 +10,20 @@ namespace alphabet { -void SymbolToXMLComposer::Visit(void* userData, const label::Label& label) { +void SymbolToXMLComposer::Visit(void* userData, const label::Label& label) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token((std::string) label, sax::Token::CHARACTER)); } -void SymbolToXMLComposer::Visit(void* userData, const BlankSymbol&) { +void SymbolToXMLComposer::Visit(void* userData, const BlankSymbol&) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("BlankSymbol", sax::Token::START_ELEMENT)); out.push_back(sax::Token("BlankSymbol", sax::Token::END_ELEMENT)); } -void SymbolToXMLComposer::Visit(void* userData, const LabeledSymbol& symbol) { +void SymbolToXMLComposer::Visit(void* userData, const LabeledSymbol& symbol) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("LabeledSymbol", sax::Token::START_ELEMENT)); @@ -31,12 +31,12 @@ void SymbolToXMLComposer::Visit(void* userData, const LabeledSymbol& symbol) { out.push_back(sax::Token("LabeledSymbol", sax::Token::END_ELEMENT)); } -void SymbolToXMLComposer::Visit(void* userData, const Symbol& symbol) { +void SymbolToXMLComposer::Visit(void* userData, const Symbol& symbol) const { symbol.getSymbol().Accept(userData, *this); } -std::list<sax::Token> SymbolToXMLComposer::compose(const Symbol& symbol) { +std::list<sax::Token> SymbolToXMLComposer::compose(const Symbol& symbol) const { std::list<sax::Token> out; Visit((void*) &out, symbol); return out; diff --git a/alib2/src/alphabet/SymbolToXMLComposer.h b/alib2/src/alphabet/SymbolToXMLComposer.h index df5019e2ada08030b7d62107bd09f98f363f39d9..75829d68c256f1b250d17364fa4d3c9f8fbb6e83 100644 --- a/alib2/src/alphabet/SymbolToXMLComposer.h +++ b/alib2/src/alphabet/SymbolToXMLComposer.h @@ -18,11 +18,11 @@ namespace alphabet { /** * This class contains methods to print XML representation of string to the output stream. */ -class SymbolToXMLComposer : public Symbol::visitor_type, public SymbolBase::visitor_type { - void Visit(void*, const label::Label& slabel); - void Visit(void*, const Symbol& symbol); - void Visit(void*, const LabeledSymbol& symbol); - void Visit(void*, const BlankSymbol& symbol); +class SymbolToXMLComposer : public SymbolBase::const_visitor_type { + void Visit(void*, const label::Label& slabel) const; + void Visit(void*, const Symbol& symbol) const; + void Visit(void*, const LabeledSymbol& symbol) const; + void Visit(void*, const BlankSymbol& symbol) const; public: /** @@ -30,7 +30,7 @@ public: * @param string String to print * @param out output stream to which print the String */ - std::list<sax::Token> compose(const Symbol& symbol); + std::list<sax::Token> compose(const Symbol& symbol) const; }; } /* namespace alphabet */ diff --git a/alib2/src/automaton/Automaton.h b/alib2/src/automaton/Automaton.h index cdcfd09db4e7b6231e98c58324dc2800396080b3..4c9e0b8d0142010195c2bee4efff7cde2f8e16cc 100644 --- a/alib2/src/automaton/Automaton.h +++ b/alib2/src/automaton/Automaton.h @@ -16,7 +16,7 @@ namespace automaton { /** * Wrapper around automata. */ -class Automaton : public std::element<Automaton, std::visitor<Automaton> > { +class Automaton { protected: AutomatonBase* automaton; public: diff --git a/alib2/src/automaton/AutomatonBase.h b/alib2/src/automaton/AutomatonBase.h index aac5328d60572e5aeeba06598bee839baf7887f5..bc669805ea060e066e02b2cfa80f3d90b7b012c7 100644 --- a/alib2/src/automaton/AutomatonBase.h +++ b/alib2/src/automaton/AutomatonBase.h @@ -9,6 +9,7 @@ #define AUTOMATON_BASE_H_ #include "../std/visitor.hpp" +#include <iostream> namespace automaton { @@ -24,7 +25,7 @@ class OneTapeDTM; /** * Abstract base class for all automata. */ -class AutomatonBase : virtual public std::elementBase<std::visitor<UnknownAutomaton, DFA, NFA, EpsilonNFA, CompactNFA, ExtendedNFA, PDA, OneTapeDTM> > { +class AutomatonBase : virtual public std::elementBase<UnknownAutomaton, DFA, NFA, EpsilonNFA, CompactNFA, ExtendedNFA, PDA, OneTapeDTM> { public: virtual AutomatonBase* clone() const = 0; diff --git a/alib2/src/automaton/AutomatonToXMLComposer.cpp b/alib2/src/automaton/AutomatonToXMLComposer.cpp index f90fdfbbb76611c93155cc39a3a41e3916393972..5fff45b7c9f078fdecd771b2e872dee2798d4be1 100644 --- a/alib2/src/automaton/AutomatonToXMLComposer.cpp +++ b/alib2/src/automaton/AutomatonToXMLComposer.cpp @@ -10,7 +10,7 @@ namespace automaton { -void AutomatonToXMLComposer::printStates(std::list<sax::Token>& out, const std::set<State>& states, std::string tagName) { +void AutomatonToXMLComposer::printStates(std::list<sax::Token>& out, const std::set<State>& states, std::string tagName) const { out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT)); for (auto& state : states) { printState(out, state, "state"); @@ -18,7 +18,7 @@ void AutomatonToXMLComposer::printStates(std::list<sax::Token>& out, const std:: out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT)); } -void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std::set<alphabet::Symbol>& symbols, std::string tagName) { +void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std::set<alphabet::Symbol>& symbols, std::string tagName) const { out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT)); for (auto& symbol : symbols) { printSymbol(out, symbol, "symbol"); @@ -26,7 +26,7 @@ void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std: out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT)); } -void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols, std::string tagName) { +void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols, std::string tagName) const { out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT)); for (auto& symbol : symbols) { printSymbol(out, symbol, "symbol"); @@ -34,13 +34,13 @@ void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std: out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT)); } -void AutomatonToXMLComposer::printShift(std::list<sax::Token>& out, const Shift shift, std::string tagName) { +void AutomatonToXMLComposer::printShift(std::list<sax::Token>& out, const Shift shift, std::string tagName) const { out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT)); out.push_back(sax::Token(SHIFT_NAMES [shift], sax::Token::CHARACTER)); out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT)); } -void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const UnknownAutomaton& automaton) { +void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const UnknownAutomaton& automaton) const { out.push_back(sax::Token("transitions", sax::Token::START_ELEMENT)); for (auto& transition : automaton.getTransitions()) { out.push_back(sax::Token("transition", sax::Token::START_ELEMENT)); @@ -73,7 +73,7 @@ void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const } -void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const DFA& automaton) { +void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const DFA& automaton) const { out.push_back(sax::Token("transitions", sax::Token::START_ELEMENT)); for(auto& transition : automaton.getTransitions()) { out.push_back(sax::Token("transition", sax::Token::START_ELEMENT)); @@ -88,7 +88,7 @@ void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const out.push_back(sax::Token("transitions", sax::Token::END_ELEMENT)); } -void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const NFA& automaton) { +void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const NFA& automaton) const { out.push_back(sax::Token("transitions", sax::Token::START_ELEMENT)); for(auto& transition : automaton.getTransitions()) { for(auto& targetState: transition.second) { @@ -105,7 +105,7 @@ void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const out.push_back(sax::Token("transitions", sax::Token::END_ELEMENT)); } -void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const EpsilonNFA& automaton) { +void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const EpsilonNFA& automaton) const { out.push_back(sax::Token("transitions", sax::Token::START_ELEMENT)); for(auto& transition : automaton.getTransitions()) { for(auto& targetState: transition.second) { @@ -122,19 +122,19 @@ void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const out.push_back(sax::Token("transitions", sax::Token::END_ELEMENT)); } -void AutomatonToXMLComposer::printState(std::list<sax::Token>& out, const State& state, std::string tagName) { +void AutomatonToXMLComposer::printState(std::list<sax::Token>& out, const State& state, std::string tagName) const { out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT)); out.push_back(sax::Token(state.getName(), sax::Token::CHARACTER)); out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT)); } -void AutomatonToXMLComposer::printInput(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName) { +void AutomatonToXMLComposer::printInput(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName) const { out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT)); out.push_back(sax::Token((std::string) symbol, sax::Token::CHARACTER)); out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT)); } -void AutomatonToXMLComposer::printInput(std::list<sax::Token>& out, const std::variant<string::Epsilon, alphabet::Symbol>& symbol, std::string tagName) { +void AutomatonToXMLComposer::printInput(std::list<sax::Token>& out, const std::variant<string::Epsilon, alphabet::Symbol>& symbol, std::string tagName) const { out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT)); if(symbol.is<string::Epsilon>()) { out.push_back(sax::Token("epsilon", sax::Token::START_ELEMENT)); @@ -148,7 +148,7 @@ void AutomatonToXMLComposer::printInput(std::list<sax::Token>& out, const std::v out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT)); } -void AutomatonToXMLComposer::printSymbol(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName) { +void AutomatonToXMLComposer::printSymbol(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName) const { out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT)); if(symbol.getSymbol() == alphabet::BlankSymbol::BLANK) { out.push_back(sax::Token("blank", sax::Token::START_ELEMENT)); @@ -159,13 +159,13 @@ void AutomatonToXMLComposer::printSymbol(std::list<sax::Token>& out, const alpha out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT)); } -std::list<sax::Token> AutomatonToXMLComposer::compose(const AutomatonBase& automaton) { +std::list<sax::Token> AutomatonToXMLComposer::compose(const AutomatonBase& automaton) const { std::list<sax::Token> out; automaton.Accept((void*) &out, *this); return out; } -std::list<sax::Token> AutomatonToXMLComposer::compose(const UnknownAutomaton& automaton) { +std::list<sax::Token> AutomatonToXMLComposer::compose(const UnknownAutomaton& automaton) const { std::list<sax::Token> out; out.push_back(sax::Token("automaton", sax::Token::START_ELEMENT)); @@ -200,7 +200,7 @@ std::list<sax::Token> AutomatonToXMLComposer::compose(const UnknownAutomaton& au return out; } -std::list<sax::Token> AutomatonToXMLComposer::compose(const DFA& automaton) { +std::list<sax::Token> AutomatonToXMLComposer::compose(const DFA& automaton) const { std::list<sax::Token> out; out.push_back(sax::Token("DFA", sax::Token::START_ELEMENT)); @@ -214,7 +214,7 @@ std::list<sax::Token> AutomatonToXMLComposer::compose(const DFA& automaton) { return out; } -std::list<sax::Token> AutomatonToXMLComposer::compose(const NFA& automaton) { +std::list<sax::Token> AutomatonToXMLComposer::compose(const NFA& automaton) const { std::list<sax::Token> out; out.push_back(sax::Token("NFA", sax::Token::START_ELEMENT)); @@ -228,7 +228,7 @@ std::list<sax::Token> AutomatonToXMLComposer::compose(const NFA& automaton) { return out; } -std::list<sax::Token> AutomatonToXMLComposer::compose(const EpsilonNFA& automaton) { +std::list<sax::Token> AutomatonToXMLComposer::compose(const EpsilonNFA& automaton) const { std::list<sax::Token> out; out.push_back(sax::Token("EpsilonNFA", sax::Token::START_ELEMENT)); @@ -242,67 +242,67 @@ std::list<sax::Token> AutomatonToXMLComposer::compose(const EpsilonNFA& automato return out; } -std::list<sax::Token> AutomatonToXMLComposer::compose(const ExtendedNFA& automaton) { +std::list<sax::Token> AutomatonToXMLComposer::compose(const ExtendedNFA& automaton) const { std::list<sax::Token> out; return out; } -std::list<sax::Token> AutomatonToXMLComposer::compose(const CompactNFA& automaton) { +std::list<sax::Token> AutomatonToXMLComposer::compose(const CompactNFA& automaton) const { std::list<sax::Token> out; return out; } -std::list<sax::Token> AutomatonToXMLComposer::compose(const PDA& automaton) { +std::list<sax::Token> AutomatonToXMLComposer::compose(const PDA& automaton) const { std::list<sax::Token> out; return out; } -std::list<sax::Token> AutomatonToXMLComposer::compose(const OneTapeDTM& automaton) { +std::list<sax::Token> AutomatonToXMLComposer::compose(const OneTapeDTM& automaton) const { std::list<sax::Token> out; return out; } -std::list<sax::Token> AutomatonToXMLComposer::compose(const Automaton& automaton) { +std::list<sax::Token> AutomatonToXMLComposer::compose(const Automaton& automaton) const { std::list<sax::Token> out; - automaton.Accept((void*) &out, *this); + automaton.getAutomaton().Accept((void*) &out, *this); return out; } -void AutomatonToXMLComposer::Visit(void* data, const Automaton& automaton) { +void AutomatonToXMLComposer::Visit(void* data, const Automaton& automaton) const { *((std::list<sax::Token>*) data) = this->compose(automaton); } -void AutomatonToXMLComposer::Visit(void* data, const UnknownAutomaton& automaton) { +void AutomatonToXMLComposer::Visit(void* data, const UnknownAutomaton& automaton) const { *((std::list<sax::Token>*) data) = this->compose(automaton); } -void AutomatonToXMLComposer::Visit(void* data, const EpsilonNFA& automaton) { +void AutomatonToXMLComposer::Visit(void* data, const EpsilonNFA& automaton) const { *((std::list<sax::Token>*) data) = this->compose(automaton); } -void AutomatonToXMLComposer::Visit(void* data, const NFA& automaton) { +void AutomatonToXMLComposer::Visit(void* data, const NFA& automaton) const { *((std::list<sax::Token>*) data) = this->compose(automaton); } -void AutomatonToXMLComposer::Visit(void* data, const DFA& automaton) { +void AutomatonToXMLComposer::Visit(void* data, const DFA& automaton) const { *((std::list<sax::Token>*) data) = this->compose(automaton); } -void AutomatonToXMLComposer::Visit(void* data, const ExtendedNFA& automaton) { +void AutomatonToXMLComposer::Visit(void* data, const ExtendedNFA& automaton) const { *((std::list<sax::Token>*) data) = this->compose(automaton); } -void AutomatonToXMLComposer::Visit(void* data, const CompactNFA& automaton) { - *((std::list<sax::Token>*) data) = this->compose(automaton);; +void AutomatonToXMLComposer::Visit(void* data, const CompactNFA& automaton) const { + *((std::list<sax::Token>*) data) = this->compose(automaton); } -void AutomatonToXMLComposer::Visit(void* data, const PDA& automaton) { - *((std::list<sax::Token>*) data) = this->compose(automaton);; +void AutomatonToXMLComposer::Visit(void* data, const PDA& automaton) const { + *((std::list<sax::Token>*) data) = this->compose(automaton); } -void AutomatonToXMLComposer::Visit(void* data, const OneTapeDTM& automaton) { - *((std::list<sax::Token>*) data) = this->compose(automaton);; +void AutomatonToXMLComposer::Visit(void* data, const OneTapeDTM& automaton) const { + *((std::list<sax::Token>*) data) = this->compose(automaton); } } /* namespace automaton */ diff --git a/alib2/src/automaton/AutomatonToXMLComposer.h b/alib2/src/automaton/AutomatonToXMLComposer.h index 06e3430bdd470db833d19e3eac78e441f540c864..6ccaf9ea4f571ef4190b9613f7d851559a6b40b2 100644 --- a/alib2/src/automaton/AutomatonToXMLComposer.h +++ b/alib2/src/automaton/AutomatonToXMLComposer.h @@ -22,32 +22,32 @@ namespace automaton { /** * This class contains methods to print XML representation of automata to the output stream. */ -class AutomatonToXMLComposer : public Automaton::visitor_type, public AutomatonBase::visitor_type { - void Visit(void*, const Automaton& automaton); - void Visit(void*, const UnknownAutomaton& automaton); - void Visit(void*, const EpsilonNFA& automaton); - void Visit(void*, const NFA& automaton); - void Visit(void*, const DFA& automaton); - void Visit(void*, const ExtendedNFA& automaton); - void Visit(void*, const CompactNFA& automaton); - void Visit(void*, const PDA& automaton); - void Visit(void*, const OneTapeDTM& automaton); +class AutomatonToXMLComposer : public AutomatonBase::const_visitor_type { + void Visit(void*, const Automaton& automaton) const; + void Visit(void*, const UnknownAutomaton& automaton) const; + void Visit(void*, const EpsilonNFA& automaton) const; + void Visit(void*, const NFA& automaton) const; + void Visit(void*, const DFA& automaton) const; + void Visit(void*, const ExtendedNFA& automaton) const; + void Visit(void*, const CompactNFA& automaton) const; + void Visit(void*, const PDA& automaton) const; + void Visit(void*, const OneTapeDTM& automaton) const; protected: - static void printStates(std::list<sax::Token>&, const std::set<State>& states, std::string tagName); - static void printSymbols(std::list<sax::Token>&, const std::set<alphabet::Symbol>& symbols, std::string tagName); - static void printSymbols(std::list<sax::Token>&, const std::vector<alphabet::Symbol>& symbols, std::string tagName); - static void printShift(std::list<sax::Token>&, const Shift shift, std::string tagName); + void printStates(std::list<sax::Token>&, const std::set<State>& states, std::string tagName) const; + void printSymbols(std::list<sax::Token>&, const std::set<alphabet::Symbol>& symbols, std::string tagName) const; + void printSymbols(std::list<sax::Token>&, const std::vector<alphabet::Symbol>& symbols, std::string tagName) const; + void printShift(std::list<sax::Token>&, const Shift shift, std::string tagName) const; - static void printTransitions(std::list<sax::Token>&, const UnknownAutomaton& automaton); - static void printTransitions(std::list<sax::Token>&, const EpsilonNFA& automaton); - static void printTransitions(std::list<sax::Token>&, const NFA& automaton); - static void printTransitions(std::list<sax::Token>&, const DFA& automaton); + void printTransitions(std::list<sax::Token>&, const UnknownAutomaton& automaton) const; + void printTransitions(std::list<sax::Token>&, const EpsilonNFA& automaton) const; + void printTransitions(std::list<sax::Token>&, const NFA& automaton) const; + void printTransitions(std::list<sax::Token>&, const DFA& automaton) const; - static void printState(std::list<sax::Token>&, const State& state, std::string tagName); - static void printSymbol(std::list<sax::Token>&, const alphabet::Symbol& symbol, std::string tagName); - static void printInput(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName); - static void printInput(std::list<sax::Token>&, const std::variant<string::Epsilon, alphabet::Symbol>&, std::string); + void printState(std::list<sax::Token>&, const State& state, std::string tagName) const; + void printSymbol(std::list<sax::Token>&, const alphabet::Symbol& symbol, std::string tagName) const; + void printInput(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName) const; + void printInput(std::list<sax::Token>&, const std::variant<string::Epsilon, alphabet::Symbol>&, std::string) const; public: /** @@ -55,18 +55,18 @@ public: * @param automaton automaton to print * @return list of xml tokens representing the automaton */ - std::list<sax::Token> compose(const AutomatonBase& automaton); + std::list<sax::Token> compose(const AutomatonBase& automaton) const; - std::list<sax::Token> compose(const Automaton& automaton); + std::list<sax::Token> compose(const Automaton& automaton) const; - std::list<sax::Token> compose(const UnknownAutomaton& automaton); - std::list<sax::Token> compose(const DFA& automaton); - std::list<sax::Token> compose(const NFA& automaton); - std::list<sax::Token> compose(const EpsilonNFA& automaton); - std::list<sax::Token> compose(const ExtendedNFA& automaton); - std::list<sax::Token> compose(const CompactNFA& automaton); - std::list<sax::Token> compose(const PDA& automaton); - std::list<sax::Token> compose(const OneTapeDTM& automaton); + std::list<sax::Token> compose(const UnknownAutomaton& automaton) const; + std::list<sax::Token> compose(const DFA& automaton) const; + std::list<sax::Token> compose(const NFA& automaton) const; + std::list<sax::Token> compose(const EpsilonNFA& automaton) const; + std::list<sax::Token> compose(const ExtendedNFA& automaton) const; + std::list<sax::Token> compose(const CompactNFA& automaton) const; + std::list<sax::Token> compose(const PDA& automaton) const; + std::list<sax::Token> compose(const OneTapeDTM& automaton) const; }; } /* namespace automaton */ diff --git a/alib2/src/automaton/FSM/CompactNFA.cpp b/alib2/src/automaton/FSM/CompactNFA.cpp index f9fe803140a222fc2a3aebd90be274497890a8dc..e415f46bed89234ec6a8912d7fea502a4bfbeb2a 100644 --- a/alib2/src/automaton/FSM/CompactNFA.cpp +++ b/alib2/src/automaton/FSM/CompactNFA.cpp @@ -60,13 +60,13 @@ bool CompactNFA::addTransition(const State& from, const string::String& input, c if (states.find(to) == states.end()) throw AutomatonException("State \"" + to.getName() + "\" doesn't exist."); - std::pair<State, string::String> key = make_pair(from, input); + std::pair<State, string::String> key = std::make_pair(from, input); return transitions[key].insert(to).second; } bool CompactNFA::removeTransition(const State& from, const string::String& input, const State& to) { - std::pair<State, string::String> key = make_pair(from, input); + std::pair<State, string::String> key = std::make_pair(from, input); return transitions[key].erase(to); } diff --git a/alib2/src/automaton/FSM/CompactNFA.h b/alib2/src/automaton/FSM/CompactNFA.h index 6e6b498a242806fe180ab888588a93bbbc83c085..9c257058818a0ffc74c1a1f8323c31792942c370 100644 --- a/alib2/src/automaton/FSM/CompactNFA.h +++ b/alib2/src/automaton/FSM/CompactNFA.h @@ -20,7 +20,7 @@ namespace automaton { * Represents Finite Automaton. * Can store nondeterministic finite automaton without epsilon transitions. */ -class CompactNFA : public AutomatonBase, public std::element<CompactNFA, AutomatonBase::visitor_type>, public MultiInitialStates, public InputAlphabet { +class CompactNFA : virtual public AutomatonBase, public std::element<CompactNFA, AutomatonBase>, public MultiInitialStates, public InputAlphabet { protected: std::map<std::pair<State, string::String>, std::set<State> > transitions; public: diff --git a/alib2/src/automaton/FSM/DFA.h b/alib2/src/automaton/FSM/DFA.h index 59952216a0604124ece32a250e1fdef86d3acf25..03a2a203da2deddf750f477c2561494ae04993f3 100644 --- a/alib2/src/automaton/FSM/DFA.h +++ b/alib2/src/automaton/FSM/DFA.h @@ -20,7 +20,7 @@ namespace automaton { * Represents Finite Automaton. * Can store nondeterministic finite automaton without epsilon transitions. */ -class DFA : public AutomatonBase, public std::element<DFA, AutomatonBase::visitor_type>, public SingleInitialState, public InputAlphabet { +class DFA : virtual public AutomatonBase, public std::element<DFA, AutomatonBase>, public SingleInitialState, public InputAlphabet { protected: std::map<std::pair<State, alphabet::Symbol>, State> transitions; public: diff --git a/alib2/src/automaton/FSM/EpsilonNFA.h b/alib2/src/automaton/FSM/EpsilonNFA.h index 09398a52d91ff4823a402cf3547b9f7bf412f86e..61fa4c44fc7df0dc725c4517dfc1aa0db04a8fe3 100644 --- a/alib2/src/automaton/FSM/EpsilonNFA.h +++ b/alib2/src/automaton/FSM/EpsilonNFA.h @@ -22,7 +22,7 @@ namespace automaton { * Represents Finite Automaton. * Can store nondeterministic finite automaton with epsilon transitions. */ -class EpsilonNFA : public AutomatonBase, public std::element<EpsilonNFA, AutomatonBase::visitor_type>, public MultiInitialStates, public InputAlphabet { +class EpsilonNFA : virtual public AutomatonBase, public std::element<EpsilonNFA, AutomatonBase>, public MultiInitialStates, public InputAlphabet { protected: std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> >, std::set<State> > transitions; public: diff --git a/alib2/src/automaton/FSM/ExtendedNFA.cpp b/alib2/src/automaton/FSM/ExtendedNFA.cpp index 315a312c1229f5fe14e018e4b8671fe060ad2446..92cfd5f787f48b5cbb0e09bb6d72d3fd7294ec9e 100644 --- a/alib2/src/automaton/FSM/ExtendedNFA.cpp +++ b/alib2/src/automaton/FSM/ExtendedNFA.cpp @@ -60,13 +60,13 @@ bool ExtendedNFA::addTransition(const State& from, const regexp::RegExp& input, if (states.find(to) == states.end()) throw AutomatonException("State \"" + to.getName() + "\" doesn't exist."); - std::pair<State, regexp::RegExp> key = make_pair(from, input); + std::pair<State, regexp::RegExp> key = std::make_pair(from, input); return transitions[key].insert(to).second; } bool ExtendedNFA::removeTransition(const State& from, const regexp::RegExp& input, const State& to) { - std::pair<State, regexp::RegExp> key = make_pair(from, input); + std::pair<State, regexp::RegExp> key = std::make_pair(from, input); return transitions[key].erase(to); } diff --git a/alib2/src/automaton/FSM/ExtendedNFA.h b/alib2/src/automaton/FSM/ExtendedNFA.h index dfcb73fd9b04344342772027add41171118e4694..b3715bd4f858cfd903f68efcb66687d55cc17284 100644 --- a/alib2/src/automaton/FSM/ExtendedNFA.h +++ b/alib2/src/automaton/FSM/ExtendedNFA.h @@ -20,7 +20,7 @@ namespace automaton { * Represents Finite Automaton. * Can store nondeterministic finite automaton without epsilon transitions. */ -class ExtendedNFA : public AutomatonBase, public std::element<ExtendedNFA, AutomatonBase::visitor_type>, public MultiInitialStates, public InputAlphabet { +class ExtendedNFA : virtual public AutomatonBase, public std::element<ExtendedNFA, AutomatonBase>, public MultiInitialStates, public InputAlphabet { protected: std::map<std::pair<State, regexp::RegExp>, std::set<State> > transitions; public: diff --git a/alib2/src/automaton/FSM/NFA.h b/alib2/src/automaton/FSM/NFA.h index 11a0acb2e1232c65ddba527c34f7c2181b7d6d12..6ac9bca3afc4c0a97e181b63775eaf0c788bf126 100644 --- a/alib2/src/automaton/FSM/NFA.h +++ b/alib2/src/automaton/FSM/NFA.h @@ -21,7 +21,7 @@ namespace automaton { * Represents Finite Automaton. * Can store nondeterministic finite automaton without epsilon transitions. */ -class NFA : public AutomatonBase, public std::element<NFA, AutomatonBase::visitor_type>, public MultiInitialStates, public InputAlphabet { +class NFA : virtual public AutomatonBase, public std::element<NFA, AutomatonBase>, public MultiInitialStates, public InputAlphabet { protected: std::map<std::pair<State, alphabet::Symbol>, std::set<State> > transitions; public: diff --git a/alib2/src/automaton/PDA/PDA.h b/alib2/src/automaton/PDA/PDA.h index 2594295d00b3ec9e4151071846147f6ad89f09c2..125097599decf844a25be9c26ced46f9575033e1 100644 --- a/alib2/src/automaton/PDA/PDA.h +++ b/alib2/src/automaton/PDA/PDA.h @@ -23,7 +23,7 @@ namespace automaton { /** * Push Down Automaton */ -class PDA: public AutomatonBase, public std::element<PDA, AutomatonBase::visitor_type>, public MultiInitialStates, public InputAlphabet { +class PDA: virtual public AutomatonBase, public std::element<PDA, AutomatonBase>, public MultiInitialStates, public InputAlphabet { protected: std::set<alphabet::Symbol> stackAlphabet; std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > > transitions; diff --git a/alib2/src/automaton/TM/OneTapeDTM.h b/alib2/src/automaton/TM/OneTapeDTM.h index b6963eb07ebf0ab954f9a0169aa0e83ba29809c5..ae9b995a0aa7ec92c48ba0b49aadfae27e7ac3f8 100644 --- a/alib2/src/automaton/TM/OneTapeDTM.h +++ b/alib2/src/automaton/TM/OneTapeDTM.h @@ -22,7 +22,7 @@ namespace automaton { /** * One tape turing machine */ -class OneTapeDTM : public AutomatonBase, public std::element<OneTapeDTM, AutomatonBase::visitor_type>, public SingleInitialState, public BlankSymbolInputTapeAlphabet { +class OneTapeDTM : virtual public AutomatonBase, public std::element<OneTapeDTM, AutomatonBase>, public SingleInitialState, public BlankSymbolInputTapeAlphabet { protected: std::map<std::pair<State, alphabet::Symbol>, std::tuple<State, alphabet::Symbol, Shift> > transitions; diff --git a/alib2/src/automaton/UnknownAutomaton.h b/alib2/src/automaton/UnknownAutomaton.h index e6a2304f4b629388a6dc65f65eff808c1ca15ea1..63ddcc95bc5a91efccb937280cf3b9a58cdc7919 100644 --- a/alib2/src/automaton/UnknownAutomaton.h +++ b/alib2/src/automaton/UnknownAutomaton.h @@ -21,7 +21,7 @@ namespace automaton { /** * Class representing unknown automaton parsed from XML. */ -class UnknownAutomaton : public AutomatonBase, public std::element<UnknownAutomaton, AutomatonBase::visitor_type> { +class UnknownAutomaton : virtual public AutomatonBase, public std::element<UnknownAutomaton, AutomatonBase> { protected: std::set<State> states; std::set<State> initialStates; diff --git a/alib2/src/factory/AutomatonFactory.cpp b/alib2/src/factory/AutomatonFactory.cpp index 0a2c5b53641a351ee596c9a77b2fc876ae73aca5..62b8136a46a1641a1eb94bc350dcf14e4c213a7a 100644 --- a/alib2/src/factory/AutomatonFactory.cpp +++ b/alib2/src/factory/AutomatonFactory.cpp @@ -79,8 +79,7 @@ void AutomatonFactory::toStream(const AutomatonBase& automaton, std::ostream& ou } std::list<sax::Token> AutomatonFactory::compose(const AutomatonBase& automaton) { - AutomatonToXMLComposer composer; - return composer.compose(automaton); + return alib::ToXMLComposers::automatonComposer.compose(automaton); } } /* namespace automaton */ diff --git a/alib2/src/label/IntegerLabel.h b/alib2/src/label/IntegerLabel.h index 6e41d55b81f1467d20ea61e5eb0d3107b43bf3f2..e18da16d5c40154479cfda6f221ac3e3ffbcd755 100644 --- a/alib2/src/label/IntegerLabel.h +++ b/alib2/src/label/IntegerLabel.h @@ -17,7 +17,7 @@ namespace label { /** * Represents symbol in an alphabet. */ -class IntegerLabel : public LabelBase, public std::element<IntegerLabel, LabelBase::visitor_type>{ +class IntegerLabel : virtual public LabelBase, public std::element<IntegerLabel, LabelBase>{ protected: int label; public: diff --git a/alib2/src/label/Label.h b/alib2/src/label/Label.h index 8ad0a161282413c40d4139295909d44f6a4e3cfc..608c44043320d0fccc48fa4b67baafee51aa05f5 100644 --- a/alib2/src/label/Label.h +++ b/alib2/src/label/Label.h @@ -16,7 +16,7 @@ namespace label { /** * Wrapper around automata. */ -class Label : public std::element<Label, std::visitor<Label> > { +class Label { protected: LabelBase* label; public: diff --git a/alib2/src/label/LabelBase.h b/alib2/src/label/LabelBase.h index 0e7a04b15f1c3511d7d168ca577b63067f905c71..09441357075eb81bb97088a74660dc483a8acd14 100644 --- a/alib2/src/label/LabelBase.h +++ b/alib2/src/label/LabelBase.h @@ -9,6 +9,7 @@ #define LABEL_BASE_H_ #include "../std/visitor.hpp" +#include <iostream> namespace label { @@ -18,7 +19,7 @@ class IntegerLabel; /** * Abstract base class for all automata. */ -class LabelBase : virtual public std::elementBase<std::visitor<StringLabel, IntegerLabel> > { +class LabelBase : public std::elementBase<StringLabel, IntegerLabel> { public: virtual LabelBase* clone() const = 0; diff --git a/alib2/src/label/LabelToStringComposer.h b/alib2/src/label/LabelToStringComposer.h index 414885ee9d6ad93857f378a77a4fe6eb296b5e37..4ca9954035a3d060568c914410211d22f934a263 100644 --- a/alib2/src/label/LabelToStringComposer.h +++ b/alib2/src/label/LabelToStringComposer.h @@ -18,7 +18,7 @@ namespace label { /** * This class contains methods to print XML representation of string to the output stream. */ -class LabelToStringComposer : public Label::visitor_type, public LabelBase::visitor_type { +class LabelToStringComposer : public LabelBase::visitor_type { void Visit(void*, const Label& label); void Visit(void*, const IntegerLabel& label); void Visit(void*, const StringLabel& label); diff --git a/alib2/src/label/LabelToXMLComposer.cpp b/alib2/src/label/LabelToXMLComposer.cpp index be4d4bd141666115ad2e2ed05abd56fbf5b95a66..229737171d1780d74ebdaa5e1afb3594f376f850 100644 --- a/alib2/src/label/LabelToXMLComposer.cpp +++ b/alib2/src/label/LabelToXMLComposer.cpp @@ -12,7 +12,7 @@ namespace label { -void LabelToXMLComposer::Visit(void* userData, const IntegerLabel& label) { +void LabelToXMLComposer::Visit(void* userData, const IntegerLabel& label) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("IntegerLabel", sax::Token::START_ELEMENT)); @@ -20,7 +20,7 @@ void LabelToXMLComposer::Visit(void* userData, const IntegerLabel& label) { out.push_back(sax::Token("IntegerLabel", sax::Token::END_ELEMENT)); } -void LabelToXMLComposer::Visit(void* userData, const StringLabel& label) { +void LabelToXMLComposer::Visit(void* userData, const StringLabel& label) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("StringLabel", sax::Token::START_ELEMENT)); @@ -28,12 +28,12 @@ void LabelToXMLComposer::Visit(void* userData, const StringLabel& label) { out.push_back(sax::Token("StringLabel", sax::Token::END_ELEMENT)); } -void LabelToXMLComposer::Visit(void* userData, const Label& label) { +void LabelToXMLComposer::Visit(void* userData, const Label& label) const { label.getLabel().Accept(userData, *this); } -std::list<sax::Token> LabelToXMLComposer::compose(const Label& label) { +std::list<sax::Token> LabelToXMLComposer::compose(const Label& label) const { std::list<sax::Token> out; Visit((void*) &out, label); return out; diff --git a/alib2/src/label/LabelToXMLComposer.h b/alib2/src/label/LabelToXMLComposer.h index 4c86edeadb73cabb3135f9ac9f3d9cc1940614c9..740ce6910813da12b91fe58836a7cce750d5a3b0 100644 --- a/alib2/src/label/LabelToXMLComposer.h +++ b/alib2/src/label/LabelToXMLComposer.h @@ -17,10 +17,10 @@ namespace label { /** * This class contains methods to print XML representation of string to the output stream. */ -class LabelToXMLComposer : public Label::visitor_type, public LabelBase::visitor_type { - void Visit(void*, const Label& label); - void Visit(void*, const StringLabel& label); - void Visit(void*, const IntegerLabel& label); +class LabelToXMLComposer : public LabelBase::const_visitor_type { + void Visit(void*, const Label& label) const; + void Visit(void*, const StringLabel& label) const; + void Visit(void*, const IntegerLabel& label) const; public: /** @@ -28,7 +28,7 @@ public: * @param string String to print * @param out output stream to which print the String */ - std::list<sax::Token> compose(const Label& label); + std::list<sax::Token> compose(const Label& label) const; }; } /* namespace label */ diff --git a/alib2/src/label/StringLabel.h b/alib2/src/label/StringLabel.h index e1d14f17a1201cffe540898c3665dd59a676a369..925a79781fda3928c71f4e69e104c1f4f7353579 100644 --- a/alib2/src/label/StringLabel.h +++ b/alib2/src/label/StringLabel.h @@ -18,7 +18,7 @@ namespace label { /** * Represents symbol in an alphabet. */ -class StringLabel : public LabelBase, public std::element<StringLabel, LabelBase::visitor_type>{ +class StringLabel : virtual public LabelBase, public std::element<StringLabel, LabelBase>{ protected: std::string label; public: diff --git a/alib2/src/regexp/Alternation.h b/alib2/src/regexp/Alternation.h index 8d6b1498c25edfa5f17b64759e7ab97363d5a71c..26fb5df53860cac7d3c8c54b64a382c11b9fc968 100644 --- a/alib2/src/regexp/Alternation.h +++ b/alib2/src/regexp/Alternation.h @@ -17,7 +17,7 @@ namespace regexp { * Represents alternation operator in the regular expression. Contains list of RegExpElement * as operands of the operator. */ -class Alternation: public RegExpElement, public std::element<Alternation, RegExpElement::visitor_type> { +class Alternation: virtual public RegExpElement, public std::element<Alternation, RegExpElement> { protected: /** * @copydoc RegExpElement::clone() const diff --git a/alib2/src/regexp/Concatenation.h b/alib2/src/regexp/Concatenation.h index de3430d129ab9671f804fb0cd5f0a10571669335..7aad061167a961c7f0134355842b9f25cdbf474e 100644 --- a/alib2/src/regexp/Concatenation.h +++ b/alib2/src/regexp/Concatenation.h @@ -17,7 +17,7 @@ namespace regexp { * Represents concatenation operator in the regular expression. Contains list of RegExpElement * as operands of the operator. */ -class Concatenation: public RegExpElement, public std::element<Concatenation, RegExpElement::visitor_type> { +class Concatenation: virtual public RegExpElement, public std::element<Concatenation, RegExpElement> { protected: /** * @copydoc RegExpElement::clone() const diff --git a/alib2/src/regexp/Iteration.h b/alib2/src/regexp/Iteration.h index 18d226158c1d5cddb8ca4f55e236cc7809f8ea32..fb3ef21d3f14e68a80018bef5b7be32535873820 100644 --- a/alib2/src/regexp/Iteration.h +++ b/alib2/src/regexp/Iteration.h @@ -17,7 +17,7 @@ namespace regexp { * Represents iteration operator in the regular expression. Contains one RegExpElement * as operand. */ -class Iteration: public RegExpElement, public std::element<Iteration, RegExpElement::visitor_type> { +class Iteration: virtual public RegExpElement, public std::element<Iteration, RegExpElement> { protected: RegExpElement* element; diff --git a/alib2/src/regexp/RegExp.h b/alib2/src/regexp/RegExp.h index f213e33c20f49a4e00b0b0f154a31ef64a5c8594..32b55891cc6bd0fa980bccd342a3bfea4f3b87b0 100644 --- a/alib2/src/regexp/RegExp.h +++ b/alib2/src/regexp/RegExp.h @@ -23,7 +23,7 @@ class RegExpElement; * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of RegExpElement. */ -class RegExp : public std::element<RegExp, std::visitor<RegExp> > { +class RegExp { protected: RegExpElement* regExp; diff --git a/alib2/src/regexp/RegExpElement.h b/alib2/src/regexp/RegExpElement.h index 604e546e2542b2f89533eab6d777383e56cf4ba1..7aca59838f6a28e5272773dc5e4a714fbf53cc93 100644 --- a/alib2/src/regexp/RegExpElement.h +++ b/alib2/src/regexp/RegExpElement.h @@ -27,7 +27,7 @@ class RegExpEpsilon; /** * Abstract class representing element in the regular expression. Can be operator or symbol. */ -class RegExpElement : virtual public std::elementBase<std::visitor<Alternation, Concatenation, Iteration, RegExpSymbol, RegExpEmpty, RegExpEpsilon> > { +class RegExpElement : virtual public std::elementBase<Alternation, Concatenation, Iteration, RegExpSymbol, RegExpEmpty, RegExpEpsilon> { protected: /* * Parent regexp contanining this instance of RegExpElement diff --git a/alib2/src/regexp/RegExpEmpty.h b/alib2/src/regexp/RegExpEmpty.h index 64b28a08aadad7ee7e8f92ab6ee600277392b381..bd5466f445f832c92470ce967ca826772ff97d47 100644 --- a/alib2/src/regexp/RegExpEmpty.h +++ b/alib2/src/regexp/RegExpEmpty.h @@ -15,7 +15,7 @@ namespace regexp { /** * Represents empty regular expression in the regular expression. */ -class RegExpEmpty: public RegExpElement, public std::element<RegExpEmpty, RegExpElement::visitor_type> { +class RegExpEmpty: virtual public RegExpElement, public std::element<RegExpEmpty, RegExpElement> { protected: /** * @copydoc RegExpElement::clone() const diff --git a/alib2/src/regexp/RegExpEpsilon.h b/alib2/src/regexp/RegExpEpsilon.h index f36f3f25e48a7fa3380f2a65c3310950b7b61c4d..bb4b7406a30c49a1bf8fec920576c4e1fdb3c33f 100644 --- a/alib2/src/regexp/RegExpEpsilon.h +++ b/alib2/src/regexp/RegExpEpsilon.h @@ -15,7 +15,7 @@ namespace regexp { /** * Represents epsilon in the regular expression. */ -class RegExpEpsilon: public RegExpElement, public std::element<RegExpEpsilon, RegExpElement::visitor_type> { +class RegExpEpsilon: virtual public RegExpElement, public std::element<RegExpEpsilon, RegExpElement> { protected: /** * @copydoc RegExpElement::clone() const diff --git a/alib2/src/regexp/RegExpSymbol.h b/alib2/src/regexp/RegExpSymbol.h index 8f8d25e8a7423eee023ff208ac6ed55a80fe9ab3..b4c9e00d1fe5108339fd1bf2dae439f080b6fc2a 100644 --- a/alib2/src/regexp/RegExpSymbol.h +++ b/alib2/src/regexp/RegExpSymbol.h @@ -17,7 +17,7 @@ namespace regexp { /** * Represents symbol in the regular expression. Contains name of the symbol. */ -class RegExpSymbol : public RegExpElement, public std::element<RegExpSymbol, RegExpElement::visitor_type> { +class RegExpSymbol : virtual public RegExpElement, public std::element<RegExpSymbol, RegExpElement> { protected: alphabet::Symbol symbol; diff --git a/alib2/src/regexp/RegExpToStringComposer.cpp b/alib2/src/regexp/RegExpToStringComposer.cpp index ac09f0a0627c0d5674e8b141e769d93baaa1ec3c..0e610d7548ea30e51f4edfbc02f2637bbe1c8f1a 100644 --- a/alib2/src/regexp/RegExpToStringComposer.cpp +++ b/alib2/src/regexp/RegExpToStringComposer.cpp @@ -12,11 +12,7 @@ namespace regexp { void RegExpToStringComposer::Visit(void* userData, const RegExp& regexp) { - regexp.Accept(userData, *this); -} - -void RegExpToStringComposer::Visit(void* userData, const RegExp::element_type& regexp) { - regexp.Accept(userData, *this); + regexp.getRegExp().Accept(userData, *this); } void RegExpToStringComposer::Visit(void* userData, const RegExpElement::element_type& element) { diff --git a/alib2/src/regexp/RegExpToStringComposer.h b/alib2/src/regexp/RegExpToStringComposer.h index e7e2ce39ada64bc1d7804d4c5a1d9082b05b59ce..4eba2a2d49a62d4b3995eaef35f3652e6ce56520 100644 --- a/alib2/src/regexp/RegExpToStringComposer.h +++ b/alib2/src/regexp/RegExpToStringComposer.h @@ -14,7 +14,7 @@ namespace regexp { -class RegExpToStringComposer : public RegExp::visitor_type, public RegExpElement::visitor_type { +class RegExpToStringComposer : public RegExpElement::visitor_type { void Visit(void*, const Alternation& alternation); void Visit(void*, const Concatenation& concatenation); void Visit(void*, const Iteration& iteration); @@ -27,7 +27,6 @@ class RegExpToStringComposer : public RegExp::visitor_type, public RegExpElement void Visit(void*, const RegExp& empty); - void Visit(void*, const RegExp::element_type& regexp); public: /** * Composes string representation of RegExp. diff --git a/alib2/src/regexp/RegExpToXMLComposer.cpp b/alib2/src/regexp/RegExpToXMLComposer.cpp index adb9e5314633cf588f18bca8a9d244eff4203030..3f5245d364e3ef58f7503be36e48156ca79b5860 100644 --- a/alib2/src/regexp/RegExpToXMLComposer.cpp +++ b/alib2/src/regexp/RegExpToXMLComposer.cpp @@ -9,7 +9,7 @@ namespace regexp { -void RegExpToXMLComposer::Visit(void* userData, const RegExp& regexp) { +void RegExpToXMLComposer::Visit(void* userData, const RegExp& regexp) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("regexp", sax::Token::START_ELEMENT)); @@ -26,15 +26,11 @@ void RegExpToXMLComposer::Visit(void* userData, const RegExp& regexp) { out.push_back(sax::Token("regexp", sax::Token::END_ELEMENT)); } -void RegExpToXMLComposer::Visit(void* userData, const RegExp::element_type& regexp) { - regexp.Accept(userData, *this); -} - -void RegExpToXMLComposer::Visit(void* userData, const RegExpElement::element_type& element) { +void RegExpToXMLComposer::Visit(void* userData, const RegExpElement::element_type& element) const { element.Accept(userData, *this); } -void RegExpToXMLComposer::Visit(void* userData, const Alternation& alternation) { +void RegExpToXMLComposer::Visit(void* userData, const Alternation& alternation) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("alternation", sax::Token::START_ELEMENT)); @@ -45,7 +41,7 @@ void RegExpToXMLComposer::Visit(void* userData, const Alternation& alternation) out.push_back(sax::Token("alternation", sax::Token::END_ELEMENT)); } -void RegExpToXMLComposer::Visit(void* userData, const Concatenation& concatenation) { +void RegExpToXMLComposer::Visit(void* userData, const Concatenation& concatenation) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("concatenation", sax::Token::START_ELEMENT)); @@ -57,7 +53,7 @@ void RegExpToXMLComposer::Visit(void* userData, const Concatenation& concatenati } -void RegExpToXMLComposer::Visit(void* userData, const Iteration& iteration) { +void RegExpToXMLComposer::Visit(void* userData, const Iteration& iteration) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("iteration", sax::Token::START_ELEMENT)); @@ -66,7 +62,7 @@ void RegExpToXMLComposer::Visit(void* userData, const Iteration& iteration) { out.push_back(sax::Token("iteration", sax::Token::END_ELEMENT)); } -void RegExpToXMLComposer::Visit(void* userData, const RegExpSymbol& symbol) { +void RegExpToXMLComposer::Visit(void* userData, const RegExpSymbol& symbol) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("symbol", sax::Token::START_ELEMENT)); @@ -74,23 +70,23 @@ void RegExpToXMLComposer::Visit(void* userData, const RegExpSymbol& symbol) { out.push_back(sax::Token("symbol", sax::Token::END_ELEMENT)); } -void RegExpToXMLComposer::Visit(void* userData, const RegExpEpsilon&) { +void RegExpToXMLComposer::Visit(void* userData, const RegExpEpsilon&) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("epsilon", sax::Token::START_ELEMENT)); out.push_back(sax::Token("epsilon", sax::Token::END_ELEMENT)); } -void RegExpToXMLComposer::Visit(void* userData, const RegExpEmpty&) { +void RegExpToXMLComposer::Visit(void* userData, const RegExpEmpty&) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("empty", sax::Token::START_ELEMENT)); out.push_back(sax::Token("empty", sax::Token::END_ELEMENT)); } -std::list<sax::Token> RegExpToXMLComposer::compose(const RegExp& regexp) { +std::list<sax::Token> RegExpToXMLComposer::compose(const RegExp& regexp) const { std::list<sax::Token> out; - regexp.Accept((void*) &out, *this); + Visit((void*) &out, regexp); return out; } diff --git a/alib2/src/regexp/RegExpToXMLComposer.h b/alib2/src/regexp/RegExpToXMLComposer.h index b6ed8cdc011f74c3c04e03659f037cc1a96d59f8..4a8de9cb3f67989172d7d527e69b43f485cba804 100644 --- a/alib2/src/regexp/RegExpToXMLComposer.h +++ b/alib2/src/regexp/RegExpToXMLComposer.h @@ -18,20 +18,18 @@ namespace regexp { /** * This class contains methods to print XML representation of regular expression to the output stream. */ -class RegExpToXMLComposer : public RegExp::visitor_type, public RegExpElement::visitor_type { - void Visit(void*, const Alternation& alternation); - void Visit(void*, const Concatenation& concatenation); - void Visit(void*, const Iteration& iteration); - void Visit(void*, const RegExpSymbol& symbol); - void Visit(void*, const RegExpEpsilon& epsilon); - void Visit(void*, const RegExpEmpty& empty); +class RegExpToXMLComposer : public RegExpElement::const_visitor_type { + void Visit(void*, const Alternation& alternation) const; + void Visit(void*, const Concatenation& concatenation) const; + void Visit(void*, const Iteration& iteration) const; + void Visit(void*, const RegExpSymbol& symbol) const; + void Visit(void*, const RegExpEpsilon& epsilon) const; + void Visit(void*, const RegExpEmpty& empty) const; - void Visit(void*, const RegExpElement::element_type& element); + void Visit(void*, const RegExpElement::element_type& element) const; - void Visit(void*, const RegExp& empty); - - void Visit(void*, const RegExp::element_type& regexp); + void Visit(void*, const RegExp& empty) const; public: /** @@ -39,7 +37,7 @@ public: * @param regexp RegExp to print * @returns list of xml tokens. */ - std::list<sax::Token> compose(const RegExp& regexp); + std::list<sax::Token> compose(const RegExp& regexp) const; }; } /* namespace regexp */ diff --git a/alib2/src/std/visitor.hpp b/alib2/src/std/visitor.hpp index e2efd9813af445554c50860b5e17784d8242b3bb..ded39b2bdc052c4216aa71fcee5d11450be5d88a 100644 --- a/alib2/src/std/visitor.hpp +++ b/alib2/src/std/visitor.hpp @@ -9,15 +9,13 @@ #ifndef VISITOR_H_ #define VISITOR_H_ -#include <tuple> - namespace std { // Visitor template declaration template<typename... Types> class visitor; -// specialization for single type +// specialization for single type template<typename T> class visitor<T> { public: @@ -34,23 +32,49 @@ public: virtual void Visit(void* userData, const T & visitable) = 0; }; -template<typename VisitorType> +// Visitor template declaration +template<typename... Types> +class const_visitor; + +// specialization for single type +template<typename T> +class const_visitor<T> { +public: + virtual void Visit(void* userData, const T & visitable) const = 0; +}; + +// specialization for multiple types +template<typename T, typename... Types> +class const_visitor<T, Types...> : public const_visitor<Types...> { +public: + // promote the function(s) from the base class + using const_visitor<Types...>::Visit; + + virtual void Visit(void* userData, const T & visitable) const = 0; +}; + +template<typename... Types> class elementBase { public: - typedef VisitorType visitor_type; + typedef visitor<Types...> visitor_type; + typedef const_visitor<Types...> const_visitor_type; typedef elementBase element_type; - virtual void Accept(void* userData, VisitorType& visitor) const = 0; + virtual void Accept(void* userData, visitor<Types...>& visitor) const = 0; + virtual void Accept(void* userData, const const_visitor<Types...>& visitor) const = 0; }; -template<typename Derived, typename VisitorType> -class element : virtual public elementBase<VisitorType> { +template<typename Derived, typename Base> +class element : virtual public Base { public: - virtual void Accept(void* userData, VisitorType& visitor) const { + virtual void Accept(void* userData, typename Base::visitor_type& visitor) const { + visitor.Visit(userData, static_cast<const Derived&>(*this)); + } + virtual void Accept(void* userData, const typename Base::const_visitor_type& visitor) const { visitor.Visit(userData, static_cast<const Derived&>(*this)); } }; } /* namespace std */ -#endif /* VISITOR_H_ */ \ No newline at end of file +#endif /* VISITOR_H_ */ diff --git a/alib2/src/string/CyclicString.h b/alib2/src/string/CyclicString.h index 2137aaaf76812b39177622fac57e0aa2342966d8..2444eaa70e5b3acad22785214594a2f573725cf4 100644 --- a/alib2/src/string/CyclicString.h +++ b/alib2/src/string/CyclicString.h @@ -22,7 +22,7 @@ namespace string { * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of CyclicStringElement. */ -class CyclicString : public StringBase, public std::element<CyclicString, StringBase::visitor_type> { +class CyclicString : virtual public StringBase, public std::element<CyclicString, StringBase> { protected: std::vector<alphabet::Symbol> m_Data; diff --git a/alib2/src/string/Epsilon.h b/alib2/src/string/Epsilon.h index 7fba33014fff6cb47f14e5a1c295f04374770611..2d42d13dbb6f5faf4db7b3078b0f3b2d45d69f0a 100644 --- a/alib2/src/string/Epsilon.h +++ b/alib2/src/string/Epsilon.h @@ -22,7 +22,7 @@ namespace string { * Represents epsilon. Regular expression is stored * as a tree of EpsilonElement. */ -class Epsilon : public StringBase, public std::element<Epsilon, StringBase::visitor_type> { +class Epsilon : virtual public StringBase, public std::element<Epsilon, StringBase> { protected: virtual bool testSymbol( const alphabet::Symbol & symbol ) const; diff --git a/alib2/src/string/LinearString.h b/alib2/src/string/LinearString.h index a3969c2d35f178311201c6b709b70cec8622d92b..4fb4b0ffdce78cf9da8a0fd2ceedcbd90ac96f7e 100644 --- a/alib2/src/string/LinearString.h +++ b/alib2/src/string/LinearString.h @@ -22,7 +22,7 @@ namespace string { * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of LinearStringElement. */ -class LinearString : public StringBase, public std::element<LinearString, StringBase::visitor_type> { +class LinearString : virtual public StringBase, public std::element<LinearString, StringBase> { protected: std::vector<alphabet::Symbol> m_Data; diff --git a/alib2/src/string/String.h b/alib2/src/string/String.h index b50a54acddc6a722f7b1761414c1a2033570e1d1..668f1994f6379b0b835a9590f3e6f4eee64d2ccc 100644 --- a/alib2/src/string/String.h +++ b/alib2/src/string/String.h @@ -20,7 +20,7 @@ class StringBase; /** * Wrapper around strings. */ -class String : public std::element<String, std::visitor<String> > { +class String { protected: StringBase* string; std::set<alphabet::Symbol> alphabet; diff --git a/alib2/src/string/StringBase.h b/alib2/src/string/StringBase.h index 5d299f5a36c5afaed8407bfb99e307b97236e9aa..45885a3891034601fed1a4772067be872208704c 100644 --- a/alib2/src/string/StringBase.h +++ b/alib2/src/string/StringBase.h @@ -25,7 +25,7 @@ class Epsilon; /** * Represents string in an alphabet. */ -class StringBase : virtual public std::elementBase<std::visitor<Epsilon, LinearString, CyclicString> > { +class StringBase : virtual public std::elementBase<Epsilon, LinearString, CyclicString> { protected: const String* parentString; diff --git a/alib2/src/string/StringToStringComposer.h b/alib2/src/string/StringToStringComposer.h index c2375c125fe98d769df0dcade8d070732ebe13a8..223b221d1118a61cd69ceb8e0e8043b55375f877 100644 --- a/alib2/src/string/StringToStringComposer.h +++ b/alib2/src/string/StringToStringComposer.h @@ -18,7 +18,7 @@ namespace string { /** * This class contains methods to print XML representation of string to the output stream. */ -class StringToStringComposer : public String::visitor_type, public StringBase::visitor_type { +class StringToStringComposer : public StringBase::visitor_type { void Visit(void*, const alphabet::Symbol& symbol); void Visit(void*, const String& string); void Visit(void*, const LinearString& string); diff --git a/alib2/src/string/StringToXMLComposer.cpp b/alib2/src/string/StringToXMLComposer.cpp index e37cebd0f25a6bc91eebc687311a3cd660f5a343..480825fb05724657462090527e3051e31c17a6e1 100644 --- a/alib2/src/string/StringToXMLComposer.cpp +++ b/alib2/src/string/StringToXMLComposer.cpp @@ -12,7 +12,7 @@ namespace string { -void StringToXMLComposer::Visit(void* userData, const alphabet::Symbol& symbol) { +void StringToXMLComposer::Visit(void* userData, const alphabet::Symbol& symbol) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("symbol", sax::Token::START_ELEMENT)); @@ -20,14 +20,14 @@ void StringToXMLComposer::Visit(void* userData, const alphabet::Symbol& symbol) out.push_back(sax::Token("symbol", sax::Token::END_ELEMENT)); } -void StringToXMLComposer::Visit(void* userData, const Epsilon&) { +void StringToXMLComposer::Visit(void* userData, const Epsilon&) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("Epsilon", sax::Token::START_ELEMENT)); out.push_back(sax::Token("Epsilon", sax::Token::END_ELEMENT)); } -void StringToXMLComposer::Visit(void* userData, const CyclicString& string) { +void StringToXMLComposer::Visit(void* userData, const CyclicString& string) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("CyclicString", sax::Token::START_ELEMENT)); @@ -37,7 +37,7 @@ void StringToXMLComposer::Visit(void* userData, const CyclicString& string) { out.push_back(sax::Token("CyclicString", sax::Token::END_ELEMENT)); } -void StringToXMLComposer::Visit(void* userData, const LinearString& string) { +void StringToXMLComposer::Visit(void* userData, const LinearString& string) const { std::list<sax::Token> &out = *((std::list<sax::Token>*) userData); out.push_back(sax::Token("LinearString", sax::Token::START_ELEMENT)); @@ -47,12 +47,12 @@ void StringToXMLComposer::Visit(void* userData, const LinearString& string) { out.push_back(sax::Token("LinearString", sax::Token::END_ELEMENT)); } -void StringToXMLComposer::Visit(void* userData, const String& string) { +void StringToXMLComposer::Visit(void* userData, const String& string) const { string.getString().Accept(userData, *this); } -std::list<sax::Token> StringToXMLComposer::compose(const String& string) { +std::list<sax::Token> StringToXMLComposer::compose(const String& string) const { std::list<sax::Token> out; Visit((void*) &out, string); return out; diff --git a/alib2/src/string/StringToXMLComposer.h b/alib2/src/string/StringToXMLComposer.h index e8b245c4cdf14fd1ae69dd23efbd2b280307be87..548c3467e8d7ba3627bca4a70a4839d4b302f16b 100644 --- a/alib2/src/string/StringToXMLComposer.h +++ b/alib2/src/string/StringToXMLComposer.h @@ -18,12 +18,12 @@ namespace string { /** * This class contains methods to print XML representation of string to the output stream. */ -class StringToXMLComposer : public String::visitor_type, public StringBase::visitor_type { - void Visit(void*, const alphabet::Symbol& symbol); - void Visit(void*, const String& string); - void Visit(void*, const LinearString& string); - void Visit(void*, const CyclicString& string); - void Visit(void*, const Epsilon& string); +class StringToXMLComposer : public StringBase::const_visitor_type { + void Visit(void*, const alphabet::Symbol& symbol) const; + void Visit(void*, const String& string) const; + void Visit(void*, const LinearString& string) const; + void Visit(void*, const CyclicString& string) const; + void Visit(void*, const Epsilon& string) const; public: /** @@ -31,7 +31,7 @@ public: * @param string String to print * @param out output stream to which print the String */ - std::list<sax::Token> compose(const String& string); + std::list<sax::Token> compose(const String& string) const; }; } /* namespace string */