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

refactor cast capability to be fully dynamic

parent ef5bd30e
No related branches found
No related tags found
No related merge requests found
Showing
with 147 additions and 341 deletions
/*
* acast.cpp
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include <exception/AlibException.h>
#include <factory/XmlDataFactory.hpp>
#include <type_traits>
template<typename ToType, typename FromType, typename std::enable_if< std::is_constructible<ToType, FromType>::value >::type* = nullptr >
ToType cast(const FromType& orig) {
return ToType(orig);
}
template<typename ToType, typename FromType, typename std::enable_if< ! std::is_constructible<ToType, FromType>::value >::type* = nullptr >
ToType cast(const FromType& /* orig */) {
throw exception::AlibException(std::string("Invalid cast from ") + typeid(FromType).name() + " to " + typeid(ToType).name());
}
// --------------------------------------------------------------------------------------------------------------
template<typename FromBaseVisitor, typename ToType, typename ToWrapper, typename ... FromTypes>
class cast_implementer_helper;
template<typename FromBaseVisitor, typename ToType, typename ToWrapper>
class cast_implementer_helper< FromBaseVisitor, ToType, ToWrapper > : public FromBaseVisitor {
};
template<typename FromBaseVisitor, typename ToType, typename ToWrapper, typename FromType, typename ... FromTypes>
class cast_implementer_helper<FromBaseVisitor, ToType, ToWrapper, FromType, FromTypes ...> : public cast_implementer_helper<FromBaseVisitor, ToType, ToWrapper, FromTypes ...> {
public:
#ifdef __llvm__
using cast_implementer_helper<FromBaseVisitor, ToType, ToWrapper, FromTypes ...>::Visit;
#endif
void Visit(void*, const FromType& orig) const;
};
template<typename FromBaseVisitor, typename ToType, typename ToWrapper, typename FromType, typename ... FromTypes>
void cast_implementer_helper<FromBaseVisitor, ToType, ToWrapper, FromType, FromTypes ...>::Visit(void* data, const FromType& orig) const {
ToWrapper* & out = *((ToWrapper**) data);
out = new ToWrapper(cast<ToType, FromType>(orig));
}
// --------------------------------------------------------------------------------------------------------------------
template<typename FromBaseVisitor, typename FromBase, typename ToWrapper, typename ToType, typename FromTypes>
class cast_implementer {
};
template<typename FromBaseVisitor, typename FromBase, typename ToWrapper, typename ToType, typename ... FromTypes>
class cast_implementer< FromBaseVisitor, FromBase, ToWrapper, ToType, std::tuple< FromTypes ... > > : public cast_implementer_helper< FromBaseVisitor, ToType, ToWrapper, FromTypes ... > {
public:
using cast_implementer_helper<FromBaseVisitor, ToType, ToWrapper, FromTypes ... >::Visit;
static ToWrapper cast(const FromBase& obj);
};
template<typename FromBaseVisitor, typename FromBase, typename ToWrapper, typename ToType, typename ... FromTypes>
ToWrapper cast_implementer<FromBaseVisitor, FromBase, ToWrapper, ToType, std::tuple< FromTypes ... > >::cast(const FromBase& obj) {
cast_implementer<FromBaseVisitor, FromBase, ToWrapper, ToType, std::tuple< FromTypes ... > > tmp;
ToWrapper* out = NULL;
obj.Accept((void*) &out, tmp);
ToWrapper res = std::move(*out);
delete out;
return res;
}
// ----------------------------------------------------------------------------------------
template<typename FromBaseVisitor, typename FromBase, typename FromTypes, typename ToWrapper, typename ... ToTypes >
class cast_helper;
template<typename FromBaseVisitor, typename FromBase, typename FromTypes, typename ToWrapper >
class cast_helper<FromBaseVisitor, FromBase, FromTypes, ToWrapper> {
public:
static ToWrapper do_cast(const std::string&, const FromBase&/* obj*/) {
throw exception::AlibException("invalid type specified");
}
};
template<typename FromBaseVisitor, typename FromBase, typename FromTypes, typename ToWrapper, typename ToType, typename ... ToTypes >
class cast_helper< FromBaseVisitor, FromBase, FromTypes, ToWrapper, ToType, ToTypes ... > : public cast_helper< FromBaseVisitor, FromBase, FromTypes, ToWrapper, ToTypes ...> {
public:
static ToWrapper do_cast(const std::string& name, const FromBase& obj);
};
template<typename FromBaseVisitor, typename FromBase, typename FromTypes, typename ToWrapper, typename ToType, typename ... ToTypes >
ToWrapper cast_helper<FromBaseVisitor, FromBase, FromTypes, ToWrapper, ToType, ToTypes ...>::do_cast(const std::string& name, const FromBase& obj) {
if(std::is_same_type<ToType>(name.c_str())) {
return cast_implementer<FromBaseVisitor, FromBase, ToWrapper, ToType, FromTypes>::cast(obj);
} else {
return cast_helper<FromBaseVisitor, FromBase, FromTypes, ToWrapper, ToTypes ...>::do_cast(name, obj);
}
}
// -----------------------------------------------------------------------------------------
// visitor, fromType (base), toType (wrapper), possible from types, possible to types
template<typename FromBaseVisitor, typename FromBase, typename FromTypes, typename ToWrapper, typename ToTypes>
class cast_base_helper {
};
template<typename FromBaseVisitor, typename FromBase, typename ... FromTypes, typename ToWrapper, typename ... ToTypes>
class cast_base_helper< FromBaseVisitor, FromBase, std::tuple<FromTypes ...>, ToWrapper, std::tuple< ToTypes ... > > : public cast_helper< FromBaseVisitor, FromBase, std::tuple< FromTypes ...>, ToWrapper, ToTypes ... > {
public:
};
//typedef cast_base_helper< alib::VisitableObjectBase::const_visitor_type, alib::ObjectBase, alib::Types > ObjectCastVisitor;
......@@ -12,13 +12,7 @@
#include <sax/SaxParseInterface.h>
#include <sax/ParserException.h>
#include <object/Object.h>
#include <string/LinearString.h>
#include "cast/AutomatonCastVisitor.h"
#include "cast/GrammarCastVisitor.h"
#include "cast/RegExpCastVisitor.h"
#include "cast/TreeCastVisitor.h"
#include "cast/TreeToStringCastVisitor.h"
#include "CastApi.hpp"
 
