diff --git a/alib2xml/src/container/xml/ObjectsMultimap.cpp b/alib2xml/src/container/xml/ObjectsMultimap.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eb745fb05646603c27a29a19e5dce0e86d3179f9 --- /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 0000000000000000000000000000000000000000..5c00af552785132a5f4bfce5bc2d39d18459f71b --- /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_ */