From 7fd62e12f6bb60c19ad4c5efec79986657c8b58a Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sun, 26 Jul 2015 14:41:34 +0200 Subject: [PATCH] continue with containers --- aarbology2/src/aarbology.cpp | 1 + agenerate2/src/agenerate.cpp | 1 + alib2data/src/XmlApi.cpp | 62 -------- alib2data/src/XmlApi.hpp | 129 ---------------- alib2data/src/XmlTagNames.cpp | 61 -------- alib2data/src/XmlTagNames.h | 69 --------- .../src/container/ContainerFromXMLParser.cpp | 98 ------------ .../src/container/ContainerFromXMLParser.hpp | 142 ------------------ .../container/ContainerFromXMLParser.hpp.tmp | 33 ++++ .../src/container/ContainerToXMLComposer.cpp | 65 -------- .../src/container/ContainerToXMLComposer.hpp | 140 ----------------- .../container/ContainerToXMLComposer.hpp.tmp | 33 ++++ alib2data/src/container/ObjectsMap.cpp | 27 ++++ alib2data/src/container/ObjectsMap.h | 66 ++++++++ alib2data/src/container/ObjectsPair.cpp | 23 +++ alib2data/src/container/ObjectsPair.h | 60 ++++++++ alib2data/src/container/ObjectsSet.cpp | 25 +++ alib2data/src/container/ObjectsSet.h | 65 ++++++++ alib2data/src/container/ObjectsVector.cpp | 25 +++ alib2data/src/container/ObjectsVector.h | 65 ++++++++ alib2data/src/factory/XmlDataFactory.hpp | 1 + alib2data/test-src/string/StringTest.cpp | 1 + arun2/src/arun.cpp | 1 + astat2/src/AutomataStat.cpp | 3 + astat2/src/SetStat.cpp | 1 + astringology2/src/astringology.cpp | 2 + 26 files changed, 433 insertions(+), 766 deletions(-) delete mode 100644 alib2data/src/XmlTagNames.cpp delete mode 100644 alib2data/src/XmlTagNames.h delete mode 100644 alib2data/src/container/ContainerFromXMLParser.cpp delete mode 100644 alib2data/src/container/ContainerFromXMLParser.hpp create mode 100644 alib2data/src/container/ContainerFromXMLParser.hpp.tmp delete mode 100644 alib2data/src/container/ContainerToXMLComposer.cpp delete mode 100644 alib2data/src/container/ContainerToXMLComposer.hpp create mode 100644 alib2data/src/container/ContainerToXMLComposer.hpp.tmp diff --git a/aarbology2/src/aarbology.cpp b/aarbology2/src/aarbology.cpp index 9babf7af9a..b3e84e19f3 100644 --- a/aarbology2/src/aarbology.cpp +++ b/aarbology2/src/aarbology.cpp @@ -12,6 +12,7 @@ #include <exception/AlibException.h> #include <tree/Tree.h> #include <container/Container.h> +#include <container/ObjectsSet.h> #include <arbology/exact/ExactSubtreeMatch.h> #include <arbology/exact/ExactSubtreeMatchingAutomaton.h> diff --git a/agenerate2/src/agenerate.cpp b/agenerate2/src/agenerate.cpp index f0e0af1f7c..f1d6558f2d 100644 --- a/agenerate2/src/agenerate.cpp +++ b/agenerate2/src/agenerate.cpp @@ -13,6 +13,7 @@ #include <string/LinearString.h> #include <grammar/Grammar.h> #include <grammar/generate/GenerateUpToLength.h> +#include <container/ObjectsSet.h> int main(int argc, char* argv[]) { try { diff --git a/alib2data/src/XmlApi.cpp b/alib2data/src/XmlApi.cpp index 0b972d5d03..f4100981fe 100644 --- a/alib2data/src/XmlApi.cpp +++ b/alib2data/src/XmlApi.cpp @@ -33,73 +33,11 @@ namespace alib { const alib::ObjectFromXMLParser FromXMLParsers::objectParser; -const container::ContainerFromXMLParser FromXMLParsers::containerParser; const alib::ObjectToXMLComposer ToXMLComposers::objectComposer; -const container::ContainerToXMLComposer ToXMLComposers::containerComposer; const ToXMLComposers ToXMLComposers::toXMLComposers; -container::Container xmlApi<container::Container>::parse(std::deque<sax::Token>::iterator& input) { - return FromXMLParsers::containerParser.parseContainer(input); -} - -bool xmlApi<container::Container>::first(const std::deque<sax::Token>::const_iterator& input) { - return FromXMLParsers::containerParser.first(input); -} - -void xmlApi<container::Container>::compose(std::deque<sax::Token>& output, const container::Container& data) { - ToXMLComposers::containerComposer.compose(output, data); -} - -container::ObjectsSet xmlApi<container::ObjectsSet>::parse(std::deque<sax::Token>::iterator& input) { - return FromXMLParsers::containerParser.parseObjectsSet(input); -} - -bool xmlApi<container::ObjectsSet>::first(const std::deque<sax::Token>::const_iterator& input) { - return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::CONTAINER_OBJECTS_SET); -} - -void xmlApi<container::ObjectsSet>::compose(std::deque<sax::Token>& output, const container::ObjectsSet& data) { - ToXMLComposers::containerComposer.compose(output, data); -} - -container::ObjectsVector xmlApi<container::ObjectsVector>::parse(std::deque<sax::Token>::iterator& input) { - return FromXMLParsers::containerParser.parseObjectsVector(input); -} - -bool xmlApi<container::ObjectsVector>::first(const std::deque<sax::Token>::const_iterator& input) { - return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::CONTAINER_OBJECTS_VECTOR); -} - -void xmlApi<container::ObjectsVector>::compose(std::deque<sax::Token>& output, const container::ObjectsVector& data) { - ToXMLComposers::containerComposer.compose(output, data); -} - -container::ObjectsPair xmlApi<container::ObjectsPair>::parse(std::deque<sax::Token>::iterator& input) { - return FromXMLParsers::containerParser.parseObjectsPair(input); -} - -bool xmlApi<container::ObjectsPair>::first(const std::deque<sax::Token>::const_iterator& input) { - return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::CONTAINER_OBJECTS_PAIR); -} - -void xmlApi<container::ObjectsPair>::compose(std::deque<sax::Token>& output, const container::ObjectsPair& data) { - ToXMLComposers::containerComposer.compose(output, data); -} - -container::ObjectsMap xmlApi<container::ObjectsMap>::parse(std::deque<sax::Token>::iterator& input) { - return FromXMLParsers::containerParser.parseObjectsMap(input); -} - -bool xmlApi<container::ObjectsMap>::first(const std::deque<sax::Token>::const_iterator& input) { - return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::CONTAINER_OBJECTS_MAP); -} - -void xmlApi<container::ObjectsMap>::compose(std::deque<sax::Token>& output, const container::ObjectsMap& data) { - ToXMLComposers::containerComposer.compose(output, data); -} - alib::Object xmlApi<alib::Object>::parse(std::deque<sax::Token>::iterator& input) { return FromXMLParsers::objectParser.parseObject(input); } diff --git a/alib2data/src/XmlApi.hpp b/alib2data/src/XmlApi.hpp index 18d96e18b6..e7110f8e82 100644 --- a/alib2data/src/XmlApi.hpp +++ b/alib2data/src/XmlApi.hpp @@ -17,13 +17,9 @@ #include "sax/Token.h" #include "sax/FromXMLParserHelper.h" -#include "XmlTagNames.h" - #include "object/ObjectFromXMLParser.h" -#include "container/ContainerFromXMLParser.hpp" #include "object/ObjectToXMLComposer.h" -#include "container/ContainerToXMLComposer.hpp" #include "object/ObjectBase.h" #include "object/WrapperBase.h" @@ -96,62 +92,6 @@ struct xmlApi<Type, typename std::enable_if< std::is_base_of<ObjectBase, Type>:: }; -template<typename T> -struct xmlApi<std::set<T>> { - static std::set<T> parse(std::deque<sax::Token>::iterator& input); - static bool first(const std::deque<sax::Token>::const_iterator& input); - static void compose(std::deque<sax::Token>& output, const std::set<T>& data); -}; - -template<> -struct xmlApi<container::ObjectsSet> { - static container::ObjectsSet parse(std::deque<sax::Token>::iterator& input); - static bool first(const std::deque<sax::Token>::const_iterator& input); - static void compose(std::deque<sax::Token>& output, const container::ObjectsSet& data); -}; - -template<typename T> -struct xmlApi<std::vector<T>> { - static std::vector<T> parse(std::deque<sax::Token>::iterator& input); - static bool first(const std::deque<sax::Token>::const_iterator& input); - static void compose(std::deque<sax::Token>& output, const std::vector<T>& data); -}; - -template<> -struct xmlApi<container::ObjectsVector> { - static container::ObjectsVector parse(std::deque<sax::Token>::iterator& input); - static bool first(const std::deque<sax::Token>::const_iterator& input); - static void compose(std::deque<sax::Token>& output, const container::ObjectsVector& data); -}; - -template<typename T, typename R> -struct xmlApi<std::pair<T, R>> { - static std::pair<T, R> parse(std::deque<sax::Token>::iterator& input); - static bool first(const std::deque<sax::Token>::const_iterator& input); - static void compose(std::deque<sax::Token>& output, const std::pair<T, R>& data); -}; - -template<> -struct xmlApi<container::ObjectsPair> { - static container::ObjectsPair parse(std::deque<sax::Token>::iterator& input); - static bool first(const std::deque<sax::Token>::const_iterator& input); - static void compose(std::deque<sax::Token>& output, const container::ObjectsPair& data); -}; - -template<typename T, typename R> -struct xmlApi<std::map<T, R>> { - static std::map<T, R> parse(std::deque<sax::Token>::iterator& input); - static bool first(const std::deque<sax::Token>::const_iterator& input); - static void compose(std::deque<sax::Token>& output, const std::map<T, R>& data); -}; - -template<> -struct xmlApi<container::ObjectsMap> { - static container::ObjectsMap parse(std::deque<sax::Token>::iterator& input); - static bool first(const std::deque<sax::Token>::const_iterator& input); - static void compose(std::deque<sax::Token>& output, const container::ObjectsMap& data); -}; - /* TODO for gcc-4.9 uncomment template<typename ... Ts> struct xmlApi<std::variant<Ts...>> { @@ -173,17 +113,9 @@ struct xmlApi<Object> { }; -template<> -struct xmlApi<container::Container> { - static container::Container parse(std::deque<sax::Token>::iterator& input); - static bool first(const std::deque<sax::Token>::const_iterator& input); - static void compose(std::deque<sax::Token>& output, const container::Container& data); -}; - class FromXMLParsers { public: static const ObjectFromXMLParser objectParser; - static const container::ContainerFromXMLParser containerParser; }; @@ -282,71 +214,10 @@ private: public: static const ObjectToXMLComposer objectComposer; - static const container::ContainerToXMLComposer containerComposer; static const ToXMLComposers toXMLComposers; }; -template<typename T> -std::set<T> xmlApi<std::set<T>>::parse(std::deque<sax::Token>::iterator& input) { - return FromXMLParsers::containerParser.parseSet<T>(input); -} - -template<typename T> -bool xmlApi<std::set<T>>::first(const std::deque<sax::Token>::const_iterator& input) { - return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::CONTAINER_OBJECTS_SET); -} - -template<typename T> -void xmlApi<std::set<T>>::compose(std::deque<sax::Token>& output, const std::set<T>& input) { - return ToXMLComposers::containerComposer.compose<T>(output, input); -} - -template<typename T> -std::vector<T> xmlApi<std::vector<T>>::parse(std::deque<sax::Token>::iterator& input) { - return FromXMLParsers::containerParser.parseVector<T>(input); -} - -template<typename T> -bool xmlApi<std::vector<T>>::first(const std::deque<sax::Token>::const_iterator& input) { - return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::CONTAINER_OBJECTS_VECTOR); -} - -template<typename T> -void xmlApi<std::vector<T>>::compose(std::deque<sax::Token>& output, const std::vector<T>& input) { - return ToXMLComposers::containerComposer.compose<T>(output, input); -} - -template<typename T, typename R> -std::pair<T, R> xmlApi<std::pair<T, R>>::parse(std::deque<sax::Token>::iterator& input) { - return FromXMLParsers::containerParser.parsePair<T, R>(input); -} - -template<typename T, typename R> -bool xmlApi<std::pair<T, R>>::first(const std::deque<sax::Token>::const_iterator& input) { - return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::CONTAINER_OBJECTS_PAIR); -} - -template<typename T, typename R> -void xmlApi<std::pair<T, R>>::compose(std::deque<sax::Token>& output, const std::pair<T, R>& input) { - return ToXMLComposers::containerComposer.compose<T, R>(output, input); -} - -template<typename T, typename R> -std::map<T, R> xmlApi<std::map<T, R>>::parse(std::deque<sax::Token>::iterator& input) { - return FromXMLParsers::containerParser.parseMap<T, R>(input); -} - -template<typename T, typename R> -bool xmlApi<std::map<T, R>>::first(const std::deque<sax::Token>::const_iterator& input) { - return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::CONTAINER_OBJECTS_MAP); -} - -template<typename T, typename R> -void xmlApi<std::map<T, R>>::compose(std::deque<sax::Token>& output, const std::map<T, R>& input) { - return ToXMLComposers::containerComposer.compose<T, R>(output, input); -} - /* TODO For gcc-4.9 uncomment template<typename ... Ts> std::variant<Ts...> xmlApi<std::variant<Ts...>>::parse(std::deque<sax::Token>::iterator& input) { diff --git a/alib2data/src/XmlTagNames.cpp b/alib2data/src/XmlTagNames.cpp deleted file mode 100644 index 9a90210b76..0000000000 --- a/alib2data/src/XmlTagNames.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * XmlTagNames.cpp - * - * Created on: Apr 1, 2013 - * Author: Jan Travnicek - */ - -#include "XmlTagNames.h" - -namespace alib { - -const std::string Names::ALIB_VOID = "Void"; -const std::string Names::CONTAINER_OBJECTS_SET = "ObjectsSet"; -const std::string Names::CONTAINER_OBJECTS_VECTOR = "ObjectsVector"; -const std::string Names::CONTAINER_OBJECTS_PAIR = "ObjectsPair"; -const std::string Names::CONTAINER_OBJECTS_MAP = "ObjectsMap"; -const std::string Names::AUTOMATON_EPSILON_NFA = "EpsilonNFA"; -const std::string Names::AUTOMATON_MULTI_INITIAL_STATE_NFA = "MultiInitialStateNFA"; -const std::string Names::AUTOMATON_NFA = "NFA"; -const std::string Names::AUTOMATON_DFA = "DFA"; -const std::string Names::AUTOMATON_EXTENDED_NFA = "ExtendedNFA"; -const std::string Names::AUTOMATON_COMPACT_NFA = "CompactNFA"; -const std::string Names::AUTOMATON_DFTA = "DFTA"; -const std::string Names::AUTOMATON_NFTA = "NFTA"; -const std::string Names::AUTOMATON_DPDA = "DPDA"; -const std::string Names::AUTOMATON_SINGLE_POP_DPDA = "SinglePopDPDA"; -const std::string Names::AUTOMATON_INPUT_DRIVEN_DPDA = "InputDrivenDPDA"; -const std::string Names::AUTOMATON_INPUT_DRIVEN_NPDA = "InputDrivenNPDA"; -const std::string Names::AUTOMATON_VISIBLY_PUSHDOWN_DPDA = "VisiblyPushdownDPDA"; -const std::string Names::AUTOMATON_VISIBLY_PUSHDOWN_NPDA = "VisiblyPushdownNPDA"; -const std::string Names::AUTOMATON_REAL_TIME_HEIGHT_DETERMINISTIC_DPDA = "RealTimeHeightDeterministicDPDA"; -const std::string Names::AUTOMATON_REAL_TIME_HEIGHT_DETERMINISTIC_NPDA = "RealTimeHeightDeterministicNPDA"; -const std::string Names::AUTOMATON_NPDA = "NPDA"; -const std::string Names::AUTOMATON_SINGLE_POP_NPDA = "SinglePopNPDA"; -const std::string Names::AUTOMATON_ONE_TAPE_DTM = "OneTapeDTM"; -const std::string Names::AUTOMATON_STATE = "State"; -const std::string Names::GRAMMAR_LEFT_LG = "LeftLG"; -const std::string Names::GRAMMAR_LEFT_RG = "LeftRG"; -const std::string Names::GRAMMAR_RIGHT_LG = "RightLG"; -const std::string Names::GRAMMAR_RIGHT_RG = "RightRG"; -const std::string Names::GRAMMAR_LG = "LG"; -const std::string Names::GRAMMAR_CFG = "CFG"; -const std::string Names::GRAMMAR_EPSILON_FREE_CFG = "EpsilonFreeCFG"; -const std::string Names::GRAMMAR_CNF = "CNF"; -const std::string Names::GRAMMAR_GNF = "GNF"; -const std::string Names::GRAMMAR_CSG = "CSG"; -const std::string Names::GRAMMAR_NON_CONTRACTING_GRAMMAR = "NonContractingGrammar"; -const std::string Names::GRAMMAR_CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR = "ContextPpreservingUnrestrictedGrammar"; -const std::string Names::GRAMMAR_UNRESTRICTED_GRAMMAR = "UnrestrictedGrammar"; -const std::string Names::GRAPH_DIRECTED_GRAPH = "DirectedGraph"; -const std::string Names::GRAPH_UNDIRECTED_GRAPH = "UndirectedGraph"; -const std::string Names::LABEL_PRIMITIVE_LABEL = "PrimitiveLabel"; -const std::string Names::LABEL_OBJECT_LABEL = "ObjectLabel"; -const std::string Names::LABEL_LABEL_SET_LABEL = "LabelSetLabel"; -const std::string Names::LABEL_LABEL_PAIR_LABEL = "LabelPairLabel"; -const std::string Names::LABEL_UNIQUE_LABEL = "UniqueLabel"; -const std::string Names::REGEXP_UNBOUNDED_REGEXP = "UnboundedRegExp"; -const std::string Names::REGEXP_FORMAL_REGEXP = "FormalRegExp"; - -} - diff --git a/alib2data/src/XmlTagNames.h b/alib2data/src/XmlTagNames.h deleted file mode 100644 index fd23b50fa6..0000000000 --- a/alib2data/src/XmlTagNames.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * XmlTagNames.hpp - * - * Created on: Apr 1, 2013 - * Author: Jan Travnicek - */ - -#ifndef XML_TAG_NAMES_H_ -#define XML_TAG_NAMES_H_ - -#include <string> - -namespace alib { - -struct Names { - - const static std::string ALIB_VOID; - const static std::string CONTAINER_OBJECTS_SET; - const static std::string CONTAINER_OBJECTS_VECTOR; - const static std::string CONTAINER_OBJECTS_PAIR; - const static std::string CONTAINER_OBJECTS_MAP; - const static std::string AUTOMATON_EPSILON_NFA; - const static std::string AUTOMATON_MULTI_INITIAL_STATE_NFA; - const static std::string AUTOMATON_NFA; - const static std::string AUTOMATON_DFA; - const static std::string AUTOMATON_EXTENDED_NFA; - const static std::string AUTOMATON_COMPACT_NFA; - const static std::string AUTOMATON_DFTA; - const static std::string AUTOMATON_NFTA; - const static std::string AUTOMATON_DPDA; - const static std::string AUTOMATON_SINGLE_POP_DPDA; - const static std::string AUTOMATON_INPUT_DRIVEN_DPDA; - const static std::string AUTOMATON_INPUT_DRIVEN_NPDA; - const static std::string AUTOMATON_VISIBLY_PUSHDOWN_DPDA; - const static std::string AUTOMATON_VISIBLY_PUSHDOWN_NPDA; - const static std::string AUTOMATON_REAL_TIME_HEIGHT_DETERMINISTIC_DPDA; - const static std::string AUTOMATON_REAL_TIME_HEIGHT_DETERMINISTIC_NPDA; - const static std::string AUTOMATON_NPDA; - const static std::string AUTOMATON_SINGLE_POP_NPDA; - const static std::string AUTOMATON_ONE_TAPE_DTM; - const static std::string AUTOMATON_STATE; - const static std::string GRAMMAR_LEFT_LG; - const static std::string GRAMMAR_LEFT_RG; - const static std::string GRAMMAR_RIGHT_LG; - const static std::string GRAMMAR_RIGHT_RG; - const static std::string GRAMMAR_LG; - const static std::string GRAMMAR_CFG; - const static std::string GRAMMAR_EPSILON_FREE_CFG; - const static std::string GRAMMAR_CNF; - const static std::string GRAMMAR_GNF; - const static std::string GRAMMAR_CSG; - const static std::string GRAMMAR_NON_CONTRACTING_GRAMMAR; - const static std::string GRAMMAR_CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR; - const static std::string GRAMMAR_UNRESTRICTED_GRAMMAR; - const static std::string GRAPH_DIRECTED_GRAPH; - const static std::string GRAPH_UNDIRECTED_GRAPH; - const static std::string LABEL_PRIMITIVE_LABEL; - const static std::string LABEL_OBJECT_LABEL; - const static std::string LABEL_LABEL_SET_LABEL; - const static std::string LABEL_LABEL_PAIR_LABEL; - const static std::string LABEL_UNIQUE_LABEL; - const static std::string REGEXP_UNBOUNDED_REGEXP; - const static std::string REGEXP_FORMAL_REGEXP; - -}; - -} /* namespace alib */ - -#endif /* XML_TAG_NAMES_H_ */ diff --git a/alib2data/src/container/ContainerFromXMLParser.cpp b/alib2data/src/container/ContainerFromXMLParser.cpp deleted file mode 100644 index e69227fda2..0000000000 --- a/alib2data/src/container/ContainerFromXMLParser.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - * ContainerFromXMLParser.cpp - * - * Created on: Oct 12, 2013 - * Author: Jan Travnicek - */ - -#include "ContainerFromXMLParser.hpp" -#include "../sax/ParserException.h" -#include "../XmlApi.hpp" - -#include "Container.h" -#include "ContainerClasses.h" - -namespace container { - -Container ContainerFromXMLParser::parseContainer(std::deque<sax::Token>::iterator& input) const { - return parseContainer(input, std::set<FEATURES>({FEATURES::SET, FEATURES::VECTOR, FEATURES::PAIR, FEATURES::MAP})); -} - -Container ContainerFromXMLParser::parseContainer(std::deque<sax::Token>::iterator& input, const std::set<FEATURES>& features) const { - if(alib::xmlApi<ObjectsSet>::first(input)) { - if(!features.count(FEATURES::SET)) throw exception::AlibException(); - return Container(parseObjectsSet(input)); - } else if(alib::xmlApi<ObjectsVector>::first(input)) { - if(!features.count(FEATURES::VECTOR)) throw exception::AlibException(); - return Container(parseObjectsVector(input)); - } else if(alib::xmlApi<ObjectsPair>::first(input)) { - if(!features.count(FEATURES::PAIR)) throw exception::AlibException(); - return Container(parseObjectsPair(input)); - } else if(alib::xmlApi<ObjectsMap>::first(input)) { - if(!features.count(FEATURES::MAP)) throw exception::AlibException(); - return Container(parseObjectsMap(input)); - } else { - throw sax::ParserException(sax::Token("set / vector / pair / map", sax::Token::TokenType::START_ELEMENT), *input); - } -} - -bool ContainerFromXMLParser::first(const std::deque<sax::Token>::const_iterator& input) const { - if(alib::xmlApi<ObjectsSet>::first(input) || alib::xmlApi<ObjectsVector>::first(input) || alib::xmlApi<ObjectsPair>::first(input) || alib::xmlApi<ObjectsMap>::first(input)) { - return true; - } else { - return false; - } -} - -ObjectsSet ContainerFromXMLParser::parseObjectsSet(std::deque<sax::Token>::iterator& input) const { - popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::CONTAINER_OBJECTS_SET); - - ObjectsSet set; - - while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - set.insert(alib::xmlApi<alib::Object>::parse(input)); - } - - popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::CONTAINER_OBJECTS_SET); - return set; -} - -ObjectsVector ContainerFromXMLParser::parseObjectsVector(std::deque<sax::Token>::iterator& input) const { - popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::CONTAINER_OBJECTS_VECTOR); - - ObjectsVector vector; - - while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - vector.push_back(alib::xmlApi<alib::Object>::parse(input)); - } - - popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::CONTAINER_OBJECTS_VECTOR); - return vector; -} - -ObjectsPair ContainerFromXMLParser::parseObjectsPair(std::deque<sax::Token>::iterator& input) const { - popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::CONTAINER_OBJECTS_PAIR); - - alib::Object first = alib::xmlApi<alib::Object>::parse(input); - alib::Object second = alib::xmlApi<alib::Object>::parse(input); - - ObjectsPair pair(std::move(first), std::move(second)); - - popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::CONTAINER_OBJECTS_PAIR); - return pair; -} - -ObjectsMap ContainerFromXMLParser::parseObjectsMap(std::deque<sax::Token>::iterator& input) const { - popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::CONTAINER_OBJECTS_MAP); - - ObjectsMap map; - while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - map.insert(alib::xmlApi<std::pair<alib::Object, alib::Object>>::parse(input)); - } - - popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::CONTAINER_OBJECTS_MAP); - return map; -} - -} /* namespace container */ - diff --git a/alib2data/src/container/ContainerFromXMLParser.hpp b/alib2data/src/container/ContainerFromXMLParser.hpp deleted file mode 100644 index aa08bf466b..0000000000 --- a/alib2data/src/container/ContainerFromXMLParser.hpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * ContainerFromXMLParser.h - * - * Created on: Oct 12, 2013 - * Author: Jan Travnicek - */ - -#ifndef CONTAINER_FROM_XML_PARSER_H_ -#define CONTAINER_FROM_XML_PARSER_H_ - -#include "../sax/FromXMLParserHelper.h" -#include "ContainerFeatures.h" -#include <variant> -#include <set> -#include <map> -#include <vector> -#include "../exception/AlibException.h" -#include "../XmlApiBase.h" - -namespace container { - -/** - * Parser used to get general FSM or EpsilonNFA, NFA, DFA from XML parsed into list of Tokens. - */ -class ContainerFromXMLParser : public sax::FromXMLParserHelper { -public: - ContainerFromXMLParser() {} - -private: - Container parseContainer(std::deque<sax::Token>::iterator& input) const; - Container parseContainer(std::deque<sax::Token>::iterator& input, const std::set<FEATURES>& features) const; - - template<typename T> - std::set<T> parseSet(std::deque<sax::Token>::iterator& input) const; - - ObjectsSet parseObjectsSet(std::deque<sax::Token>::iterator& input) const; - - template<typename T> - std::vector<T> parseVector(std::deque<sax::Token>::iterator& input) const; - - ObjectsVector parseObjectsVector(std::deque<sax::Token>::iterator& input) const; - - template<typename T, typename R> - std::pair<T, R> parsePair(std::deque<sax::Token>::iterator& input) const; - - ObjectsPair parseObjectsPair(std::deque<sax::Token>::iterator& input) const; - - template<typename T, typename R> - std::map<T, R> parseMap(std::deque<sax::Token>::iterator& input) const; - - ObjectsMap parseObjectsMap(std::deque<sax::Token>::iterator& input) const; - - template<typename ... Ts> - std::variant<Ts...> parseVariant(std::deque<sax::Token>::iterator& input) const; - - template<typename T, typename Enable> friend struct alib::xmlApi; - -public: - bool first(const std::deque<sax::Token>::const_iterator& input) const; -}; - -} /* namespace container */ - -#include "../XmlApi.hpp" - -namespace container { - -template<typename T> -std::set<T> ContainerFromXMLParser::parseSet(std::deque<sax::Token>::iterator& input) const { - popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::CONTAINER_OBJECTS_SET); - - std::set<T> set; - - while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - set.insert(alib::xmlApi<T>::parse(input)); - } - - popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::CONTAINER_OBJECTS_SET); - return set; -} - -template<typename T> -std::vector<T> ContainerFromXMLParser::parseVector(std::deque<sax::Token>::iterator& input) const { - popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::CONTAINER_OBJECTS_VECTOR); - - std::vector<T> vector; - - while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - vector.push_back(alib::xmlApi<T>::parse(input)); - } - - popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::CONTAINER_OBJECTS_VECTOR); - return vector; -} - -template<typename T, typename R> -std::pair<T, R> ContainerFromXMLParser::parsePair(std::deque<sax::Token>::iterator& input) const { - popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::CONTAINER_OBJECTS_PAIR); - - T first = alib::xmlApi<T>::parse(input); - R second = alib::xmlApi<R>::parse(input); - - popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::CONTAINER_OBJECTS_PAIR); - return std::make_pair(std::move(first), std::move(second)); -} - -template<typename T, typename R> -std::map<T, R> ContainerFromXMLParser::parseMap(std::deque<sax::Token>::iterator& input) const { - popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::CONTAINER_OBJECTS_MAP); - - std::map<T, R> map; - - while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - map.insert(alib::xmlApi<std::pair<T, R>>::parse(input)); - } - - popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::CONTAINER_OBJECTS_MAP); - return map; -} - -/* TODO for gcc-4.9 uncoment this -template<typename T> -T parseVariantHelper(std::deque<sax::Token>::iterator&) { - throw exception::AlibException("Can't parse variant type"); -} - -template<typename T, typename R, typename ... Ts> -T parseVariantHelper(std::deque<sax::Token>::iterator& input) { - if(alib::xmlApi<R>::first(input)) return T(alib::xmlApi<R>::parse(input)); - return parseVariantHelper<T, Ts...>(input); -} - -template<typename ... Ts> -std::variant<Ts...> ContainerFromXMLParser::parseVariant(std::deque<sax::Token>::iterator& input) const { - return parseVariantHelper<std::variant<Ts...>, Ts...>(input); -} -*/ - -} /* namespace container */ - -#endif /* CONTAINER_FROM_XML_PARSER_H_ */ - diff --git a/alib2data/src/container/ContainerFromXMLParser.hpp.tmp b/alib2data/src/container/ContainerFromXMLParser.hpp.tmp new file mode 100644 index 0000000000..7e00b8717a --- /dev/null +++ b/alib2data/src/container/ContainerFromXMLParser.hpp.tmp @@ -0,0 +1,33 @@ +/* + * ContainerFromXMLParser.h + * + * Created on: Oct 12, 2013 + * Author: Jan Travnicek + */ + +#ifndef CONTAINER_FROM_XML_PARSER_H_ +#define CONTAINER_FROM_XML_PARSER_H_ + +/* TODO for gcc-4.9 uncoment this +template<typename ... Ts> +std::variant<Ts...> parseVariant(std::deque<sax::Token>::iterator& input) const; + +template<typename T> +T parseVariantHelper(std::deque<sax::Token>::iterator&) { + throw exception::AlibException("Can't parse variant type"); +} + +template<typename T, typename R, typename ... Ts> +T parseVariantHelper(std::deque<sax::Token>::iterator& input) { + if(alib::xmlApi<R>::first(input)) return T(alib::xmlApi<R>::parse(input)); + return parseVariantHelper<T, Ts...>(input); +} + +template<typename ... Ts> +std::variant<Ts...> ContainerFromXMLParser::parseVariant(std::deque<sax::Token>::iterator& input) const { + return parseVariantHelper<std::variant<Ts...>, Ts...>(input); +} +*/ + +#endif /* CONTAINER_FROM_XML_PARSER_H_ */ + diff --git a/alib2data/src/container/ContainerToXMLComposer.cpp b/alib2data/src/container/ContainerToXMLComposer.cpp deleted file mode 100644 index d7dc9c3116..0000000000 --- a/alib2data/src/container/ContainerToXMLComposer.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ContainerToXMLComposer.cpp - * - * Created on: Oct 12, 2013 - * Author: Jan Travnicek - */ - -#include "ContainerToXMLComposer.hpp" - -#include "../XmlApi.hpp" - -#include "Container.h" -#include "ContainerClasses.h" - -namespace container { - -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const ContainerBase& container) const { - container.Accept((void*) &out, alib::ToXMLComposers::toXMLComposers); -} - -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const Container& container) const { - container.getData().Accept((void*) &out, alib::ToXMLComposers::toXMLComposers); -} - -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const ObjectsSet& container) const { - out.emplace_back(alib::Names::CONTAINER_OBJECTS_SET, sax::Token::TokenType::START_ELEMENT); - - for(const alib::Object& item : container) { - alib::xmlApi<alib::Object>::compose(out, item); - } - - out.emplace_back(alib::Names::CONTAINER_OBJECTS_SET, sax::Token::TokenType::END_ELEMENT); -} - -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const ObjectsVector& container) const { - out.emplace_back(alib::Names::CONTAINER_OBJECTS_VECTOR, sax::Token::TokenType::START_ELEMENT); - - for(const alib::Object& item : container) { - alib::xmlApi<alib::Object>::compose(out, item); - } - - out.emplace_back(alib::Names::CONTAINER_OBJECTS_VECTOR, sax::Token::TokenType::END_ELEMENT); -} - -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const ObjectsPair& container) const { - out.emplace_back(alib::Names::CONTAINER_OBJECTS_PAIR, sax::Token::TokenType::START_ELEMENT); - - alib::xmlApi<alib::Object>::compose(out, container.first); - alib::xmlApi<alib::Object>::compose(out, container.second); - - out.emplace_back(alib::Names::CONTAINER_OBJECTS_PAIR, sax::Token::TokenType::END_ELEMENT); -} - -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const ObjectsMap& container) const { - out.emplace_back(alib::Names::CONTAINER_OBJECTS_MAP, sax::Token::TokenType::START_ELEMENT); - - for(const std::pair<alib::Object, alib::Object>& item : container) { - alib::xmlApi<std::pair<alib::Object, alib::Object>>::compose(out, item); - } - - out.emplace_back(alib::Names::CONTAINER_OBJECTS_MAP, sax::Token::TokenType::END_ELEMENT); -} - -} /* namespace container */ - diff --git a/alib2data/src/container/ContainerToXMLComposer.hpp b/alib2data/src/container/ContainerToXMLComposer.hpp deleted file mode 100644 index 99752bc3b8..0000000000 --- a/alib2data/src/container/ContainerToXMLComposer.hpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - * ContainerToXMLComposer.h - * - * Created on: Nov 11, 2013 - * Author: Jan Travnicek - */ - -#ifndef CONTAINER_TO_XML_COMPOSER_H_ -#define CONTAINER_TO_XML_COMPOSER_H_ - -#include <deque> -#include "ContainerFeatures.h" -#include <variant> -#include <set> -#include <vector> -#include <map> -#include "../sax/Token.h" -#include "../XmlApiBase.h" - -namespace container { - -/** - * This class contains methods to print XML representation of automata to the output stream. - */ -class ContainerToXMLComposer { -public: - ContainerToXMLComposer() {} - -private: - /** - * Prints XML representation of UnknownAutomaton to the output stream. - * @param automaton automaton to print - * @return list of xml tokens representing the automaton - */ - void compose(std::deque<sax::Token>& output, const ContainerBase& container) const; - - /** - * Prints XML representation of String to the output stream. - * @param string String to print - * @param out output stream to which print the String - */ - void compose(std::deque<sax::Token>& output, const Container& container) const; - - template<typename T> - void compose(std::deque<sax::Token>& output, const std::set<T>& container) const; - - void compose(std::deque<sax::Token>& output, const ObjectsSet& container) const; - - template<typename T> - void compose(std::deque<sax::Token>& output, const std::vector<T>& container) const; - - void compose(std::deque<sax::Token>& output, const ObjectsVector& container) const; - - template<typename T, typename R> - void compose(std::deque<sax::Token>& output, const std::pair<T, R>& container) const; - - void compose(std::deque<sax::Token>& output, const ObjectsPair& container) const; - - template<typename T, typename R> - void compose(std::deque<sax::Token>& output, const std::map<T, R>& container) const; - - void compose(std::deque<sax::Token>& output, const ObjectsMap& container) const; - - template<typename ... Ts> - void compose(std::deque<sax::Token>& output, const std::variant<Ts...>& container) const; - - template<typename T, typename Enable> friend struct alib::xmlApi; -}; - -} /* namespace container */ - -#include "../XmlApi.hpp" - -namespace container { - -template<typename T> -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const std::set<T>& container) const { - out.emplace_back(alib::Names::CONTAINER_OBJECTS_SET, sax::Token::TokenType::START_ELEMENT); - - for(const T& item : container) { - alib::xmlApi<T>::compose(out, item); - } - - out.emplace_back(alib::Names::CONTAINER_OBJECTS_SET, sax::Token::TokenType::END_ELEMENT); -} - -template<typename T> -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const std::vector<T>& container) const { - out.emplace_back(alib::Names::CONTAINER_OBJECTS_VECTOR, sax::Token::TokenType::START_ELEMENT); - - for(const T& item : container) { - alib::xmlApi<T>::compose(out, item); - } - - out.emplace_back(alib::Names::CONTAINER_OBJECTS_VECTOR, sax::Token::TokenType::END_ELEMENT); -} - -template<typename T, typename R> -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const std::pair<T, R>& container) const { - out.emplace_back(alib::Names::CONTAINER_OBJECTS_PAIR, sax::Token::TokenType::START_ELEMENT); - - alib::xmlApi<T>::compose(out, container.first); - alib::xmlApi<R>::compose(out, container.second); - - out.emplace_back(alib::Names::CONTAINER_OBJECTS_PAIR, sax::Token::TokenType::END_ELEMENT); -} - -template<typename T, typename R> -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const std::map<T, R>& container) const { - out.emplace_back(alib::Names::CONTAINER_OBJECTS_MAP, sax::Token::TokenType::START_ELEMENT); - - for(const std::pair<T, R>& item : container) { - alib::xmlApi<std::pair<T, R>>::compose(out, item); - } - - out.emplace_back(alib::Names::CONTAINER_OBJECTS_MAP, sax::Token::TokenType::END_ELEMENT); -} - -/* TODO for gcc-4.9 uncomment -template<typename T> -void composeVariantHelper(const T&) { - throw exception::AlibException("Can't compose variant type"); -} - -template<typename T, typename R, typename ... Ts> -void composeVariantHelper(std::deque<sax::Token>& out, const T& container) { - if(container.template is<R>()) return alib::xmlApi<R>::compose(out, container.template get<R>()); - composeVariantHelper<T, Ts...>(out, container); -} - -template<typename ... Ts> -void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const std::variant<Ts...>& container) const { - composeVariantHelper<std::variant<Ts...>, Ts...>(out, container); -} -*/ - -} /* namespace container */ - -#endif /* CONTAINER_TO_XML_COMPOSER_H_ */ - diff --git a/alib2data/src/container/ContainerToXMLComposer.hpp.tmp b/alib2data/src/container/ContainerToXMLComposer.hpp.tmp new file mode 100644 index 0000000000..ad338b3b49 --- /dev/null +++ b/alib2data/src/container/ContainerToXMLComposer.hpp.tmp @@ -0,0 +1,33 @@ +/* + * ContainerToXMLComposer.h + * + * Created on: Nov 11, 2013 + * Author: Jan Travnicek + */ + +#ifndef CONTAINER_TO_XML_COMPOSER_H_ +#define CONTAINER_TO_XML_COMPOSER_H_ + +/* TODO for gcc-4.9 uncomment +template<typename ... Ts> +void compose(std::deque<sax::Token>& output, const std::variant<Ts...>& container) const; + +template<typename T> +void composeVariantHelper(const T&) { + throw exception::AlibException("Can't compose variant type"); +} + +template<typename T, typename R, typename ... Ts> +void composeVariantHelper(std::deque<sax::Token>& out, const T& container) { + if(container.template is<R>()) return alib::xmlApi<R>::compose(out, container.template get<R>()); + composeVariantHelper<T, Ts...>(out, container); +} + +template<typename ... Ts> +void ContainerToXMLComposer::compose(std::deque<sax::Token>& out, const std::variant<Ts...>& container) const { + composeVariantHelper<std::variant<Ts...>, Ts...>(out, container); +} +*/ + +#endif /* CONTAINER_TO_XML_COMPOSER_H_ */ + diff --git a/alib2data/src/container/ObjectsMap.cpp b/alib2data/src/container/ObjectsMap.cpp index f2ef28c1ba..80ebe118d6 100644 --- a/alib2data/src/container/ObjectsMap.cpp +++ b/alib2data/src/container/ObjectsMap.cpp @@ -9,8 +9,19 @@ #include <sstream> +#include "Container.h" +#include "../XmlApi.hpp" + namespace container { +ObjectsMap::ObjectsMap(std::map<alib::Object, alib::Object> map) : std::map<alib::Object, alib::Object>(std::move(map)) { + +} + +ObjectsMap::ObjectsMap() : std::map<alib::Object, alib::Object>() { + +} + ContainerBase* ObjectsMap::clone() const { return new ObjectsMap(*this); } @@ -34,4 +45,20 @@ ObjectsMap::operator std::string() const { return std::move(ss).str(); } +const std::string ObjectsMap::XML_TAG_NAME = "Map"; + +ObjectsMap ObjectsMap::parse(std::deque<sax::Token>::iterator& input) { + return ObjectsMap(parseRaw<alib::Object, alib::Object>(input)); +} + +void ObjectsMap::compose(std::deque<sax::Token>& out) const { + compose(out, *this); +} + } /* namespace container */ + +namespace alib { + +xmlApi<container::Container>::ParserRegister<container::ObjectsMap> objectsMapParserRegister = xmlApi<container::Container>::ParserRegister<container::ObjectsMap>(container::ObjectsMap::XML_TAG_NAME, container::ObjectsMap::parse); + +} /* namespace alib */ diff --git a/alib2data/src/container/ObjectsMap.h b/alib2data/src/container/ObjectsMap.h index 3dfb873378..c80cac8baf 100644 --- a/alib2data/src/container/ObjectsMap.h +++ b/alib2data/src/container/ObjectsMap.h @@ -13,6 +13,9 @@ #include "../object/Object.h" #include "ContainerBase.h" +#include "ObjectsPair.h" + +#include "../XmlApi.hpp" namespace container { @@ -22,6 +25,9 @@ namespace container { */ class ObjectsMap : public std::map<alib::Object, alib::Object>, public std::acceptor<ObjectsMap, VisitableContainerBase, std::acceptor<ObjectsMap, alib::VisitableObjectBase, ContainerBase> > { public: + explicit ObjectsMap(std::map<alib::Object, alib::Object>); + explicit ObjectsMap(); + virtual ContainerBase* clone() const; virtual ContainerBase* plunder() &&; @@ -39,8 +45,42 @@ public: virtual int selfTypeId() const { return typeId(*this); } + + const static std::string XML_TAG_NAME; + + static ObjectsMap parse(std::deque<sax::Token>::iterator& input); + template<class T, class R> + static std::map<T, R> parseRaw(std::deque<sax::Token>::iterator& input); + + void compose(std::deque<sax::Token>& out) const; + template<class T, class R> + static void compose(std::deque<sax::Token>& out, const std::map<T, R>& input); }; +template<class T, class R> +std::map<T, R> ObjectsMap::parseRaw(std::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, ObjectsMap::XML_TAG_NAME); + + std::map<T, R> map; + while(sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { + map.insert(alib::xmlApi<std::pair<T, R>>::parse(input)); + } + + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, ObjectsMap::XML_TAG_NAME); + return map; +} + +template<class T, class R> +void ObjectsMap::compose(std::deque<sax::Token>& out, const std::map<T, R>& input) { + out.emplace_back(ObjectsMap::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT); + + for(const std::pair<T, R>& item : input) { + alib::xmlApi<std::pair<T, R>>::compose(out, item); + } + + out.emplace_back(ObjectsMap::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); +} + } /* namespace container */ namespace std { @@ -54,4 +94,30 @@ struct compare<container::ObjectsMap> { } /* namespace std */ +namespace alib { + +template<typename T, typename R> +struct xmlApi<std::map<T, R>> { + static std::map<T, R> parse(std::deque<sax::Token>::iterator& input); + static bool first(const std::deque<sax::Token>::const_iterator& input); + static void compose(std::deque<sax::Token>& output, const std::map<T, R>& data); +}; + +template<typename T, typename R> +std::map<T, R> xmlApi<std::map<T, R>>::parse(std::deque<sax::Token>::iterator& input) { + return container::ObjectsMap::parseRaw<T, R>(input); +} + +template<typename T, typename R> +bool xmlApi<std::map<T, R>>::first(const std::deque<sax::Token>::const_iterator& input) { + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, container::ObjectsMap::XML_TAG_NAME); +} + +template<typename T, typename R> +void xmlApi<std::map<T, R>>::compose(std::deque<sax::Token>& output, const std::map<T, R>& input) { + return container::ObjectsMap::compose<T, R>(output, input); +} + +} /* namespace alib */ + #endif /* OBJECTS_MAP_H_ */ diff --git a/alib2data/src/container/ObjectsPair.cpp b/alib2data/src/container/ObjectsPair.cpp index e0bccbfebb..2d5ce1b983 100644 --- a/alib2data/src/container/ObjectsPair.cpp +++ b/alib2data/src/container/ObjectsPair.cpp @@ -9,8 +9,15 @@ #include <sstream> +#include "Container.h" +#include "../XmlApi.hpp" + namespace container { +ObjectsPair::ObjectsPair(std::pair<alib::Object, alib::Object> pair) : std::pair<alib::Object, alib::Object>(std::move(pair)) { + +} + ObjectsPair::ObjectsPair(alib::Object first, alib::Object second) : std::pair<alib::Object, alib::Object>(std::move(first), std::move(second)) { } @@ -38,4 +45,20 @@ ObjectsPair::operator std::string() const { return std::move(ss).str(); } +const std::string ObjectsPair::XML_TAG_NAME = "Pair"; + +ObjectsPair ObjectsPair::parse(std::deque<sax::Token>::iterator& input) { + return ObjectsPair(parseRaw<alib::Object, alib::Object>(input)); +} + +void ObjectsPair::compose(std::deque<sax::Token>& out) const { + compose(out, *this); +} + } /* namespace container */ + +namespace alib { + +xmlApi<container::Container>::ParserRegister<container::ObjectsPair> objectsPairParserRegister = xmlApi<container::Container>::ParserRegister<container::ObjectsPair>(container::ObjectsPair::XML_TAG_NAME, container::ObjectsPair::parse); + +} /* namespace alib */ diff --git a/alib2data/src/container/ObjectsPair.h b/alib2data/src/container/ObjectsPair.h index 3b767d6943..139cde25f4 100644 --- a/alib2data/src/container/ObjectsPair.h +++ b/alib2data/src/container/ObjectsPair.h @@ -14,6 +14,8 @@ #include "../object/Object.h" #include "ContainerBase.h" +#include "../XmlApi.hpp" + namespace container { /** @@ -23,6 +25,7 @@ namespace container { class ObjectsPair : public std::pair<alib::Object, alib::Object>, public std::acceptor<ObjectsPair, VisitableContainerBase, std::acceptor<ObjectsPair, alib::VisitableObjectBase, ContainerBase> > { public: explicit ObjectsPair(alib::Object first, alib::Object second); + explicit ObjectsPair(std::pair<alib::Object, alib::Object>); virtual ContainerBase* clone() const; @@ -41,8 +44,39 @@ public: virtual int selfTypeId() const { return typeId(*this); } + + const static std::string XML_TAG_NAME; + + static ObjectsPair parse(std::deque<sax::Token>::iterator& input); + template<class T, class R> + static std::pair<T, R> parseRaw(std::deque<sax::Token>::iterator& input); + + void compose(std::deque<sax::Token>& out) const; + template<class T, class R> + static void compose(std::deque<sax::Token>& out, const std::pair<T, R>& input); }; +template<class T, class R> +std::pair<T, R> ObjectsPair::parseRaw(std::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, ObjectsPair::XML_TAG_NAME); + + T first = alib::xmlApi<T>::parse(input); + R second = alib::xmlApi<R>::parse(input); + + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, ObjectsPair::XML_TAG_NAME); + return std::make_pair(std::move(first), std::move(second)); +} + +template<class T, class R> +void ObjectsPair::compose(std::deque<sax::Token>& out, const std::pair<T, R>& input) { + out.emplace_back(ObjectsPair::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT); + + alib::xmlApi<T>::compose(out, input.first); + alib::xmlApi<R>::compose(out, input.second); + + out.emplace_back(ObjectsPair::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); +} + } /* namespace container */ namespace std { @@ -56,4 +90,30 @@ struct compare<container::ObjectsPair> { } /* namespace std */ +namespace alib { + +template<typename T, typename R> +struct xmlApi<std::pair<T, R>> { + static std::pair<T, R> parse(std::deque<sax::Token>::iterator& input); + static bool first(const std::deque<sax::Token>::const_iterator& input); + static void compose(std::deque<sax::Token>& output, const std::pair<T, R>& data); +}; + +template<typename T, typename R> +std::pair<T, R> xmlApi<std::pair<T, R>>::parse(std::deque<sax::Token>::iterator& input) { + return container::ObjectsPair::parseRaw<T, R>(input); +} + +template<typename T, typename R> +bool xmlApi<std::pair<T, R>>::first(const std::deque<sax::Token>::const_iterator& input) { + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, container::ObjectsPair::XML_TAG_NAME); +} + +template<typename T, typename R> +void xmlApi<std::pair<T, R>>::compose(std::deque<sax::Token>& output, const std::pair<T, R>& input) { + return container::ObjectsPair::compose<T, R>(output, input); +} + +} /* namespace alib */ + #endif /* OBJECTS_PAIR_H_ */ diff --git a/alib2data/src/container/ObjectsSet.cpp b/alib2data/src/container/ObjectsSet.cpp index 2bfa5b04fc..1cf2a14eee 100644 --- a/alib2data/src/container/ObjectsSet.cpp +++ b/alib2data/src/container/ObjectsSet.cpp @@ -7,10 +7,19 @@ #include "ObjectsSet.h" +#include "Container.h" #include <sstream> namespace container { +ObjectsSet::ObjectsSet(std::set<alib::Object> set) : std::set<alib::Object>(std::move(set)) { + +} + +ObjectsSet::ObjectsSet() : std::set<alib::Object>() { + +} + ContainerBase* ObjectsSet::clone() const { return new ObjectsSet(*this); } @@ -34,4 +43,20 @@ ObjectsSet::operator std::string() const { return std::move(ss).str(); } +const std::string ObjectsSet::XML_TAG_NAME = "Set"; + +ObjectsSet ObjectsSet::parse(std::deque<sax::Token>::iterator& input) { + return ObjectsSet(parseRaw<alib::Object>(input)); +} + +void ObjectsSet::compose(std::deque<sax::Token>& out) const { + compose(out, *this); +} + } /* namespace container */ + +namespace alib { + +xmlApi<container::Container>::ParserRegister<container::ObjectsSet> objectsSetParserRegister = xmlApi<container::Container>::ParserRegister<container::ObjectsSet>(container::ObjectsSet::XML_TAG_NAME, container::ObjectsSet::parse); + +} /* namespace alib */ diff --git a/alib2data/src/container/ObjectsSet.h b/alib2data/src/container/ObjectsSet.h index 3085983a94..01bf0f0e82 100644 --- a/alib2data/src/container/ObjectsSet.h +++ b/alib2data/src/container/ObjectsSet.h @@ -14,6 +14,8 @@ #include "../object/Object.h" #include "ContainerBase.h" +#include "../XmlApi.hpp" + namespace container { /** @@ -22,6 +24,9 @@ namespace container { */ class ObjectsSet : public std::set<alib::Object>, public std::acceptor<ObjectsSet, VisitableContainerBase, std::acceptor<ObjectsSet, alib::VisitableObjectBase, ContainerBase> > { public: + explicit ObjectsSet(std::set<alib::Object>); + explicit ObjectsSet(); + virtual ContainerBase* clone() const; virtual ContainerBase* plunder() &&; @@ -39,8 +44,42 @@ public: virtual int selfTypeId() const { return typeId(*this); } + + const static std::string XML_TAG_NAME; + + static ObjectsSet parse(std::deque<sax::Token>::iterator& input); + template<class T> + static std::set<T> parseRaw(std::deque<sax::Token>::iterator& input); + + void compose(std::deque<sax::Token>& out) const; + template<class T> + static void compose(std::deque<sax::Token>& out, const std::set<T>& input); }; +template<class T> +std::set<T> ObjectsSet::parseRaw(std::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, ObjectsSet::XML_TAG_NAME); + + std::set<T> set; + while(sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { + set.insert(alib::xmlApi<T>::parse(input)); + } + + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, ObjectsSet::XML_TAG_NAME); + return set; +} + +template<class T> +void ObjectsSet::compose(std::deque<sax::Token>& out, const std::set<T>& input) { + out.emplace_back(ObjectsSet::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT); + + for(const T& item : input) { + alib::xmlApi<T>::compose(out, item); + } + + out.emplace_back(ObjectsSet::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); +} + } /* namespace container */ namespace std { @@ -54,4 +93,30 @@ struct compare<container::ObjectsSet> { } /* namespace std */ +namespace alib { + +template<typename T> +struct xmlApi<std::set<T>> { + static std::set<T> parse(std::deque<sax::Token>::iterator& input); + static bool first(const std::deque<sax::Token>::const_iterator& input); + static void compose(std::deque<sax::Token>& output, const std::set<T>& data); +}; + +template<typename T> +std::set<T> xmlApi<std::set<T>>::parse(std::deque<sax::Token>::iterator& input) { + return container::ObjectsSet::parseRaw<T>(input); +} + +template<typename T> +bool xmlApi<std::set<T>>::first(const std::deque<sax::Token>::const_iterator& input) { + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, container::ObjectsSet::XML_TAG_NAME); +} + +template<typename T> +void xmlApi<std::set<T>>::compose(std::deque<sax::Token>& output, const std::set<T>& input) { + return container::ObjectsSet::compose<T>(output, input); +} + +} /* namespace alib */ + #endif /* OBJECTS_SET_H_ */ diff --git a/alib2data/src/container/ObjectsVector.cpp b/alib2data/src/container/ObjectsVector.cpp index 8f1b2abee5..93ee269c36 100644 --- a/alib2data/src/container/ObjectsVector.cpp +++ b/alib2data/src/container/ObjectsVector.cpp @@ -7,10 +7,19 @@ #include "ObjectsVector.h" +#include "Container.h" #include <sstream> namespace container { +ObjectsVector::ObjectsVector(std::vector<alib::Object> vector) : std::vector<alib::Object>(std::move(vector)) { + +} + +ObjectsVector::ObjectsVector() : std::vector<alib::Object>() { + +} + ContainerBase* ObjectsVector::clone() const { return new ObjectsVector(*this); } @@ -34,4 +43,20 @@ ObjectsVector::operator std::string() const { return std::move(ss).str(); } +const std::string ObjectsVector::XML_TAG_NAME = "Vector"; + +ObjectsVector ObjectsVector::parse(std::deque<sax::Token>::iterator& input) { + return ObjectsVector(parseRaw<alib::Object>(input)); +} + +void ObjectsVector::compose(std::deque<sax::Token>& out) const { + compose(out, *this); +} + } /* namespace container */ + +namespace alib { + +xmlApi<container::Container>::ParserRegister<container::ObjectsVector> objectsVectorParserRegister = xmlApi<container::Container>::ParserRegister<container::ObjectsVector>(container::ObjectsVector::XML_TAG_NAME, container::ObjectsVector::parse); + +} /* namespace alib */ diff --git a/alib2data/src/container/ObjectsVector.h b/alib2data/src/container/ObjectsVector.h index 56662f2872..8132b9ca92 100644 --- a/alib2data/src/container/ObjectsVector.h +++ b/alib2data/src/container/ObjectsVector.h @@ -14,6 +14,8 @@ #include "../object/Object.h" #include "ContainerBase.h" +#include "../XmlApi.hpp" + namespace container { /** @@ -22,6 +24,9 @@ namespace container { */ class ObjectsVector : public std::vector<alib::Object>, public std::acceptor<ObjectsVector, VisitableContainerBase, std::acceptor<ObjectsVector, alib::VisitableObjectBase, ContainerBase> > { public: + explicit ObjectsVector(std::vector<alib::Object>); + explicit ObjectsVector(); + virtual ContainerBase* clone() const; virtual ContainerBase* plunder() &&; @@ -39,8 +44,42 @@ public: virtual int selfTypeId() const { return typeId(*this); } + + const static std::string XML_TAG_NAME; + + static ObjectsVector parse(std::deque<sax::Token>::iterator& input); + template<class T> + static std::vector<T> parseRaw(std::deque<sax::Token>::iterator& input); + + void compose(std::deque<sax::Token>& out) const; + template<class T> + static void compose(std::deque<sax::Token>& out, const std::vector<T>& input); }; +template<class T> +std::vector<T> ObjectsVector::parseRaw(std::deque<sax::Token>::iterator& input) { + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, ObjectsVector::XML_TAG_NAME); + + std::vector<T> vector; + while(sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { + vector.push_back(alib::xmlApi<T>::parse(input)); + } + + sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, ObjectsVector::XML_TAG_NAME); + return vector; +} + +template<class T> +void ObjectsVector::compose(std::deque<sax::Token>& out, const std::vector<T>& input) { + out.emplace_back(ObjectsVector::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT); + + for(const T& item : input) { + alib::xmlApi<T>::compose(out, item); + } + + out.emplace_back(ObjectsVector::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT); +} + } /* namespace container */ namespace std { @@ -54,4 +93,30 @@ struct compare<container::ObjectsVector> { } /* namespace std */ +namespace alib { + +template<typename T> +struct xmlApi<std::vector<T>> { + static std::vector<T> parse(std::deque<sax::Token>::iterator& input); + static bool first(const std::deque<sax::Token>::const_iterator& input); + static void compose(std::deque<sax::Token>& output, const std::vector<T>& data); +}; + +template<typename T> +std::vector<T> xmlApi<std::vector<T>>::parse(std::deque<sax::Token>::iterator& input) { + return container::ObjectsVector::parseRaw<T>(input); +} + +template<typename T> +bool xmlApi<std::vector<T>>::first(const std::deque<sax::Token>::const_iterator& input) { + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, container::ObjectsVector::XML_TAG_NAME); +} + +template<typename T> +void xmlApi<std::vector<T>>::compose(std::deque<sax::Token>& output, const std::vector<T>& input) { + return container::ObjectsVector::compose<T>(output, input); +} + +} /* namespace alib */ + #endif /* OBJECTS_VECTOR_H_ */ diff --git a/alib2data/src/factory/XmlDataFactory.hpp b/alib2data/src/factory/XmlDataFactory.hpp index eba2629252..0d7988efc0 100644 --- a/alib2data/src/factory/XmlDataFactory.hpp +++ b/alib2data/src/factory/XmlDataFactory.hpp @@ -15,6 +15,7 @@ #include "../sax/SaxParseInterface.h" #include "../sax/SaxComposeInterface.h" #include "../XmlApi.hpp" +#include "../exception/AlibException.h" #include <chrono> namespace alib { diff --git a/alib2data/test-src/string/StringTest.cpp b/alib2data/test-src/string/StringTest.cpp index 67d3c28762..2419046fb3 100644 --- a/alib2data/test-src/string/StringTest.cpp +++ b/alib2data/test-src/string/StringTest.cpp @@ -1,4 +1,5 @@ #include <list> +#include <variant> #include "StringTest.h" #include "sax/SaxParseInterface.h" diff --git a/arun2/src/arun.cpp b/arun2/src/arun.cpp index de4d8fd165..f5616d6fc5 100644 --- a/arun2/src/arun.cpp +++ b/arun2/src/arun.cpp @@ -18,6 +18,7 @@ #include <automaton/run/Accept.h> #include <automaton/run/Result.h> #include <automaton/run/Occurrences.h> +#include <container/ObjectsSet.h> #include <iostream> diff --git a/astat2/src/AutomataStat.cpp b/astat2/src/AutomataStat.cpp index e875d94608..3fc714af9e 100644 --- a/astat2/src/AutomataStat.cpp +++ b/astat2/src/AutomataStat.cpp @@ -13,6 +13,9 @@ #include <automaton/FSM/DFA.h> #include <factory/XmlDataFactory.hpp> +#include <container/ObjectsSet.h> +#include <container/ObjectsMap.h> +#include <iostream> void AutomataStat::stat(const automaton::Automaton& automaton, const AutomataSettings& settings) { automaton.getData().Accept((void*) &settings, AutomataStat::AUTOMATA_STAT); diff --git a/astat2/src/SetStat.cpp b/astat2/src/SetStat.cpp index 1a3aaf8379..7201c11e24 100644 --- a/astat2/src/SetStat.cpp +++ b/astat2/src/SetStat.cpp @@ -10,6 +10,7 @@ #include <exception/AlibException.h> #include <factory/XmlDataFactory.hpp> +#include <iostream> void SetStat::stat(const container::ObjectsSet& data, const SetSettings& settings) { switch(settings.general) { diff --git a/astringology2/src/astringology.cpp b/astringology2/src/astringology.cpp index 79cd933851..9981dc54d4 100644 --- a/astringology2/src/astringology.cpp +++ b/astringology2/src/astringology.cpp @@ -13,6 +13,8 @@ #include <string/String.h> #include <automaton/Automaton.h> #include <container/Container.h> +#include <container/ObjectsSet.h> +#include <container/ObjectsVector.h> #include <stringology/exact/ExactFactorMatch.h> #include <stringology/exact/BoyerMooreHorspool.h> -- GitLab