// -----------------------------------------------------------------------------------------
 
......@@ -53,72 +47,17 @@ int main(int argc, char** argv) {
sax::SaxParseInterface::parseStdin(tokens);
}
 
/*alib::Object object = alib::XmlDataFactory::fromTokens<alib::Object>(tokens);
CastBaseVisitor::do_cast(type.getValue(), object.getData());*/
if(alib::XmlDataFactory::first<tree::PrefixRankedTree>(tokens) && std::is_same_type<string::LinearString>(type.getValue().c_str())) {
tree::Tree tree = alib::XmlDataFactory::fromTokens<tree::Tree>(tokens);
std::chrono::measurements::end();
std::chrono::measurements::start("Cast", std::chrono::measurements::Type::MAIN);
string::String res = TreeToStringCastVisitor::doCast(type.getValue(), tree);
std::chrono::measurements::end();
std::chrono::measurements::start("Output write", std::chrono::measurements::Type::AUXILARY);
alib::XmlDataFactory::toStdout(res);
} else if(alib::XmlDataFactory::first<automaton::Automaton>(tokens)) {
automaton::Automaton automaton = alib::XmlDataFactory::fromTokens<automaton::Automaton>(tokens);
std::chrono::measurements::end();
std::chrono::measurements::start("Cast", std::chrono::measurements::Type::MAIN);
automaton::Automaton res = AutomatonCastVisitor::doCast(type.getValue(), automaton);
std::chrono::measurements::end();
std::chrono::measurements::start("Output write", std::chrono::measurements::Type::AUXILARY);
alib::XmlDataFactory::toStdout(res);
} else if(alib::XmlDataFactory::first<grammar::Grammar>(tokens)) {
grammar::Grammar grammar = alib::XmlDataFactory::fromTokens<grammar::Grammar>(tokens);
std::chrono::measurements::end();
std::chrono::measurements::start("Cast", std::chrono::measurements::Type::MAIN);
alib::Object in = alib::XmlDataFactory::fromTokens<alib::Object>(tokens);
 
grammar::Grammar res = GrammarCastVisitor::doCast(type.getValue(), grammar);
std::chrono::measurements::end();
std::chrono::measurements::start("Output write", std::chrono::measurements::Type::AUXILARY);
alib::XmlDataFactory::toStdout(res);
} else if(alib::XmlDataFactory::first<regexp::RegExp>(tokens)) {
regexp::RegExp regexp = alib::XmlDataFactory::fromTokens<regexp::RegExp>(tokens);
std::chrono::measurements::end();
std::chrono::measurements::start("Cast", std::chrono::measurements::Type::MAIN);
regexp::RegExp res = RegExpCastVisitor::doCast(type.getValue(), regexp);
std::chrono::measurements::end();
std::chrono::measurements::start("Output write", std::chrono::measurements::Type::AUXILARY);
alib::XmlDataFactory::toStdout(res);
} else if(alib::XmlDataFactory::first<tree::Tree>(tokens)) {
tree::Tree tree = alib::XmlDataFactory::fromTokens<tree::Tree>(tokens);
std::chrono::measurements::end();
std::chrono::measurements::start("Cast", std::chrono::measurements::Type::MAIN);
std::chrono::measurements::end();
std::chrono::measurements::start("Cast", std::chrono::measurements::Type::MAIN);
 
tree::Tree res = TreeCastVisitor::doCast(type.getValue(), tree);
alib::Object res = alib::castApi::getCastPool(type.getValue()).cast(in.getData());
 
std::chrono::measurements::end();
std::chrono::measurements::start("Output write", std::chrono::measurements::Type::AUXILARY);
std::chrono::measurements::end();
std::chrono::measurements::start("Output write", std::chrono::measurements::Type::AUXILARY);
 
alib::XmlDataFactory::toStdout(res);
} else {
throw exception::AlibException(std::string("Invalid cast from to ") + type.getValue());
}
alib::XmlDataFactory::toStdout(res);
 
