diff --git a/alib2algo/src/string/naive/ExactCompare.cpp b/alib2algo/src/string/naive/ExactCompare.cpp index 02999dd3f0920bb37497d97b0eeeb3e132055839..b72770486cfc80f60f17c33208b7a60c776ab4fe 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 ada478f2daf6b3358691d5ff969ee35c8aa1accd..fc4825128a9fb5940a91a700d25505f25b218afc 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 746bb375c4d3419ecf5352da31841a2ce83637db..412b4abf0393157d0dc7ba638369ce87721c66a7 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 e0490504fd0ac9f330d59a5544eaba3daaafc168..991b94dbcf079c653d13c1018b4fc75309e150b2 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 */