From 74ba5dc98710b016e1952020f33518a4ddf19a7f Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 12 Aug 2014 08:06:33 +0200
Subject: [PATCH] templated string wrapper

---
 alib2data/src/string/String.cpp               | 93 -------------------
 alib2data/src/string/String.h                 | 37 +-------
 alib2data/src/string/StringAlphabetGetter.cpp |  4 +-
 alib2data/src/string/StringBase.h             |  3 +-
 alib2data/src/string/StringFromXMLParser.cpp  |  8 +-
 .../src/string/StringToStringComposer.cpp     |  2 +-
 alib2data/src/string/StringToXMLComposer.cpp  |  2 +-
 7 files changed, 12 insertions(+), 137 deletions(-)
 delete mode 100644 alib2data/src/string/String.cpp

diff --git a/alib2data/src/string/String.cpp b/alib2data/src/string/String.cpp
deleted file mode 100644
index 21a97e3b2c..0000000000
--- a/alib2data/src/string/String.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * String.cpp
- *
- *  Created on: Apr 16, 2013
- *      Author: Jan Travnicek
- */
-
-#include "String.h"
-#include "../exception/AlibException.h"
-#include <algorithm>
-#include "Epsilon.h"
-
-namespace string {
-
-String::String() : string(NULL) {
-	setString(Epsilon());
-}
-
-String::String(const StringBase& string) : string(NULL) {
-	setString(string);
-}
-
-String::String(StringBase&& string) : string(NULL) {
-	setString(std::move(string));
-}
-
-String::String(const String& other) : string(other.getString().clone()) {
-
-}
-
-String::String(String&& other) noexcept : string(other.string) {
-	other.string = NULL;
-}
-
-String& String::operator=(const String& other) {
-	if(this == &other) return *this;
-
-	*this = String(other);
-
-	return *this;
-}
-
-String& String::operator=(String&& other) noexcept {
-	std::swap(this->string, other.string);
-
-	return *this;
-}
-
-String::~String() {
-	delete string;
-}
-
-const StringBase& String::getString() const {
-	return *string;
-}
-
-StringBase& String::getString() {
-	return *string;
-}
-
-void String::setString(const StringBase& string) {
-	delete this->string;
-	this->string = string.clone();
-}
-
-void String::setString(StringBase&& string) {
-	delete this->string;
-	this->string = std::move(string).plunder();
-}
-
-bool String::operator<(const String& other) const {
-	return *(this->string) < *(other.string);
-}
-
-bool String::operator!=(const String& other) const {
-	return !(*this == other);
-}
-
-bool String::operator==(const String& other) const {
-	return *string == *other.string;
-}
-
-std::ostream& operator<<(std::ostream& os, const String& string) {
-	os << string.getString();
-	return os;
-}
-
-String::operator std::string() const {
-	return (std::string) *string;
-}
-
-} /* namespace string */
-
diff --git a/alib2data/src/string/String.h b/alib2data/src/string/String.h
index 4a653732ac..9da127df94 100644
--- a/alib2data/src/string/String.h
+++ b/alib2data/src/string/String.h
@@ -9,46 +9,15 @@
 #define STRING_H_
 
 #include "../std/visitor.hpp"
+#include "../common/wrapper.hpp"
 #include "StringBase.h"
-#include <set>
-#include "../alphabet/Symbol.h"
 
 namespace string {
 
-class StringBase;
-
 /**
- * Wrapper around strings.
+ * Wrapper around automata.
  */
-class String {
-protected:
-	StringBase* string;
-public:
-	explicit String();
-	explicit String(const StringBase& string);
-	explicit String(StringBase&& string);
-	String(const String& other);
-	String(String&&) noexcept;
-	String& operator=(const String& other);
-	String& operator=(String&& other) noexcept;
-	virtual ~String() noexcept;
-
-	const StringBase& getString() const;
-	StringBase& getString();
-
-	void setString(const StringBase& string);
-	void setString(StringBase&& string);
-
-	bool operator<(const String& other) const;
-
-	bool operator!=(const String& other) const;
-
-	bool operator==(const String& other) const;
-
-	friend std::ostream& operator<<(std::ostream& os, const String& string);
-
-	operator std::string () const;
-};
+typedef alib::wrapper<StringBase> String;
 
 } /* namespace string */
 
