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