Skip to content
Snippets Groups Projects
Commit 9b983dc9 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

make xmlApi contexts typed

parent ede58166
No related branches found
No related tags found
No related merge requests found
......@@ -31,7 +31,7 @@ class xmlApiInputContext : public std::deque < sax::Token >::iterator {
template < typename T, typename Enable >
friend struct xmlApi;
 
std::map < std::string, std::map < int, void * > > idToInstanceContexts;
std::map < std::string, std::map < int, WrapperBaseBase * > > idToInstanceContexts;
int idMaxContext;
 
public:
......@@ -39,15 +39,15 @@ public:
}
 
~xmlApiInputContext ( ) {
for ( const std::pair < const std::string, std::map < int, void * > > context : idToInstanceContexts ) {
std::function < void ( void * ) > & deleteCallback = deleteCallbacks ( ).find ( context.first )->second;
for ( const std::pair < const std::string, std::map < int, WrapperBaseBase * > > context : idToInstanceContexts ) {
std::function < void ( WrapperBaseBase * ) > & deleteCallback = deleteCallbacks ( ).find ( context.first )->second;
 
for ( const std::pair < const int, void * > entry : context.second )
for ( const std::pair < const int, WrapperBaseBase * > entry : context.second )
deleteCallback ( entry.second );
}
}
 
std::map < int, void * > & idToInstance ( const std::string & name ) {
std::map < int, WrapperBaseBase * > & idToInstance ( const std::string & name ) {
return idToInstanceContexts[name];
}
 
......@@ -55,13 +55,13 @@ public:
return idMaxContext;
}
 
static std::map < std::string, std::function < void ( void * ) > > & deleteCallbacks ( ) {
static std::map < std::string, std::function < void ( void * ) > > res;
static std::map < std::string, std::function < void ( WrapperBaseBase * ) > > & deleteCallbacks ( ) {
static std::map < std::string, std::function < void ( WrapperBaseBase * ) > > res;
 
return res;
}
 
const std::map < std::string, std::map < int, void * > > & dump ( ) const {
const std::map < std::string, std::map < int, WrapperBaseBase * > > & dump ( ) const {
return idToInstanceContexts;
}
 
......@@ -71,14 +71,14 @@ class xmlApiOutputContext : public std::deque < sax::Token > {
template < typename T, typename Enable >
friend struct xmlApi;
 
std::map < std::string, std::map < void *, int > > instanceToIdContexts;
std::map < std::string, std::map < CommonBaseBase *, int > > instanceToIdContexts;
int idMaxContext;
 
public:
xmlApiOutputContext ( ) : idMaxContext ( 0 ) {
}
 
std::map < void *, int > & instanceToId ( const std::string & name ) {
std::map < CommonBaseBase *, int > & instanceToId ( const std::string & name ) {
return instanceToIdContexts[name];
}
 
......@@ -105,7 +105,7 @@ public:
class InputContextDeleter {
public:
InputContextDeleter ( ) {
std::function < void ( void * ) > deleteCallback = [] ( void * pointer ) { delete ( Group * ) pointer; };
std::function < void ( WrapperBaseBase * ) > deleteCallback = [] ( WrapperBaseBase * pointer ) { delete ( Group * ) pointer; };
xmlApiInputContext::deleteCallbacks ( ).insert ( std::make_pair ( std::type_name < Group > ( ), deleteCallback ) );
}
 
......@@ -137,7 +137,7 @@ public:
int id = std::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" );
std::map < int, void * >::iterator elem = input.idToInstance ( std::type_name < Group > ( ) ).find ( id );
std::map < int, WrapperBaseBase * >::iterator elem = input.idToInstance ( std::type_name < Group > ( ) ).find ( id );
 
if ( elem == input.idToInstance ( std::type_name < Group > ( ) ).end ( ) ) {
std::cerr << input.dump ( ) << std::endl;
......@@ -162,7 +162,7 @@ public:
 
/* if object is a base of reference, register it */
if ( ref )
input.idToInstance ( std::type_name < Group > ( ) ).insert ( std::make_pair ( id, ( void * ) res ) );
input.idToInstance ( std::type_name < Group > ( ) ).insert ( std::make_pair ( id, ( WrapperBaseBase * ) res ) );
 
return * res;
}
......@@ -183,7 +183,7 @@ public:
static void compose ( std::deque < sax::Token > & output, const Group & data ) {
xmlApiOutputContext & context = ( xmlApiOutputContext & ) output;
 
typename std::map < void *, int >::iterator elem = context.instanceToId ( std::type_name < Group > ( ) ).find ( const_cast< void * >(static_cast< const void * > ( & data.getData ( ) ) ) );
typename std::map < CommonBaseBase *, int >::iterator elem = context.instanceToId ( std::type_name < Group > ( ) ).find ( const_cast < CommonBaseBase * > ( static_cast < const CommonBaseBase * > ( & data.getData ( ) ) ) );
 
if ( common::GlobalData::optimizeXml && elem != context.instanceToId ( std::type_name < Group > ( ) ).end ( ) ) {
output.emplace_back ( "Ref", sax::Token::TokenType::START_ELEMENT );
......@@ -208,7 +208,7 @@ public:
output.emplace ( output.begin ( ) + pos + 2, std::to_string ( id ) , sax::Token::TokenType::CHARACTER );
output.emplace ( output.begin ( ) + pos + 3, "ref", sax::Token::TokenType::END_ATTRIBUTE );
 
context.instanceToId ( std::type_name < Group > ( ) ).insert ( std::make_pair ( const_cast< void * > ( static_cast< const void * > ( & data.getData ( ) ) ), id ) );
context.instanceToId ( std::type_name < Group > ( ) ).insert ( std::make_pair ( const_cast< CommonBaseBase * > ( static_cast< const CommonBaseBase * > ( & data.getData ( ) ) ), id ) );
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment