From fba66aee5611573be0be6e510d6e15356327a21c Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Thu, 10 Aug 2017 21:44:31 +0200
Subject: [PATCH] reading to string from namespace std to ext

---
 alib2std/src/extensions/istream.cpp           |  6 ++--
 alib2std/src/extensions/istream.h             |  8 +++--
 alib2std/src/extensions/string.hpp            | 31 +++++++++++++++++++
 alib2std/test-src/extensions/IstreamTest.cpp  | 14 ++++-----
 .../automaton/AutomatonFromStringLexer.cpp    |  8 ++---
 .../src/grammar/GrammarFromStringLexer.cpp    | 26 ++++++++--------
 6 files changed, 63 insertions(+), 30 deletions(-)

diff --git a/alib2std/src/extensions/istream.cpp b/alib2std/src/extensions/istream.cpp
index f4ade8e0e5..318bad6852 100644
--- a/alib2std/src/extensions/istream.cpp
+++ b/alib2std/src/extensions/istream.cpp
@@ -7,7 +7,7 @@
 
 #include <istream>
 
-namespace std {
+namespace ext {
 
 std::istream & oprr ( std::istream & in, const std::string & str, bool start ) {
 	if ( str.size ( ) == 0 ) return in;
@@ -34,8 +34,8 @@ std::istream & oprr ( std::istream & in, const std::string & str, bool start ) {
 	return in;
 }
 
-std::istream & operator >>( std::istream & in, const std::string & str ) {
+std::istream & operator >>( std::istream & in, const ext::string & str ) {
 	return oprr ( in, str, true );
 }
 
-} /* namespace std */
+} /* namespace ext */
diff --git a/alib2std/src/extensions/istream.h b/alib2std/src/extensions/istream.h
index 2a0f5294bd..5c679627a8 100644
--- a/alib2std/src/extensions/istream.h
+++ b/alib2std/src/extensions/istream.h
@@ -9,11 +9,13 @@
 #define __ISTREAM_H_
 
 #include <istream>
+#include <string>
+#include "string.hpp"
 
-namespace std {
+namespace ext {
 
-std::istream& operator>>(std::istream& in, const std::string& str);
+std::istream & operator >> ( std::istream & in, const ext::string & str );
 
-} /* namespace std */
+} /* namespace ext */
 
 #endif /* __ISTREAM_H_ */
diff --git a/alib2std/src/extensions/string.hpp b/alib2std/src/extensions/string.hpp
index 370ea85a02..0b836db787 100644
--- a/alib2std/src/extensions/string.hpp
+++ b/alib2std/src/extensions/string.hpp
@@ -14,6 +14,37 @@
 
 namespace ext {
 
+class string : public std::string {
+public:
+#ifdef __clang__
+	using std::string::string;
+	using std::string::operator =;
+#else
+	string ( ) noexcept : std::string ( ) {
+	}
+
+	string ( const string & other ) noexcept : std::string ( other ) {
+	}
+
+	string ( string && other ) noexcept : std::string ( std::move ( other ) ) {
+	}
+
+	using std::string::string;
+
+	string & operator = ( string && other ) noexcept {
+		static_cast < std::string & > ( * this ) = std::move ( other );
+		return * this;
+	}
+
+	string & operator = ( const string & other ) noexcept {
+		static_cast < std::string & > ( * this ) = other;
+		return * this;
+	}
+
+	using std::string::operator =;
+#endif
+};
+
 template < typename T, typename std::enable_if < std::is_constructible < std::string, T >::value >::type* = nullptr >
 std::string to_string ( const T & value ) {
 	return (std::string) value;
diff --git a/alib2std/test-src/extensions/IstreamTest.cpp b/alib2std/test-src/extensions/IstreamTest.cpp
index f02f05efdc..b06c54c643 100644
--- a/alib2std/test-src/extensions/IstreamTest.cpp
+++ b/alib2std/test-src/extensions/IstreamTest.cpp
@@ -15,17 +15,17 @@ void IstreamTest::tearDown() {
 }
 
 void IstreamTest::testIstream() {
-	std::stringstream ss("TEST");
+	std::stringstream ss ( "TEST" );
 
-	CPPUNIT_ASSERT(((bool)(ss >> "TEST")) == true);
+	CPPUNIT_ASSERT ( ( ( bool ) ( ss >> ext::string ( "TEST" ) ) ) == true );
 
-	ss.str("TEST");
+	ss.str ( "TEST" );
 
-	CPPUNIT_ASSERT(((bool)(ss >> "TESS")) == false);
-	CPPUNIT_ASSERT(ss.str() == "TEST");
+	CPPUNIT_ASSERT ( ( ( bool ) ( ss >> ext::string ( "TESS" ) ) ) == false );
+	CPPUNIT_ASSERT ( ss.str ( ) == "TEST" );
 
 
-	CPPUNIT_ASSERT(((bool)(ss >> "TESTS")) == false);
-	CPPUNIT_ASSERT(ss.str() == "TEST");
+	CPPUNIT_ASSERT ( ( ( bool ) ( ss >> ext::string ( "TESTS" ) ) ) == false );
+	CPPUNIT_ASSERT ( ss.str ( ) == "TEST" );
 }
 
diff --git a/alib2str/src/automaton/AutomatonFromStringLexer.cpp b/alib2str/src/automaton/AutomatonFromStringLexer.cpp
index a0e75450f0..2370e672fb 100644
--- a/alib2str/src/automaton/AutomatonFromStringLexer.cpp
+++ b/alib2str/src/automaton/AutomatonFromStringLexer.cpp
@@ -53,22 +53,22 @@ L0:
 		token.value += character;
 		token.raw += character;
 		goto L1;
-	} else if(in.unget(), in >> "MISNFA") {
+	} else if(in.unget(), in >> ext::string ( "MISNFA" ) ) {
 		token.type = TokenType::MULTI_INITIAL_STATE_NFA;
 		token.value = "MISNFA";
 		token.raw = "MISNFA";
 		return token;
-	} else if(in.clear(), in >> "ENFA") {
+	} else if(in.clear(), in >> ext::string ( "ENFA" ) ) {
 		token.type = TokenType::EPSILON_NFA;
 		token.value = "ENFA";
 		token.raw = "ENFA";
 		return token;
-	} else if(in.clear(), in >> "NFA") {
+	} else if(in.clear(), in >> ext::string ( "NFA" ) ) {
 		token.type = TokenType::NFA;
 		token.value = "NFA";
 		token.raw = "NFA";
 		return token;
-	} else if(in.clear(), in >> "DFA") {
+	} else if(in.clear(), in >> ext::string ( "DFA" ) ) {
 		token.type = TokenType::DFA;
 		token.value = "DFA";
 		token.raw = "DFA";
diff --git a/alib2str/src/grammar/GrammarFromStringLexer.cpp b/alib2str/src/grammar/GrammarFromStringLexer.cpp
index 0ae6cacee8..4a20e80ba9 100644
--- a/alib2str/src/grammar/GrammarFromStringLexer.cpp
+++ b/alib2str/src/grammar/GrammarFromStringLexer.cpp
@@ -62,67 +62,67 @@ L0:
 		token.value += character;
 		token.raw += character;
 		goto L1;
-	} else if(in.unget(), in >> "RIGHT_RG") {
+	} else if(in.unget(), in >> ext::string ( "RIGHT_RG" ) ) {
 		token.type = TokenType::RIGHT_RG;
 		token.value = "RIGHT_RG";
 		token.raw = "RIGHT_RG";
 		return token;
-	} else if(in.clear(), in >> "LEFT_RG") {
+	} else if(in.clear(), in >> ext::string ( "LEFT_RG" ) ) {
 		token.type = TokenType::LEFT_RG;
 		token.value = "LEFT_RG";
 		token.raw = "LEFT_RG";
 		return token;
-	} else if(in.clear(), in >> "RIGHT_LG") {
+	} else if(in.clear(), in >> ext::string ( "RIGHT_LG" ) ) {
 		token.type = TokenType::RIGHT_LG;
 		token.value = "RIGHT_LG";
 		token.raw = "RIGHT_LG";
 		return token;
-	} else if(in.clear(), in >> "LEFT_LG") {
+	} else if(in.clear(), in >> ext::string ( "LEFT_LG" ) ) {
 		token.type = TokenType::LEFT_LG;
 		token.value = "LEFT_LG";
 		token.raw = "LEFT_LG";
 		return token;
-	} else if(in.clear(), in >> "LG") {
+	} else if(in.clear(), in >> ext::string ( "LG" ) ) {
 		token.type = TokenType::LG;
 		token.value = "LG";
 		token.raw = "LG";
 		return token;
-	} else if(in.clear(), in >> "CFG") {
+	} else if(in.clear(), in >> ext::string ( "CFG" ) ) {
 		token.type = TokenType::CFG;
 		token.value = "CFG";
 		token.raw = "CFG";
 		return token;
-	} else if(in.clear(), in >> "EPSILON_FREE_CFG") {
+	} else if(in.clear(), in >> ext::string ( "EPSILON_FREE_CFG" ) ) {
 		token.type = TokenType::EPSILON_FREE_CFG;
 		token.value = "EPSILON_FREE_CFG";
 		token.raw = "EPSILON_FREE_CFG";
 		return token;
-	} else if(in.clear(), in >> "GNF") {
+	} else if(in.clear(), in >> ext::string ( "GNF" ) ) {
 		token.type = TokenType::GNF;
 		token.value = "GNF";
 		token.raw = "GNF";
 		return token;
-	} else if(in.clear(), in >> "CNF") {
+	} else if(in.clear(), in >> ext::string ( "CNF" ) ) {
 		token.type = TokenType::CNF;
 		token.value = "CNF";
 		token.raw = "CNF";
 		return token;
-	} else if(in.clear(), in >> "CSG") {
+	} else if(in.clear(), in >> ext::string ( "CSG" ) ) {
 		token.type = TokenType::CSG;
 		token.value = "CSG";
 		token.raw = "CSG";
 		return token;
-	} else if(in.clear(), in >> "NON_CONTRACTING_GRAMMAR") {
+	} else if(in.clear(), in >> ext::string ( "NON_CONTRACTING_GRAMMAR" ) ) {
 		token.type = TokenType::NON_CONTRACTING_GRAMMAR;
 		token.value = "NON_CONTRACTING_GRAMMAR";
 		token.raw = "NON_CONTRACTING_GRAMMAR";
 		return token;
-	} else if(in.clear(), in >> "CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR") {
+	} else if(in.clear(), in >> ext::string ( "CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR" ) ) {
 		token.type = TokenType::CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR;
 		token.value = "CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR";
 		token.raw = "CONTEXT_PRESERVING_UNRESTRICTED_GRAMMAR";
 		return token;
-	} else if(in.clear(), in >> "UNRESTRICTED_GRAMMAR") {
+	} else if(in.clear(), in >> ext::string ( "UNRESTRICTED_GRAMMAR" ) ) {
 		token.type = TokenType::UNRESTRICTED_GRAMMAR;
 		token.value = "UNRESTRICTED_GRAMMAR";
 		token.raw = "UNRESTRICTED_GRAMMAR";
-- 
GitLab