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