From 83b7ca0bae61bb10c9163544e5df455861e507b6 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sun, 25 Oct 2015 09:23:08 +0100 Subject: [PATCH] castting accepts a function, use in RHDPDA <> PDA --- alib2algo/src/automaton/transform/PDAToRHPDA.cpp | 7 +++++++ alib2algo/src/automaton/transform/RHPDAToPDA.cpp | 7 +++++++ alib2data/src/CastApi.hpp | 11 +++++++++++ alib2data/src/automaton/PDA/DPDA.cpp | 3 +++ alib2data/src/automaton/PDA/NPDA.cpp | 3 +++ .../automaton/PDA/RealTimeHeightDeterministicDPDA.cpp | 3 +++ .../automaton/PDA/RealTimeHeightDeterministicNPDA.cpp | 3 +++ 7 files changed, 37 insertions(+) diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp index a53cca884c..865d2916f4 100644 --- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp +++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp @@ -173,3 +173,10 @@ automaton::Automaton PDAToRHPDA::convert(const Automaton& automaton) { } +namespace alib { + +auto RealTimeHeightDeterministicDPDAFromDPDA = castApi::CastRegister<automaton::RealTimeHeightDeterministicDPDA, automaton::DPDA>(automaton::PDAToRHPDA::convert); +auto RealTimeHeightDeterministicNPDAFromNPDA = castApi::CastRegister<automaton::RealTimeHeightDeterministicNPDA, automaton::NPDA>(automaton::PDAToRHPDA::convert); + +} + diff --git a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp index 9789850625..a9a2431e3f 100644 --- a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp +++ b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp @@ -257,3 +257,10 @@ automaton::Automaton RHPDAToPDA::convert(const Automaton& automaton) { } +namespace alib { + +auto DPDAFromRealTimeHeightDeterministicNPDA = castApi::CastRegister<automaton::DPDA, automaton::RealTimeHeightDeterministicDPDA>(automaton::RHPDAToPDA::convert); +auto NPDAFromRealTimeHeightDeterministicNPDA = castApi::CastRegister<automaton::NPDA, automaton::RealTimeHeightDeterministicNPDA>(automaton::RHPDAToPDA::convert); + +} + diff --git a/alib2data/src/CastApi.hpp b/alib2data/src/CastApi.hpp index 32d4b974b1..8ef174d98b 100644 --- a/alib2data/src/CastApi.hpp +++ b/alib2data/src/CastApi.hpp @@ -46,6 +46,14 @@ struct castApi { castFunctions.insert ( std::make_pair ( std::type_index ( typeid ( From ) ), [] ( const alib::ObjectBase & from ) { return alib::Object ( To ( ( const From & ) from ) ); } ) ); } + template < class From > + void add ( To(*castFunction)(const From&) ) { + castFunctions.insert ( std::make_pair ( std::type_index ( typeid ( From ) ),[=] ( const alib::ObjectBase & from ) { + return alib::Object ( ( ( To(*) ( const alib::ObjectBase & ) ) castFunction ) ( from ) ); + } + ) ); + } + template < class From > bool test ( ) { return castFunctions.count ( std::type_index ( typeid ( From ) ) ); @@ -134,6 +142,9 @@ public: getCastPool < To > ( ).template add < From > ( ); } + CastRegister ( To(*castFunction)(const From&) ) { + getCastPool < To > ( ).template add < From > ( castFunction ); + } }; }; diff --git a/alib2data/src/automaton/PDA/DPDA.cpp b/alib2data/src/automaton/PDA/DPDA.cpp index 52f2b20d9d..e5ab067461 100644 --- a/alib2data/src/automaton/PDA/DPDA.cpp +++ b/alib2data/src/automaton/PDA/DPDA.cpp @@ -16,6 +16,7 @@ #include "../Automaton.h" #include "../../object/Object.h" #include "../../XmlApi.hpp" +#include "../../CastApi.hpp" namespace automaton { @@ -327,4 +328,6 @@ namespace alib { xmlApi<automaton::Automaton>::ParserRegister<automaton::DPDA> DPDAParserRegister = xmlApi<automaton::Automaton>::ParserRegister<automaton::DPDA>(automaton::DPDA::XML_TAG_NAME, automaton::DPDA::parse); xmlApi<alib::Object>::ParserRegister<automaton::DPDA> DPDAParserRegister2 = xmlApi<alib::Object>::ParserRegister<automaton::DPDA>(automaton::DPDA::XML_TAG_NAME, automaton::DPDA::parse); +auto DPDACastBinder = castApi::CastPoolStringBinder<automaton::DPDA>(automaton::DPDA::XML_TAG_NAME); + } /* namespace alib */ diff --git a/alib2data/src/automaton/PDA/NPDA.cpp b/alib2data/src/automaton/PDA/NPDA.cpp index b02e2a0548..dfbe86366d 100644 --- a/alib2data/src/automaton/PDA/NPDA.cpp +++ b/alib2data/src/automaton/PDA/NPDA.cpp @@ -16,6 +16,7 @@ #include "../Automaton.h" #include "../../object/Object.h" #include "../../XmlApi.hpp" +#include "../../CastApi.hpp" namespace automaton { @@ -244,4 +245,6 @@ namespace alib { xmlApi<automaton::Automaton>::ParserRegister<automaton::NPDA> NPDAParserRegister = xmlApi<automaton::Automaton>::ParserRegister<automaton::NPDA>(automaton::NPDA::XML_TAG_NAME, automaton::NPDA::parse); xmlApi<alib::Object>::ParserRegister<automaton::NPDA> NPDAParserRegister2 = xmlApi<alib::Object>::ParserRegister<automaton::NPDA>(automaton::NPDA::XML_TAG_NAME, automaton::NPDA::parse); +auto NPDACastBinder = castApi::CastPoolStringBinder<automaton::NPDA>(automaton::NPDA::XML_TAG_NAME); + } /* namespace alib */ diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp index 5ade5615d3..153d788fbb 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp @@ -16,6 +16,7 @@ #include "../Automaton.h" #include "../../object/Object.h" #include "../../XmlApi.hpp" +#include "../../CastApi.hpp" namespace automaton { @@ -509,4 +510,6 @@ namespace alib { xmlApi<automaton::Automaton>::ParserRegister<automaton::RealTimeHeightDeterministicDPDA> realTimeHeightDeterministicDPDAParserRegister = xmlApi<automaton::Automaton>::ParserRegister<automaton::RealTimeHeightDeterministicDPDA>(automaton::RealTimeHeightDeterministicDPDA::XML_TAG_NAME, automaton::RealTimeHeightDeterministicDPDA::parse); xmlApi<alib::Object>::ParserRegister<automaton::RealTimeHeightDeterministicDPDA> realTimeHeightDeterministicDPDAParserRegister2 = xmlApi<alib::Object>::ParserRegister<automaton::RealTimeHeightDeterministicDPDA>(automaton::RealTimeHeightDeterministicDPDA::XML_TAG_NAME, automaton::RealTimeHeightDeterministicDPDA::parse); +auto RealTimeHeightDeterministicDPDACastBinder = castApi::CastPoolStringBinder<automaton::RealTimeHeightDeterministicDPDA>(automaton::RealTimeHeightDeterministicDPDA::XML_TAG_NAME); + } /* namespace alib */ diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp index 167623cda3..78c23a51c2 100644 --- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp +++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp @@ -16,6 +16,7 @@ #include "../Automaton.h" #include "../../object/Object.h" #include "../../XmlApi.hpp" +#include "../../CastApi.hpp" namespace automaton { @@ -407,4 +408,6 @@ namespace alib { xmlApi<automaton::Automaton>::ParserRegister<automaton::RealTimeHeightDeterministicNPDA> realTimeHeightDeterministicNPDAParserRegister = xmlApi<automaton::Automaton>::ParserRegister<automaton::RealTimeHeightDeterministicNPDA>(automaton::RealTimeHeightDeterministicNPDA::XML_TAG_NAME, automaton::RealTimeHeightDeterministicNPDA::parse); xmlApi<alib::Object>::ParserRegister<automaton::RealTimeHeightDeterministicNPDA> realTimeHeightDeterministicNPDAParserRegister2 = xmlApi<alib::Object>::ParserRegister<automaton::RealTimeHeightDeterministicNPDA>(automaton::RealTimeHeightDeterministicNPDA::XML_TAG_NAME, automaton::RealTimeHeightDeterministicNPDA::parse); +auto RealTimeHeightDeterministicNPDACastBinder = castApi::CastPoolStringBinder<automaton::RealTimeHeightDeterministicNPDA>(automaton::RealTimeHeightDeterministicNPDA::XML_TAG_NAME); + } /* namespace alib */ -- GitLab