diff --git a/alib2algo/src/string/simplify/NormalizeAlphabet.cpp b/alib2algo/src/string/simplify/NormalizeAlphabet.cpp index 34f4709f24863991ccbab0e6cc13d1ece267b78f..434378cfa0cd5afd16aee941d7aface3480f3d4e 100644 --- a/alib2algo/src/string/simplify/NormalizeAlphabet.cpp +++ b/alib2algo/src/string/simplify/NormalizeAlphabet.cpp @@ -8,12 +8,8 @@ #include "NormalizeAlphabet.h" #include <map> -#include <deque> #include <vector> #include <set> -#include <algorithm> -#include <sstream> -#include <iostream> #include "exception/AlibException.h" #include "alphabet/Symbol.h" @@ -23,11 +19,7 @@ namespace string { namespace simplify { string::String NormalizeAlphabet::normalize(const string::String& string) { - string::String* out = NULL; - string.getData().Accept((void*) &out, NormalizeAlphabet::NORMALIZE); - string::String res = std::move(*out); - delete out; - return res; + return getInstance().dispatch(string.getData()); } string::LinearString NormalizeAlphabet::normalize(const string::LinearString& string) { @@ -54,20 +46,7 @@ string::LinearString NormalizeAlphabet::normalize(const string::LinearString& st return result; } -void NormalizeAlphabet::Visit(void*, const string::Epsilon&) const { - throw exception::AlibException("Unsupported automaton type Epsilon"); -} - -void NormalizeAlphabet::Visit(void* data, const string::LinearString& str) const { - string::String* & out = *((string::String**) data); - out = new string::String(this->normalize(str)); -} - -void NormalizeAlphabet::Visit(void*, const string::CyclicString&) const { - throw exception::AlibException("Unsupported automaton type CyclicString"); -} - -const NormalizeAlphabet NormalizeAlphabet::NORMALIZE; +auto NormalizeAlphabetLinearString = NormalizeAlphabet::RegistratorWrapper<string::LinearString, string::LinearString>(NormalizeAlphabet::getInstance(), NormalizeAlphabet::normalize); } /* namespace simplify */ diff --git a/alib2algo/src/string/simplify/NormalizeAlphabet.h b/alib2algo/src/string/simplify/NormalizeAlphabet.h index ae869d9fa4f23b1060b33c56c8c9e38b0a1576cd..1efc99894c866becc48578b3822f1aad1117acb3 100644 --- a/alib2algo/src/string/simplify/NormalizeAlphabet.h +++ b/alib2algo/src/string/simplify/NormalizeAlphabet.h @@ -8,6 +8,8 @@ #ifndef NORMALIZE_ALPHABET_H_ #define NORMALIZE_ALPHABET_H_ +#include <common/multipleDispatch.hpp> + #include <string/LinearString.h> #include <string/String.h> @@ -15,10 +17,8 @@ namespace string { namespace simplify { -class NormalizeAlphabet : public string::VisitableStringBase::const_visitor_type { +class NormalizeAlphabet : public std::SingleDispatch<string::String, string::StringBase> { public: - NormalizeAlphabet() {} - /** * @param dfa automaton to normalize */ @@ -26,12 +26,10 @@ public: static string::LinearString normalize(const string::LinearString& str); -protected: - void Visit(void*, const string::Epsilon& string) const; - void Visit(void*, const string::LinearString& string) const; - void Visit(void*, const string::CyclicString& string) const; - - static const NormalizeAlphabet NORMALIZE; + static NormalizeAlphabet& getInstance() { + static NormalizeAlphabet res; + return res; + } }; } /* namespace simplify */ diff --git a/alib2algo/src/string/simplify/NormalizeRotation.cpp b/alib2algo/src/string/simplify/NormalizeRotation.cpp index 7eaedbcd504373faf96dc588ac5af3c26435c32c..55c0b06809405008e271b3502d164929cf4e6efc 100644 --- a/alib2algo/src/string/simplify/NormalizeRotation.cpp +++ b/alib2algo/src/string/simplify/NormalizeRotation.cpp @@ -6,10 +6,7 @@ */ #include "NormalizeRotation.h" -#include <exception/AlibException.h> -#include <string/Epsilon.h> -#include <string/LinearString.h> #include <string/CyclicString.h> namespace string { @@ -17,11 +14,7 @@ namespace string { namespace simplify { string::String NormalizeRotation::normalize(const string::String& string) { - string::String* out = NULL; - string.getData().Accept((void*) &out, NormalizeRotation::NORMALIZE_ROTATION); - string::String res = std::move(*out); - delete out; - return res; + return getInstance().dispatch(string.getData()); } string::CyclicString NormalizeRotation::normalize(const string::CyclicString& string) { @@ -61,20 +54,7 @@ string::CyclicString NormalizeRotation::normalize(const string::CyclicString& st return string::CyclicString { string.getAlphabet(), rotated }; } -void NormalizeRotation::Visit(void*, const string::Epsilon&) const { - throw exception::AlibException("Unsupported string type Epsilon"); -} - -void NormalizeRotation::Visit(void*, const string::LinearString&) const { - throw exception::AlibException("Unsupported string type LinearString"); -} - -void NormalizeRotation::Visit(void* data, const string::CyclicString& string) const { - string::String* & res = *((string::String**) data); - res = new string::String(this->normalize(string)); -} - -const NormalizeRotation NormalizeRotation::NORMALIZE_ROTATION; +auto NormalizeRotationCyclicString = NormalizeRotation::RegistratorWrapper<string::CyclicString, string::CyclicString>(NormalizeRotation::getInstance(), NormalizeRotation::normalize); } /* namespace simplify */ diff --git a/alib2algo/src/string/simplify/NormalizeRotation.h b/alib2algo/src/string/simplify/NormalizeRotation.h index 1a426dd51aa0b7b04a5bc3ddf6dd81bc02f2b5ea..b8c1817fb67185e4253966ea59444017843857d2 100644 --- a/alib2algo/src/string/simplify/NormalizeRotation.h +++ b/alib2algo/src/string/simplify/NormalizeRotation.h @@ -8,16 +8,16 @@ #ifndef _NORMALIZE_ROTATION_H__ #define _NORMALIZE_ROTATION_H__ +#include <common/multipleDispatch.hpp> + #include <string/String.h> namespace string { namespace simplify { -class NormalizeRotation : public string::VisitableStringBase::const_visitor_type { +class NormalizeRotation : public std::SingleDispatch<string::String, string::StringBase> { public: - NormalizeRotation() {} - /** * Performs conversion. * @return left regular grammar equivalent to source automaton. @@ -25,12 +25,11 @@ public: static string::String normalize(const string::String& string); static string::CyclicString normalize(const string::CyclicString& string); -private: - void Visit(void*, const Epsilon& string) const; - void Visit(void*, const LinearString& string) const; - void Visit(void*, const CyclicString& string) const; - static const NormalizeRotation NORMALIZE_ROTATION; + static NormalizeRotation& getInstance() { + static NormalizeRotation res; + return res; + } }; } /* namespace simplify */