-
Jan Trávníček authoredJan Trávníček authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
XmlParserRegistry.hpp 1.85 KiB
/*
* XmlParserRegistry.hpp
*
* Created on: 11. 7. 2017
* Author: Jan Travnicek
*/
#ifndef _XML_PARSER_REGISTRY_HPP_
#define _XML_PARSER_REGISTRY_HPP_
#include <memory>
#include <string>
#include <exception/CommonException.h>
#include <abstraction/OperationAbstraction.hpp>
namespace abstraction {
class XmlParserRegistry {
class Entry {
public:
virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ext::deque < sax::Token > data ) const = 0;
};
template < class Return >
class EntryImpl : public Entry {
public:
EntryImpl ( ) {
}
virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ext::deque < sax::Token > data ) const override;
};
static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) {
static ext::map < std::string, std::unique_ptr < Entry > > parsers;
return parsers;
}
public:
template < class ReturnType >
static void registerXmlParser ( std::string result ) {
getEntries ( ).insert ( std::make_pair ( result, std::unique_ptr < Entry > ( new EntryImpl < ReturnType > ( ) ) ) );
}
template < class ReturnType >
static void registerXmlParser ( ) {
std::string ret = alib::xmlApi < ReturnType >::xmlTagName ( );
registerXmlParser < ReturnType > ( ret );
}
static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & typeName, ext::deque < sax::Token > tokens );
};
} /* namespace abstraction */
#include <abstraction/XmlParserAbstraction.hpp>
namespace abstraction {
template < class Return >
std::shared_ptr < abstraction::OperationAbstraction > XmlParserRegistry::EntryImpl < Return >::getAbstraction ( ext::deque < sax::Token > data ) const {
return std::make_shared < abstraction::XmlParserAbstraction < Return > > ( std::move ( data ) );
}
} /* namespace abstraction */
#endif /* _XML_PARSER_REGISTRY_HPP_ */