std::chrono::measurements::end();
std::chrono::measurements::end();
......
/*
* AutomatonCastVisitor.cpp
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include "AutomatonCastVisitor.h"
#include "automaton/AutomatonClasses.h"
#include "../CastVisitorBase.hpp"
// fromVisitor, fromType (base), possible from types, toType (wrapper), possible to types
typedef cast_base_helper< automaton::VisitableAutomatonBase::const_visitor_type, automaton::AutomatonBase, alib::AutomatonTypes, automaton::Automaton, alib::AutomatonTypes > AutomatonCastVisitorType;
automaton::Automaton AutomatonCastVisitor::doCast(const std::string& name, const automaton::Automaton& orig) {
return AutomatonCastVisitorType::do_cast(name, orig.getData());
}
/*
* AutomatonCastVisitor.h
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include <string>
#include <automaton/Automaton.h>
class AutomatonCastVisitor {
public:
static automaton::Automaton doCast(const std::string& name, const automaton::Automaton& automaton);
};
/*
* GrammarCastVisitor.cpp
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include "GrammarCastVisitor.h"
#include "grammar/GrammarClasses.h"
#include "../CastVisitorBase.hpp"
typedef cast_base_helper< grammar::VisitableGrammarBase::const_visitor_type, grammar::GrammarBase, alib::GrammarTypes, grammar::Grammar, alib::GrammarTypes > GrammarCastVisitorType;
grammar::Grammar GrammarCastVisitor::doCast(const std::string& name, const grammar::Grammar& orig) {
return GrammarCastVisitorType::do_cast(name, orig.getData());
}
/*
* GrammarCastVisitor.h
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include <string>
#include <grammar/Grammar.h>
class GrammarCastVisitor {
public:
static grammar::Grammar doCast(const std::string& name, const grammar::Grammar& grammar);
};
/*
* RegExpCastVisitor.cpp
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include "RegExpCastVisitor.h"
#include "regexp/RegExpClasses.h"
#include "../CastVisitorBase.hpp"
typedef cast_base_helper< regexp::VisitableRegExpBase::const_visitor_type, regexp::RegExpBase, alib::RegExpTypes, regexp::RegExp, alib::RegExpTypes > RegExpCastVisitorType;
regexp::RegExp RegExpCastVisitor::doCast(const std::string& name, const regexp::RegExp& orig) {
return RegExpCastVisitorType::do_cast(name, orig.getData());
}
/*
* RegExpCastVisitor.h
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include <string>
#include <regexp/RegExp.h>
class RegExpCastVisitor {
public:
static regexp::RegExp doCast(const std::string& name, const regexp::RegExp& regexp);
};
/*
* TreeCastVisitor.cpp
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include "TreeCastVisitor.h"
#include "tree/TreeClasses.h"
#include "../CastVisitorBase.hpp"
typedef cast_base_helper< tree::VisitableTreeBase::const_visitor_type, tree::TreeBase, alib::TreeTypes, tree::Tree, alib::TreeTypes > TreeCastVisitorType;
tree::Tree TreeCastVisitor::doCast(const std::string& name, const tree::Tree& orig) {
return TreeCastVisitorType::do_cast(name, orig.getData());
}
/*
* TreeCastVisitor.h
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include <string>
#include <tree/Tree.h>
class TreeCastVisitor {
public:
static tree::Tree doCast(const std::string& name, const tree::Tree& tree);
};
/*
* TreeCastVisitor.cpp
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include "TreeToStringCastVisitor.h"
#include "string/StringClasses.h"
#include "tree/TreeClasses.h"
#include "../CastVisitorBase.hpp"
typedef cast_base_helper< tree::VisitableTreeBase::const_visitor_type, tree::TreeBase, alib::TreeTypes, string::String, alib::StringTypes > TreeToStringCastVisitorType;
string::String TreeToStringCastVisitor::doCast(const std::string& name, const tree::Tree& orig) {
return TreeToStringCastVisitorType::do_cast(name, orig.getData());
}
/*
* TreeCastVisitor.h
*
* Created on: 24. 2. 2014
* Author: Jan Travnicek
*/
#include <string>
#include <tree/Tree.h>
#include <string/String.h>
class TreeToStringCastVisitor {
public:
static string::String doCast(const std::string& name, const tree::Tree& tree);
};
/*
* CastApi.hpp
*
* Created on: Apr 1, 2013
* Author: Jan Travnicek
*/
#ifndef CAST_API_HPP_
#define CAST_API_HPP_
#include <functional>
#include <map>
#include <string>
#include "object/ObjectBase.h"
#include "object/Object.h"
namespace alib {
struct castApi {
class CastPoolBase {
protected:
std::map<long long, std::function<alib::Object(const alib::ObjectBase&)>> castFunctions;
public:
alib::Object cast(const alib::ObjectBase& from) {
std::map<long long, std::function<alib::Object(const alib::ObjectBase&)>>::iterator res = castFunctions.find(from.selfTypeId());
if(res == castFunctions.end())
throw std::bad_cast();
return res->second(from);
}
};
template<class To>
class CastPool : public CastPoolBase {
public:
template<class From>
void add() {
int a = 0;
castFunctions.insert(std::make_pair(From::typeId((const From&) a), [](const alib::ObjectBase& from) { return alib::Object(To((const From&) from)); } ));
}
};
private:
// INFO: Function exist to handle static order of initialisation
static std::map<long long, CastPoolBase*>& castFunctionsById() {
static std::map<long long, CastPoolBase*> res;
return res;
}
// INFO: Function exist to handle static order of initialisation
static std::map<std::string, CastPoolBase*>& castFunctionsByString() {
static std::map<std::string, CastPoolBase*> res;
return res;
}
public:
template<class To>
static CastPool<To>& getCastPool() {
int a = 0;
std::map<long long, CastPoolBase*>::iterator res = castFunctionsById().find(To::typeId((const To&) a));
if(res == castFunctionsById().end()) {
CastPool<To>* castPool = new CastPool<To>();
castPool->template add<To>();
return * (CastPool<To>*) ( castFunctionsById().insert(std::make_pair(To::typeId((const To&) a), castPool)).first->second );
} else {
return * (CastPool<To>*) res->second;
}
}
static CastPoolBase& getCastPool(const std::string& tagName) {
std::map<std::string, CastPoolBase*>::iterator res = castFunctionsByString().find(tagName);
if(res == castFunctionsByString().end()) {
throw std::invalid_argument("Casting to type " + tagName + " not available.");
} else {
return * res->second;
}
}
template<class To>
class CastPoolStringBinder {
public:
CastPoolStringBinder(std::string tagName) {
castFunctionsByString().insert(std::make_pair(tagName, & getCastPool<To>()));
}
};
template<class To, class From>
class CastRegister {
public:
CastRegister() {
getCastPool<To>().template add<From>();
}
};
};
} /* namespace alib */
#endif /* CAST_API_HPP_ */
......@@ -21,6 +21,7 @@
#include "../Automaton.h"
#include "../../object/Object.h"
#include "../../XmlApi.hpp"
#include "../../CastApi.hpp"
 
