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