diff --git a/alib2xml/src/core/xmlApi.hpp b/alib2xml/src/core/xmlApi.hpp index 7115e1de792335ce80a8b382f6095595971c88d4..6959f95087dfc868b90b71b3d877f86ccad0298b 100644 --- a/alib2xml/src/core/xmlApi.hpp +++ b/alib2xml/src/core/xmlApi.hpp @@ -29,49 +29,28 @@ template < typename T, typename Enable = void > struct xmlApi { }; class xmlApiInputContext : public ext::deque < sax::Token >::iterator { - template < typename T, typename Enable > - friend struct xmlApi; - - ext::map < std::string, ext::map < int, object::Object * > > idToInstanceContexts; - int idMaxContext; + ext::map < int, object::Object > idToInstanceContexts; public: - xmlApiInputContext ( ext::deque < sax::Token >::iterator iter ) : ext::deque < sax::Token >::iterator ( iter ), idMaxContext ( 0 ) { - } - - ~xmlApiInputContext ( ) { - for ( const std::pair < const std::string, ext::map < int, object::Object * > > context : idToInstanceContexts ) - for ( const std::pair < const int, object::Object * > entry : context.second ) - delete entry.second; - } - - ext::map < int, object::Object * > & idToInstance ( const std::string & name ) { - return idToInstanceContexts[name]; + xmlApiInputContext ( ext::deque < sax::Token >::iterator iter ) : ext::deque < sax::Token >::iterator ( iter ) { } - int & idMax ( ) { - return idMaxContext; - } - - const ext::map < std::string, ext::map < int, object::Object * > > & dump ( ) const { + ext::map < int, object::Object > & idToInstance ( ) { return idToInstanceContexts; } }; class xmlApiOutputContext : public ext::deque < sax::Token > { - template < typename T, typename Enable > - friend struct xmlApi; - - ext::map < std::string, ext::map < const base::CommonBaseBase *, int > > instanceToIdContexts; + ext::map < object::Object, int > instanceToIdContexts; int idMaxContext; public: xmlApiOutputContext ( ) : idMaxContext ( 0 ) { } - ext::map < const base::CommonBaseBase *, int > & instanceToId ( const std::string & name ) { - return instanceToIdContexts[name]; + ext::map < object::Object, int > & instanceToId ( ) { + return instanceToIdContexts; } int & idMax ( ) { @@ -179,14 +158,14 @@ public: int id = ext::from_string < int > ( sax::FromXMLParserHelper::popTokenData ( input, sax::Token::TokenType::CHARACTER ) ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ATTRIBUTE, "id" ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "Ref" ); - ext::map < int, object::Object * >::iterator elem = input.idToInstance ( ext::to_string < object::Object > ( ) ).find ( id ); + ext::map < int, object::Object >::iterator elem = input.idToInstance ( ).find ( id ); - if ( elem == input.idToInstance ( ext::to_string < object::Object > ( ) ).end ( ) ) { - common::Streams::err << input.dump ( ) << std::endl; - throw exception::CommonException ( "XML Inconsistent ( id not found " + ext::to_string ( id ) + " )" ); + if ( elem == input.idToInstance ( ).end ( ) ) { + common::Streams::err << input.idToInstance ( ) << std::endl; + throw exception::CommonException ( "XML Inconsistent ( id not found " + ext::to_string ( id ) + " )" ); } - return * ( ( object::Object * ) elem->second ); + return elem->second; } else { typename ext::map < std::string, std::unique_ptr < GroupParser > >::iterator callback = parseFunctions ( ).find ( tagName ); @@ -204,7 +183,7 @@ public: /* if object is a base of reference, register it */ if ( ref ) - input.idToInstance ( ext::to_string < object::Object > ( ) ).insert ( std::make_pair ( id, ( object::Object * ) new object::Object ( res ) ) ); + input.idToInstance ( ).insert ( std::make_pair ( id, res ) ); return res; } @@ -231,9 +210,9 @@ public: static void compose ( ext::deque < sax::Token > & output, const object::Object & data ) { xmlApiOutputContext & context = ( xmlApiOutputContext & ) output; - typename ext::map < const base::CommonBaseBase *, int >::iterator elem = context.instanceToId ( ext::to_string < object::Object > ( ) ).find ( static_cast < const base::CommonBaseBase * > ( & data.getData ( ) ) ); + typename ext::map < object::Object, int >::iterator elem = context.instanceToId ( ).find ( data ); - if ( common::GlobalData::optimizeXml && elem != context.instanceToId ( ext::to_string < object::Object > ( ) ).end ( ) ) { + if ( common::GlobalData::optimizeXml && elem != context.instanceToId ( ).end ( ) ) { output.emplace_back ( "Ref", sax::Token::TokenType::START_ELEMENT ); output.emplace_back ( "id", sax::Token::TokenType::START_ATTRIBUTE ); output.emplace_back ( ext::to_string ( elem->second ), sax::Token::TokenType::CHARACTER ); @@ -262,7 +241,7 @@ public: output.emplace ( output.begin ( ) + pos + 2, ext::to_string ( id ), sax::Token::TokenType::CHARACTER ); output.emplace ( output.begin ( ) + pos + 3, "ref", sax::Token::TokenType::END_ATTRIBUTE ); - context.instanceToId ( ext::to_string < object::Object > ( ) ).insert ( std::make_pair ( static_cast< const base::CommonBaseBase * > ( & data.getData ( ) ), id ) ); + context.instanceToId ( ).insert ( std::make_pair ( data, id ) ); } } }