From 05e61d693ef8099d5f6e3699d8655e89a7d25c3b Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Thu, 28 Mar 2019 20:24:04 +0100
Subject: [PATCH] xml api for Multimap

---
 .../src/container/xml/ObjectsMultimap.cpp     | 19 ++++++
 alib2xml/src/container/xml/ObjectsMultimap.h  | 60 +++++++++++++++++++
 2 files changed, 79 insertions(+)
 create mode 100644 alib2xml/src/container/xml/ObjectsMultimap.cpp
 create mode 100644 alib2xml/src/container/xml/ObjectsMultimap.h

diff --git a/alib2xml/src/container/xml/ObjectsMultimap.cpp b/alib2xml/src/container/xml/ObjectsMultimap.cpp
new file mode 100644
index 0000000000..eb745fb056
--- /dev/null
+++ b/alib2xml/src/container/xml/ObjectsMultimap.cpp
@@ -0,0 +1,19 @@
+/*
+ * Multimap.cpp
+ *
+ * Created on: Apr 1, 2013
+ * Author: Jan Travnicek
+ */
+
+#include "ObjectsMultimap.h"
+
+#include <registration/XmlRegistration.hpp>
+
+namespace {
+
+static auto xmlWrite = registration::XmlWriterRegister < ext::multimap < object::Object, object::Object > > ( );
+static auto xmlRead = registration::XmlReaderRegister < ext::multimap < object::Object, object::Object > > ( );
+
+static auto xmlGroup = registration::XmlRegisterTypeInGroup < object::Object, ext::multimap < object::Object, object::Object > > ( );
+
+} /* namespace */
diff --git a/alib2xml/src/container/xml/ObjectsMultimap.h b/alib2xml/src/container/xml/ObjectsMultimap.h
new file mode 100644
index 0000000000..5c00af5527
--- /dev/null
+++ b/alib2xml/src/container/xml/ObjectsMultimap.h
@@ -0,0 +1,60 @@
+/*
+ * Multimap.h
+ *
+ * Created on: Apr 1, 2013
+ * Author: Jan Travnicek
+ */
+
+#ifndef _XML_OBJECTS_MULTIMAP_H_
+#define _XML_OBJECTS_MULTIMAP_H_
+
+#include <alib/multimap>
+#include <core/xmlApi.hpp>
+#include <container/xml/ObjectsPair.h>
+
+namespace core {
+
+template < typename T, typename R >
+struct xmlApi < ext::multimap < T, R > > {
+	static ext::multimap < T, R > parse ( ext::deque < sax::Token >::iterator & input );
+	static bool first ( const ext::deque < sax::Token >::const_iterator & input );
+	static std::string xmlTagName ( );
+	static void compose ( ext::deque < sax::Token > & output, const ext::multimap < T, R > & data );
+};
+
+template < typename T, typename R >
+ext::multimap < T, R > xmlApi < ext::multimap < T, R > >::parse ( ext::deque < sax::Token >::iterator & input ) {
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) );
+
+	ext::multimap < T, R > multimap;
+
+	while ( sax::FromXMLParserHelper::isTokenType ( input, sax::Token::TokenType::START_ELEMENT ) )
+		multimap.insert ( core::xmlApi < ext::pair < T, R > >::parse ( input ) );
+
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, xmlTagName ( ) );
+	return multimap;
+}
+
+template < typename T, typename R >
+bool xmlApi < ext::multimap < T, R > >::first ( const ext::deque < sax::Token >::const_iterator & input ) {
+	return sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) );
+}
+
+template < typename T, typename R >
+std::string xmlApi < ext::multimap < T, R > >::xmlTagName ( ) {
+	return "Multimap";
+}
+
+template < typename T, typename R >
+void xmlApi < ext::multimap < T, R > >::compose ( ext::deque < sax::Token > & output, const ext::multimap < T, R > & input ) {
+	output.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT );
+
+	for ( const std::pair < const T, R > & item : input )
+		core::xmlApi < std::pair < const T, R > >::compose ( output, item );
+
+	output.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT );
+}
+
+} /* namespace core */
+
+#endif /* _XML_OBJECTS_MULTIMAP_H_ */
-- 
GitLab