diff --git a/alib2data/src/string/StringAlphabetGetter.cpp b/alib2data/src/string/StringAlphabetGetter.cpp
index 8fb6656d54..e22b8d916c 100644
--- a/alib2data/src/string/StringAlphabetGetter.cpp
+++ b/alib2data/src/string/StringAlphabetGetter.cpp
@@ -10,7 +10,7 @@
 namespace string {
 
 void StringAlphabetGetter::Visit(void* userData, const String& string) const {
-	string.getString().Accept(userData, *this);
+	string.getData().Accept(userData, *this);
 }
 
 void StringAlphabetGetter::Visit(void* userData, const StringBase::element_type& element) const {
@@ -34,7 +34,7 @@ void StringAlphabetGetter::Visit(void* userData, const LinearString& string) con
 
 std::set<alphabet::Symbol> StringAlphabetGetter::getAlphabet(const String& string) const {
 	std::set<alphabet::Symbol> res;
-	string.getString().Accept((void*) &res, *this);
+	Visit((void*) &res, string);
 	return std::move(res);
 }
 
diff --git a/alib2data/src/string/StringBase.h b/alib2data/src/string/StringBase.h
index d69637fa06..374df8863e 100644
--- a/alib2data/src/string/StringBase.h
+++ b/alib2data/src/string/StringBase.h
@@ -12,8 +12,7 @@
 #include <ostream>
 #include <set>
 #include "../alphabet/Symbol.h"
-#include "String.h"
-	
+
 namespace string {
 
 class LinearString;
diff --git a/alib2data/src/string/StringFromXMLParser.cpp b/alib2data/src/string/StringFromXMLParser.cpp
index 8d14f73ee1..ffe2e61ac9 100644
--- a/alib2data/src/string/StringFromXMLParser.cpp
+++ b/alib2data/src/string/StringFromXMLParser.cpp
@@ -20,7 +20,7 @@ String StringFromXMLParser::parse(std::list<sax::Token>& input) const {
 }
 
 String StringFromXMLParser::parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
-	String string;
+	String string { Epsilon {} };
 	parseContent(input, string, features);
 
 	return string;
@@ -36,7 +36,7 @@ void StringFromXMLParser::parseContent(std::list<sax::Token>& input, String& str
 		epsilon.setAlphabet(alphabet);
 
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "Epsilon");
-		string.setString(epsilon);
+		string.setData(epsilon);
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString")) {
 		if(!features.count(FEATURES::LINEAR)) throw exception::AlibException();
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString");
@@ -49,7 +49,7 @@ void StringFromXMLParser::parseContent(std::list<sax::Token>& input, String& str
 		linearString.setContent(data);
 
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "LinearString");
-		string.setString(linearString);
+		string.setData(linearString);
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString")) {
 		if(!features.count(FEATURES::CYCLIC)) throw exception::AlibException();
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString");
@@ -61,7 +61,7 @@ void StringFromXMLParser::parseContent(std::list<sax::Token>& input, String& str
 		std::vector<alphabet::Symbol> data = parseContentData(input);
 		cyclicString.setContent(data);
 
-		string.setString(cyclicString);
+		string.setData(cyclicString);
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "CyclicString");
 	} else {
 		throw sax::ParserException(sax::Token("Epsilon, LinearString, CyclicString", sax::Token::TokenType::START_ELEMENT), input.front());
diff --git a/alib2data/src/string/StringToStringComposer.cpp b/alib2data/src/string/StringToStringComposer.cpp
index e8fffe4e7d..76d17ce8f2 100644
--- a/alib2data/src/string/StringToStringComposer.cpp
+++ b/alib2data/src/string/StringToStringComposer.cpp
@@ -43,7 +43,7 @@ void StringToStringComposer::Visit(void* userData, const Epsilon&) {
 }
 
 void StringToStringComposer::Visit(void* userData, const String& string) {
-	string.getString().Accept(userData, *this);
+	string.getData().Accept(userData, *this);
 
 }
 
diff --git a/alib2data/src/string/StringToXMLComposer.cpp b/alib2data/src/string/StringToXMLComposer.cpp
index 9a7278356b..15a2adbe85 100644
--- a/alib2data/src/string/StringToXMLComposer.cpp
+++ b/alib2data/src/string/StringToXMLComposer.cpp
@@ -59,7 +59,7 @@ void StringToXMLComposer::Visit(void* userData, const LinearString& string) cons
 }
 
 void StringToXMLComposer::Visit(void* userData, const String& string) const {
-	string.getString().Accept(userData, *this);
+	string.getData().Accept(userData, *this);
 }
 
 std::list<sax::Token> StringToXMLComposer::compose(const String& string) const {
-- 
GitLab