mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			PR libstdc++/86008 add std::quoted support for string_view
PR libstdc++/86008 * include/bits/quoted_string.h (_Quoted_string<basic_string_view, C>): Define new partial specialization. * include/std/iomanip (quoted(basic_string_view<C,T>, C, C)): Define new overload. (operator<<(basic_ostream<C,T>&, const _Quoted_string<S,C>&)): Use value not reference for iteration. * testsuite/27_io/manipulators/standard/char/quoted.cc: Adjust comment. * testsuite/27_io/manipulators/standard/char/quoted_sv.cc: New test. * testsuite/27_io/manipulators/standard/wchar_t/quoted.cc: Adjust comment. From-SVN: r261227
This commit is contained in:
		
							parent
							
								
									5ae566b665
								
							
						
					
					
						commit
						7db54ccd8a
					
				|  | @ -1,3 +1,18 @@ | |||
| 2018-06-06  Jonathan Wakely  <jwakely@redhat.com> | ||||
| 
 | ||||
| 	PR libstdc++/86008 | ||||
| 	* include/bits/quoted_string.h (_Quoted_string<basic_string_view, C>): | ||||
| 	Define new partial specialization. | ||||
| 	* include/std/iomanip (quoted(basic_string_view<C,T>, C, C)): Define | ||||
| 	new overload. | ||||
| 	(operator<<(basic_ostream<C,T>&, const _Quoted_string<S,C>&)): Use | ||||
| 	value not reference for iteration. | ||||
| 	* testsuite/27_io/manipulators/standard/char/quoted.cc: Adjust | ||||
| 	comment. | ||||
| 	* testsuite/27_io/manipulators/standard/char/quoted_sv.cc: New test. | ||||
| 	* testsuite/27_io/manipulators/standard/wchar_t/quoted.cc: Adjust | ||||
| 	comment. | ||||
| 
 | ||||
| 2018-06-05  Jonathan Wakely  <jwakely@redhat.com> | ||||
| 
 | ||||
| 	* include/std/type_traits: Fix comment typos. | ||||
|  |  | |||
|  | @ -64,6 +64,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
| 	_CharT _M_escape; | ||||
|       }; | ||||
| 
 | ||||
| #if __cplusplus >= 201703L | ||||
|     template<typename _CharT, typename _Traits> | ||||
|       struct _Quoted_string<basic_string_view<_CharT, _Traits>, _CharT> | ||||
|       { | ||||
| 	_Quoted_string(basic_string_view<_CharT, _Traits> __str, | ||||
| 		       _CharT __del, _CharT __esc) | ||||
| 	: _M_string(__str), _M_delim{__del}, _M_escape{__esc} | ||||
| 	{ } | ||||
| 
 | ||||
| 	_Quoted_string& | ||||
| 	operator=(_Quoted_string&) = delete; | ||||
| 
 | ||||
| 	basic_string_view<_CharT, _Traits> _M_string; | ||||
| 	_CharT _M_delim; | ||||
| 	_CharT _M_escape; | ||||
|       }; | ||||
| #endif // C++17
 | ||||
| 
 | ||||