namespace automaton {
 
......@@ -256,4 +257,10 @@ namespace alib {
xmlApi<automaton::Automaton>::ParserRegister<automaton::CompactNFA> compactNFAParserRegister = xmlApi<automaton::Automaton>::ParserRegister<automaton::CompactNFA>(automaton::CompactNFA::XML_TAG_NAME, automaton::CompactNFA::parse);
xmlApi<alib::Object>::ParserRegister<automaton::CompactNFA> compactNFAParserRegister2 = xmlApi<alib::Object>::ParserRegister<automaton::CompactNFA>(automaton::CompactNFA::XML_TAG_NAME, automaton::CompactNFA::parse);
 
auto CompactNFAFromDFA = castApi::CastRegister<automaton::CompactNFA, automaton::DFA>();
auto CompactNFAFromNFA = castApi::CastRegister<automaton::CompactNFA, automaton::NFA>();
auto CompactNFAFromMultiInitialStateNFA = castApi::CastRegister<automaton::CompactNFA, automaton::MultiInitialStateNFA>();
auto CompactNFAEpsilonNFA = castApi::CastRegister<automaton::CompactNFA, automaton::EpsilonNFA>();
auto CompactNFACastBinder = castApi::CastPoolStringBinder<automaton::CompactNFA>(automaton::CompactNFA::XML_TAG_NAME);
} /* namespace alib */
......@@ -20,6 +20,7 @@
#include "../Automaton.h"
#include "../../object/Object.h"
#include "../../XmlApi.hpp"
#include "../../CastApi.hpp"
 
namespace automaton {
 
......@@ -345,4 +346,9 @@ namespace alib {
xmlApi<automaton::Automaton>::ParserRegister<automaton::EpsilonNFA> epsilonNFAParserRegister = xmlApi<automaton::Automaton>::ParserRegister<automaton::EpsilonNFA>(automaton::EpsilonNFA::XML_TAG_NAME, automaton::EpsilonNFA::parse);
xmlApi<alib::Object>::ParserRegister<automaton::EpsilonNFA> epsilonNFAParserRegister2 = xmlApi<alib::Object>::ParserRegister<automaton::EpsilonNFA>(automaton::EpsilonNFA::XML_TAG_NAME, automaton::EpsilonNFA::parse);
 
auto EpsilonNFAFromDFA = castApi::CastRegister<automaton::EpsilonNFA, automaton::DFA>();
auto EpsilonNFAFromNFA = castApi::CastRegister<automaton::EpsilonNFA, automaton::NFA>();
auto EpsilonNFAFromMultiInitialStateNFA = castApi::CastRegister<automaton::EpsilonNFA, automaton::MultiInitialStateNFA>();
auto EpsilonNFACastBinder = castApi::CastPoolStringBinder<automaton::EpsilonNFA>(automaton::EpsilonNFA::XML_TAG_NAME);
} /* namespace alib */
......@@ -24,6 +24,7 @@
#include "../Automaton.h"
#include "../../object/Object.h"
#include "../../XmlApi.hpp"
#include "../../CastApi.hpp"
 
namespace automaton {
 
......@@ -267,4 +268,11 @@ namespace alib {
xmlApi<automaton::Automaton>::ParserRegister<automaton::ExtendedNFA> extendedNFAParserRegister = xmlApi<automaton::Automaton>::ParserRegister<automaton::ExtendedNFA>(automaton::ExtendedNFA::XML_TAG_NAME, automaton::ExtendedNFA::parse);
xmlApi<alib::Object>::ParserRegister<automaton::ExtendedNFA> extendedNFAParserRegister2 = xmlApi<alib::Object>::ParserRegister<automaton::ExtendedNFA>(automaton::ExtendedNFA::XML_TAG_NAME, automaton::ExtendedNFA::parse);
 
auto ExtendedNFAFromDFA = castApi::CastRegister<automaton::ExtendedNFA, automaton::DFA>();
auto ExtendedNFAFromNFA = castApi::CastRegister<automaton::ExtendedNFA, automaton::NFA>();
auto ExtendedNFAFromMultiInitialStateNFA = castApi::CastRegister<automaton::ExtendedNFA, automaton::MultiInitialStateNFA>();
auto ExtendedNFAEpsilonNFA = castApi::CastRegister<automaton::ExtendedNFA, automaton::EpsilonNFA>();
auto ExtendedNFACompactNFA = castApi::CastRegister<automaton::ExtendedNFA, automaton::CompactNFA>();
auto ExtendedNFACastBinder = castApi::CastPoolStringBinder<automaton::ExtendedNFA>(automaton::ExtendedNFA::XML_TAG_NAME);
} /* namespace alib */
......@@ -18,6 +18,7 @@
#include "../Automaton.h"
#include "../../object/Object.h"
#include "../../XmlApi.hpp"
#include "../../CastApi.hpp"
 
namespace automaton {
 
......@@ -247,4 +248,8 @@ namespace alib {
xmlApi<automaton::Automaton>::ParserRegister<automaton::MultiInitialStateNFA> multiInitialStateNFAParserRegister = xmlApi<automaton::Automaton>::ParserRegister<automaton::MultiInitialStateNFA>(automaton::MultiInitialStateNFA::XML_TAG_NAME, automaton::MultiInitialStateNFA::parse);
xmlApi<alib::Object>::ParserRegister<automaton::MultiInitialStateNFA> multiInitialStateNFAParserRegister2 = xmlApi<alib::Object>::ParserRegister<automaton::MultiInitialStateNFA>(automaton::MultiInitialStateNFA::XML_TAG_NAME, automaton::MultiInitialStateNFA::parse);
 
auto MultiInitialStateNFAFromDFA = castApi::CastRegister<automaton::MultiInitialStateNFA, automaton::DFA>();
auto MultiInitialStateNFAFromNFA = castApi::CastRegister<automaton::MultiInitialStateNFA, automaton::NFA>();
auto MultiInitialStateNFACastBinder = castApi::CastPoolStringBinder<automaton::MultiInitialStateNFA>(automaton::MultiInitialStateNFA::XML_TAG_NAME);
} /* namespace alib */
......@@ -16,6 +16,7 @@
#include "../Automaton.h"
#include "../../object/Object.h"
#include "../../XmlApi.hpp"
#include "../../CastApi.hpp"
 
namespace automaton {
 
......@@ -229,4 +230,7 @@ namespace alib {
xmlApi<automaton::Automaton>::ParserRegister<automaton::NFA> NFAParserRegister = xmlApi<automaton::Automaton>::ParserRegister<automaton::NFA>(automaton::NFA::XML_TAG_NAME, automaton::NFA::parse);
xmlApi<alib::Object>::ParserRegister<automaton::NFA> NFAParserRegister2 = xmlApi<alib::Object>::ParserRegister<automaton::NFA>(automaton::NFA::XML_TAG_NAME, automaton::NFA::parse);
 
auto NFAFromDFA = castApi::CastRegister<automaton::NFA, automaton::DFA>();
auto NFACastBinder = castApi::CastPoolStringBinder<automaton::NFA>(automaton::NFA::XML_TAG_NAME);
} /* namespace alib */
......@@ -22,6 +22,7 @@
#include "../RegExp.h"
#include "../../object/Object.h"
#include "../../XmlApi.hpp"
#include "../../CastApi.hpp"
 
namespace regexp {
 
......@@ -178,4 +179,7 @@ namespace alib {
xmlApi<regexp::RegExp>::ParserRegister<regexp::FormalRegExp> formalRegExpParserRegister = xmlApi<regexp::RegExp>::ParserRegister<regexp::FormalRegExp>(regexp::FormalRegExp::XML_TAG_NAME, regexp::FormalRegExp::parse);
xmlApi<alib::Object>::ParserRegister<regexp::FormalRegExp> formalRegExpParserRegister2 = xmlApi<alib::Object>::ParserRegister<regexp::FormalRegExp>(regexp::FormalRegExp::XML_TAG_NAME, regexp::FormalRegExp::parse);
 
auto FormalRegExpFromUnboundedRegExp = castApi::CastRegister<regexp::FormalRegExp, regexp::UnboundedRegExp>();
auto FormalRegExpCastBinder = castApi::CastPoolStringBinder<regexp::FormalRegExp>(regexp::FormalRegExp::XML_TAG_NAME);
} /* namespace alib */
......@@ -22,6 +22,7 @@
#include "../RegExp.h"
#include "../../object/Object.h"
#include "../../XmlApi.hpp"
#include "../../CastApi.hpp"
 
namespace regexp {
 
......@@ -179,4 +180,7 @@ namespace alib {
xmlApi<regexp::RegExp>::ParserRegister<regexp::UnboundedRegExp> unboundedRegExpParserRegister = xmlApi<regexp::RegExp>::ParserRegister<regexp::UnboundedRegExp>(regexp::UnboundedRegExp::XML_TAG_NAME, regexp::UnboundedRegExp::parse);
xmlApi<alib::Object>::ParserRegister<regexp::UnboundedRegExp> unboundedRegExpParserRegister2 = xmlApi<alib::Object>::ParserRegister<regexp::UnboundedRegExp>(regexp::UnboundedRegExp::XML_TAG_NAME, regexp::UnboundedRegExp::parse);
 
auto UnboundedRegExpFromFormalRegExp = castApi::CastRegister<regexp::UnboundedRegExp, regexp::FormalRegExp>();
auto UnboundedRegExpCastBinder = castApi::CastPoolStringBinder<regexp::UnboundedRegExp>(regexp::UnboundedRegExp::XML_TAG_NAME);
} /* namespace alib */
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