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>
|
2018-06-05 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
* include/std/type_traits: Fix comment typos.
|
* include/std/type_traits: Fix comment typos.
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
_CharT _M_escape;
|
_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.
|
* @brief Inserter for quoted strings.
|
||||||
*
|
*
|
||||||
|
|
@ -101,7 +119,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
{
|
{
|
||||||
std::basic_ostringstream<_CharT, _Traits> __ostr;
|
std::basic_ostringstream<_CharT, _Traits> __ostr;
|
||||||
__ostr << __str._M_delim;
|
__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)
|
if (__c == __str._M_delim || __c == __str._M_escape)
|
||||||
__ostr << __str._M_escape;
|
__ostr << __str._M_escape;
|
||||||
|
|
|
||||||
|
|
@ -446,7 +446,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
return __is;
|
return __is;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __cplusplus > 201103L
|
#if __cplusplus >= 201402L
|
||||||
|
|
||||||
#define __cpp_lib_quoted_string_io 201304
|
#define __cpp_lib_quoted_string_io 201304
|
||||||
|
|
||||||
|
|
@ -471,8 +471,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
_CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\'))
|
_CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\'))
|
||||||
{
|
{
|
||||||
return __detail::_Quoted_string<
|
return __detail::_Quoted_string<
|
||||||
const basic_string<_CharT, _Traits, _Alloc>&, _CharT>(
|
const basic_string<_CharT, _Traits, _Alloc>&, _CharT>(
|
||||||
__string, __delim, __escape);
|
__string, __delim, __escape);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename _CharT, typename _Traits, typename _Alloc>
|
template<typename _CharT, typename _Traits, typename _Alloc>
|
||||||
|
|
@ -481,11 +481,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
_CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\'))
|
_CharT __delim = _CharT('"'), _CharT __escape = _CharT('\\'))
|
||||||
{
|
{
|
||||||
return __detail::_Quoted_string<
|
return __detail::_Quoted_string<
|
||||||
basic_string<_CharT, _Traits, _Alloc>&, _CharT>(
|
basic_string<_CharT, _Traits, _Alloc>&, _CharT>(
|
||||||
__string, __delim, __escape);
|
__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
|
#endif // __cplusplus >= 201103L
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
// with this library; see the file COPYING3. If not see
|
// with this library; see the file COPYING3. If not see
|
||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// 27.7.6 - Quoted manipulators [quoted.manip]
|
// C++14 27.7.6 - Quoted manipulators [quoted.manip]
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#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
|
// with this library; see the file COPYING3. If not see
|
||||||
// <http://www.gnu.org/licenses/>.
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// 27.7.6 - Quoted manipulators [quoted.manip]
|
// C++14 27.7.6 - Quoted manipulators [quoted.manip]
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#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