|     /**
 | ||||
|      * @brief Inserter for quoted strings. | ||||
|      * | ||||
|  | @ -101,7 +119,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
|       { | ||||
| 	std::basic_ostringstream<_CharT, _Traits> __ostr; | ||||
| 	__ostr << __str._M_delim; | ||||
| 	for (auto& __c : __str._M_string) | ||||
| 	for (auto __c : __str._M_string) | ||||
| 	  { | ||||
| 	    if (__c == __str._M_delim || __c == __str._M_escape) | ||||
| 	      __ostr << __str._M_escape; | ||||
|  |  | |||
|  | @ -446,7 +446,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
|       return __is; | ||||
|     } | ||||
| 
 | ||||
| #if __cplusplus > 201103L | ||||
| #if __cplusplus >= 201402L | ||||
| 
 | ||||
| #define __cpp_lib_quoted_string_io 201304 | ||||
| 
 | ||||
|  | @ -471,8 +471,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
| 	   _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) | ||||
|     { | ||||
|       return __detail::_Quoted_string< | ||||
| 			const basic_string<_CharT, _Traits, _Alloc>&, _CharT>( | ||||
| 				__string, __delim, __escape); | ||||
| 	const basic_string<_CharT, _Traits, _Alloc>&, _CharT>( | ||||
| 	    __string, __delim, __escape); | ||||
|     } | ||||
| 
 | ||||
|   template<typename _CharT, typename _Traits, typename _Alloc> | ||||
|  | @ -481,11 +481,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION | |||
| 	   _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) | ||||
|     { | ||||
|       return __detail::_Quoted_string< | ||||
| 			basic_string<_CharT, _Traits, _Alloc>&, _CharT>( | ||||
| 				__string, __delim, __escape); | ||||
| 	basic_string<_CharT, _Traits, _Alloc>&, _CharT>( | ||||
| 	    __string, __delim, __escape); | ||||
|     } | ||||
| 
 | ||||
| #endif // __cplusplus > 201103L | ||||
| #if __cplusplus >= 201703L | ||||
|   // _GLIBCXX_RESOLVE_LIB_DEFECTS | ||||
|   // 2785. quoted should work with basic_string_view | ||||
|   template<typename _CharT, typename _Traits> | ||||
|     inline auto | ||||
|     quoted(basic_string_view<_CharT, _Traits> __sv, | ||||
| 	   _CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\')) | ||||
|     { | ||||
|       return __detail::_Quoted_string< | ||||
| 	basic_string_view<_CharT, _Traits>, _CharT>(__sv, __delim, __escape); | ||||
|     } | ||||
| #endif // C++17 | ||||
| #endif // C++14 | ||||
| 
 | ||||
| #endif // __cplusplus >= 201103L | ||||
| 
 | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ | |||
| // with this library; see the file COPYING3.  If not see
 | ||||
| // <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| // 27.7.6 - Quoted manipulators		[quoted.manip]
 | ||||
| // C++14 27.7.6 - Quoted manipulators		[quoted.manip]
 | ||||
| 
 | ||||
| #include <string> | ||||
| #include <sstream> | ||||
|  |  | |||
|  | @ -0,0 +1,73 @@ | |||
| // { dg-options "-std=gnu++17" }
 | ||||
| // { dg-do run { target c++17 } }
 | ||||
| 
 | ||||
| // Copyright (C) 2018 Free Software Foundation, Inc.
 | ||||
| //
 | ||||
| // This file is part of the GNU ISO C++ Library.  This library is free
 | ||||
| // software; you can redistribute it and/or modify it under the
 | ||||
| // terms of the GNU General Public License as published by the
 | ||||
| // Free Software Foundation; either version 3, or (at your option)
 | ||||
| // any later version.
 | ||||
| 
 | ||||
| // This library is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU General Public License along
 | ||||
| // with this library; see the file COPYING3.  If not see
 | ||||
| // <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| // C++17 30.7.8 - Quoted manipulators		[quoted.manip]
 | ||||
| 
 | ||||
| #include <string_view> | ||||
| #include <sstream> | ||||
| #include <iomanip> | ||||
| #include <testsuite_hooks.h> | ||||
| 
 | ||||
| void | ||||
| test01() | ||||
| { | ||||
|   std::stringstream ss; | ||||
|   const std::string_view original = R"(This "string" will be \"quoted\")"; | ||||
|   std::string raw, round_trip; | ||||
|   ss << std::quoted(original); | ||||
|   raw = ss.str(); | ||||
|   VERIFY( raw == R"("This \"string\" will be \\\"quoted\\\"")" ); | ||||
|   ss >> std::quoted(round_trip); | ||||
|   VERIFY( original == round_trip ); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| test02() | ||||
| { | ||||
|   std::stringstream ss; | ||||
|   const std::string_view original = R"(This "string" will be \"quoted\")"; | ||||
|   std::string raw, round_trip; | ||||
|   ss << std::quoted(original, '\'', '!'); | ||||
|   raw = ss.str(); | ||||
|   VERIFY( raw == R"('This "string" will be \"quoted\"')" ); | ||||
|   ss >> std::quoted(round_trip, '\'', '!'); | ||||
|   VERIFY( original == round_trip ); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| test03() | ||||
| { | ||||
|   std::stringstream ss; | ||||
|   const std::string_view original = R"(This 'string' will be !'quoted!')"; | ||||
|   std::string raw, round_trip; | ||||
|   ss << std::quoted(original, '\'', '!'); | ||||
|   raw = ss.str(); | ||||
|   VERIFY( raw == R"('This !'string!' will be !!!'quoted!!!'')" ); | ||||
|   ss >> std::quoted(round_trip, '\'', '!'); | ||||
|   VERIFY( original == round_trip ); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| main() | ||||
| { | ||||
|   test01(); | ||||
|   test02(); | ||||
|   test03(); | ||||
| } | ||||
|  | @ -17,7 +17,7 @@ | |||
| // with this library; see the file COPYING3.  If not see
 | ||||
| // <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| // 27.7.6 - Quoted manipulators		[quoted.manip]
 | ||||
| // C++14 27.7.6 - Quoted manipulators		[quoted.manip]
 | ||||
| 
 | ||||
| #include <string> | ||||
| #include <sstream> | ||||
|  |  | |||
|  | @ -0,0 +1,73 @@ | |||
| // { dg-options "-std=gnu++17" }
 | ||||
| // { dg-do run { target c++17 } }
 | ||||
| 
 | ||||
| // Copyright (C) 2018 Free Software Foundation, Inc.
 | ||||
| //
 | ||||
| // This file is part of the GNU ISO C++ Library.  This library is free
 | ||||
| // software; you can redistribute it and/or modify it under the
 | ||||
| // terms of the GNU General Public License as published by the
 | ||||
| // Free Software Foundation; either version 3, or (at your option)
 | ||||
| // any later version.
 | ||||
| 
 | ||||
| // This library is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||||
| // GNU General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU General Public License along
 | ||||
| // with this library; see the file COPYING3.  If not see
 | ||||
| // <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| // C++17 30.7.8 - Quoted manipulators		[quoted.manip]
 | ||||
| 
 | ||||
| #include <string_view> | ||||
| #include <sstream> | ||||
| #include <iomanip> | ||||
| #include <testsuite_hooks.h> | ||||
| 
 | ||||
| void | ||||
| test01() | ||||
| { | ||||
|   std::wstringstream ss; | ||||
|   const std::wstring_view original = LR"(This "string" will be \"quoted\")"; | ||||
|   std::wstring raw, round_trip; | ||||
|   ss << std::quoted(original); | ||||
|   raw = ss.str(); | ||||
|   VERIFY( raw == LR"("This \"string\" will be \\\"quoted\\\"")" ); | ||||
|   ss >> std::quoted(round_trip); | ||||
|   VERIFY( original == round_trip ); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| test02() | ||||
| { | ||||
|   std::wstringstream ss; | ||||
|   const std::wstring_view original = LR"(This "string" will be \"quoted\")"; | ||||
|   std::wstring raw, round_trip; | ||||
|   ss << std::quoted(original, L'\'', L'!'); | ||||
|   raw = ss.str(); | ||||
|   VERIFY( raw == LR"('This "string" will be \"quoted\"')" ); | ||||
|   ss >> std::quoted(round_trip, L'\'', L'!'); | ||||
|   VERIFY( original == round_trip ); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| test03() | ||||
| { | ||||
|   std::wstringstream ss; | ||||
|   const std::wstring_view original = LR"(This 'string' will be !'quoted!')"; | ||||
|   std::wstring raw, round_trip; | ||||
|   ss << std::quoted(original, L'\'', L'!'); | ||||
|   raw = ss.str(); | ||||
|   VERIFY( raw == LR"('This !'string!' will be !!!'quoted!!!'')" ); | ||||
|   ss >> std::quoted(round_trip, L'\'', L'!'); | ||||
|   VERIFY( original == round_trip ); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| main() | ||||
| { | ||||
|   test01(); | ||||
|   test02(); | ||||
|   test03(); | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 Jonathan Wakely
						Jonathan Wakely