From 6de207ea564b7c27d1446031978a0b3007330795 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 14 Aug 2015 14:50:21 +0200
Subject: [PATCH] continue with string naive

---
 alib2algo/src/string/naive/ExactCompare.cpp | 25 +++++----------------
 alib2algo/src/string/naive/ExactCompare.h   | 15 +++++--------
 alib2algo/src/string/naive/ExactEqual.cpp   | 25 +++++----------------
 alib2algo/src/string/naive/ExactEqual.h     | 17 ++++++--------
 4 files changed, 25 insertions(+), 57 deletions(-)

diff --git a/alib2algo/src/string/naive/ExactCompare.cpp b/alib2algo/src/string/naive/ExactCompare.cpp
index 02999dd3f0..b72770486c 100644
--- a/alib2algo/src/string/naive/ExactCompare.cpp
+++ b/alib2algo/src/string/naive/ExactCompare.cpp
@@ -14,15 +14,15 @@ namespace string {
 namespace naive {
 
 int ExactCompare::compare(const string::String& u, const string::String& v) {
-	int data;
-	Accept((void*) &data, u.getData(), v.getData(), ExactCompare::EXACT_COMPARE);
-	return data;
+	return getInstance().dispatch(u.getData(), v.getData());
 }
 
 int ExactCompare::compare(const string::Epsilon&, const string::Epsilon&) {
 	return 0;
 }
 
+auto ExactCompareEpsilon = ExactCompare::RegistratorWrapper<int, string::Epsilon>(ExactCompare::getInstance(), ExactCompare::compare);
+
 int ExactCompare::compare(const string::LinearString& u, const string::LinearString& v) {
 	int n = (int) u.getContent().size(), m = (int)v.getContent().size();
 	int k = 0;
@@ -41,6 +41,8 @@ int ExactCompare::compare(const string::LinearString& u, const string::LinearStr
 	}
 }
 
+auto ExactCompareLinearString = ExactCompare::RegistratorWrapper<int, string::LinearString>(ExactCompare::getInstance(), ExactCompare::compare);
+
 int ExactCompare::compare(const string::CyclicString& u, const string::CyclicString& v) {
 	int n = (int) u.getContent().size(), m = (int)v.getContent().size();
 	int i = -1, j = -1, k;
@@ -57,22 +59,7 @@ int ExactCompare::compare(const string::CyclicString& u, const string::CyclicStr
 	return last ? 1 : - 1;
 }
 
-void ExactCompare::Visit(void* data, const string::Epsilon& u, const string::Epsilon& v) const {
-	int & res = *((int*) data);
-	res = this->compare(u, v);
-}
-
-void ExactCompare::Visit(void* data, const string::LinearString& u, const string::LinearString& v) const {
-	int & res = *((int*) data);
-	res = this->compare(u, v);
-}
-
-void ExactCompare::Visit(void* data, const string::CyclicString& u, const string::CyclicString& v) const {
-	int & res = *((int*) data);
-	res = this->compare(u, v);
-}
-
-const ExactCompare ExactCompare::EXACT_COMPARE;
+auto ExactCompareCyclicString = ExactCompare::RegistratorWrapper<int, string::CyclicString>(ExactCompare::getInstance(), ExactCompare::compare);
 
 } /* namespace naive */
 
diff --git a/alib2algo/src/string/naive/ExactCompare.h b/alib2algo/src/string/naive/ExactCompare.h
index ada478f2da..fc4825128a 100644
--- a/alib2algo/src/string/naive/ExactCompare.h
+++ b/alib2algo/src/string/naive/ExactCompare.h
@@ -8,28 +8,25 @@
 #ifndef EXACT_COMPARE_H_
 #define EXACT_COMPARE_H_
 
+#include <common/multipleDispatch.hpp>
 #include <string/String.h>
 
 namespace string {
 
 namespace naive {
 
-class ExactCompare : public string::VisitableStringBase::const_promoting_visitor_type {
+class ExactCompare : public std::PromotingDoubleDispatch<int, string::StringBase> {
 public:
-	ExactCompare() {}
-
 	static int compare(const string::String& u, const string::String& v);
 
 	static int compare(const string::Epsilon& u, const string::Epsilon& v);
 	static int compare(const string::LinearString& u, const string::LinearString& v);
 	static int compare(const string::CyclicString& u, const string::CyclicString& v);
 
-private:
-	void Visit(void*, const Epsilon& u, const Epsilon& v) const;
-	void Visit(void*, const LinearString& u, const LinearString& v) const;
-	void Visit(void*, const CyclicString& u, const CyclicString& v) const;
-
-	static const ExactCompare EXACT_COMPARE;
+	static ExactCompare& getInstance() {
+		static ExactCompare res;
+		return res;
+	}
 };
 
 } /* namespace naive */
diff --git a/alib2algo/src/string/naive/ExactEqual.cpp b/alib2algo/src/string/naive/ExactEqual.cpp
index 746bb375c4..412b4abf03 100644
--- a/alib2algo/src/string/naive/ExactEqual.cpp
+++ b/alib2algo/src/string/naive/ExactEqual.cpp
@@ -14,15 +14,15 @@ namespace string {
 namespace naive {
 
 bool ExactEqual::equals(const string::String& u, const string::String& v) {
-	bool data;
-	Accept((void*) &data, u.getData(), v.getData(), ExactEqual::EXACT_EQUAL);
-	return data;
+	return getInstance().dispatch(u.getData(), v.getData());
 }
 
 bool ExactEqual::equals(const string::Epsilon&, const string::Epsilon&) {
 	return true;
 }
 
+auto ExactEqualEpsilon = ExactEqual::RegistratorWrapper<bool, string::Epsilon>(ExactEqual::getInstance(), ExactEqual::equals);
+
 bool ExactEqual::equals(const string::LinearString& u, const string::LinearString& v) {
 	int n = (int) u.getContent().size(), m = (int)v.getContent().size();
 	int k = 0;
@@ -35,6 +35,8 @@ bool ExactEqual::equals(const string::LinearString& u, const string::LinearStrin
 	}
 }
 
+auto ExactEqualLinearString = ExactEqual::RegistratorWrapper<bool, string::LinearString>(ExactEqual::getInstance(), ExactEqual::equals);
+
 bool ExactEqual::equals(const string::CyclicString& u, const string::CyclicString& v) {
 	int n = (int)u.getContent().size();
 	int i = -1, j = -1, k;
@@ -50,22 +52,7 @@ bool ExactEqual::equals(const string::CyclicString& u, const string::CyclicStrin
 	return false;
 }
 
-void ExactEqual::Visit(void* data, const string::Epsilon& u, const string::Epsilon& v) const {
-	bool & res = *((bool*) data);
-	res = this->equals(u, v);
-}
-
-void ExactEqual::Visit(void* data, const string::LinearString& u, const string::LinearString& v) const {
-	bool & res = *((bool*) data);
-	res = this->equals(u, v);
-}
-
-void ExactEqual::Visit(void* data, const string::CyclicString& u, const string::CyclicString& v) const {
-	bool & res = *((bool*) data);
-	res = this->equals(u, v);
-}
-
-const ExactEqual ExactEqual::EXACT_EQUAL;
+auto ExactEqualCyclicString = ExactEqual::RegistratorWrapper<bool, string::CyclicString>(ExactEqual::getInstance(), ExactEqual::equals);
 
 } /* namespace naive */
 
diff --git a/alib2algo/src/string/naive/ExactEqual.h b/alib2algo/src/string/naive/ExactEqual.h
index e0490504fd..991b94dbcf 100644
--- a/alib2algo/src/string/naive/ExactEqual.h
+++ b/alib2algo/src/string/naive/ExactEqual.h
@@ -8,28 +8,25 @@
 #ifndef EXACT_EQUAL_H_
 #define EXACT_EQUAL_H_
 
+#include <common/multipleDispatch.hpp>
 #include <string/String.h>
 
 namespace string {
 
 namespace naive {
 
-class ExactEqual : public string::VisitableStringBase::const_promoting_visitor_type {
+class ExactEqual : public std::PromotingDoubleDispatch<bool, string::StringBase> {
 public:
-	ExactEqual() {}
-
 	static bool equals(const string::String& u, const string::String& v);
-	
+
 	static bool equals(const string::Epsilon& u, const string::Epsilon& v);
 	static bool equals(const string::LinearString& u, const string::LinearString& v);
 	static bool equals(const string::CyclicString& u, const string::CyclicString& v);
 
-private:
-	void Visit(void*, const Epsilon& u, const Epsilon& v) const;
-	void Visit(void*, const LinearString& u, const LinearString& v) const;
-	void Visit(void*, const CyclicString& u, const CyclicString& v) const;
-
-	static const ExactEqual EXACT_EQUAL;
+	static ExactEqual& getInstance() {
+		static ExactEqual res;
+		return res;
+	}
 };
 
 } /* namespace naive */
-- 
GitLab