DR 2344 - std::quoted doesn't respect padding

2014-06-06  Ed Smith-Rowland  <3dw4rd@verizon.net>

	DR 2344 - std::quoted doesn't respect padding
	* include/std/iomanip: Allow for padding in quoted inserters.
	* testsuite/27_io/manipulators/standard/char/dr2344.cc: New.
	* testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc: New.

From-SVN: r211340
This commit is contained in:
Ed Smith-Rowland 2014-06-07 03:40:30 +00:00 committed by Edward Smith-Rowland
parent 4307f07ffa
commit 25608e3a5f
4 changed files with 130 additions and 15 deletions

View File

@ -1,3 +1,10 @@
2014-06-06 Ed Smith-Rowland <3dw4rd@verizon.net>
DR 2344 - std::quoted doesn't respect padding
* include/std/iomanip: Allow for padding in quoted inserters.
* testsuite/27_io/manipulators/standard/char/dr2344.cc: New.
* testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc: New.
2014-06-06 François Dumont <fdumont@gcc.gnu.org>
* testsuite/23_containers/map/operators/1.cc: Simplify test.

View File

@ -41,6 +41,9 @@
#if __cplusplus >= 201103L
#include <locale>
#if __cplusplus > 201103L
#include <sstream> // used in quoted.
#endif
#endif
namespace std _GLIBCXX_VISIBILITY(default)
@ -342,7 +345,6 @@ _GLIBCXX_END_NAMESPACE_VERSION
/**
* @brief Struct for delimited strings.
* The left and right delimiters can be different.
*/
template<typename _String, typename _CharT>
struct _Quoted_string
@ -364,45 +366,51 @@ _GLIBCXX_END_NAMESPACE_VERSION
};
/**
* @brief Inserter for delimited strings.
* The left and right delimiters can be different.
* @brief Inserter for quoted strings.
*
* _GLIBCXX_RESOLVE_LIB_DEFECTS
* DR 2344 quoted()'s interaction with padding is unclear
*/
template<typename _CharT, typename _Traits>
auto&
operator<<(std::basic_ostream<_CharT, _Traits>& __os,
const _Quoted_string<const _CharT*, _CharT>& __str)
{
__os << __str._M_delim;
std::basic_ostringstream<_CharT, _Traits> __ostr;
__ostr << __str._M_delim;
for (const _CharT* __c = __str._M_string; *__c; ++__c)
{
if (*__c == __str._M_delim || *__c == __str._M_escape)
__os << __str._M_escape;
__os << *__c;
__ostr << __str._M_escape;
__ostr << *__c;
}
__os << __str._M_delim;
__ostr << __str._M_delim;
return __os;
return __os << __ostr.str();
}
/**
* @brief Inserter for delimited strings.
* The left and right delimiters can be different.
* @brief Inserter for quoted strings.
*
* _GLIBCXX_RESOLVE_LIB_DEFECTS
* DR 2344 quoted()'s interaction with padding is unclear
*/
template<typename _CharT, typename _Traits, typename _String>
auto&
operator<<(std::basic_ostream<_CharT, _Traits>& __os,
const _Quoted_string<_String, _CharT>& __str)
{
__os << __str._M_delim;
std::basic_ostringstream<_CharT, _Traits> __ostr;
__ostr << __str._M_delim;
for (auto& __c : __str._M_string)
{
if (__c == __str._M_delim || __c == __str._M_escape)
__os << __str._M_escape;
__os << __c;
__ostr << __str._M_escape;
__ostr << __c;
}
__os << __str._M_delim;
__ostr << __str._M_delim;
return __os;
return __os << __ostr.str();
}
/**

View File

@ -0,0 +1,50 @@
// { dg-do run }
// { dg-options "-std=gnu++14" }
// Copyright (C) 2014 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/>.
// 27.7.6 - Quoted manipulators [quoted.manip]
#include <sstream>
#include <iomanip>
#include <testsuite_hooks.h>
void
test01()
{
bool test [[gnu::unused]] = true;
std::ostringstream ssx;
ssx << "[" << std::left << std::setfill('x') << std::setw(20) << R"("AB \"CD\" EF")" << "]";
VERIFY( ssx.str() == R"(["AB \"CD\" EF"xxxxxx])" );
std::ostringstream ssy;
ssy << "[" << std::left << std::setfill('y') << std::setw(20) << std::quoted(R"(GH "IJ" KL)") << "]";
VERIFY( ssy.str() == R"(["GH \"IJ\" KL"yyyyyy])" );
std::ostringstream ssz;
ssz << "[" << std::right << std::setfill('z') << std::setw(20) << std::quoted(R"(PQ "RS" TU)") << "]";
VERIFY( ssz.str() == R"([zzzzzz"PQ \"RS\" TU"])" );
}
int
main()
{
test01();
return 0;
}

View File

@ -0,0 +1,50 @@
// { dg-do run }
// { dg-options "-std=gnu++14" }
// Copyright (C) 2014 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/>.
// 27.7.6 - Quoted manipulators [quoted.manip]
#include <sstream>
#include <iomanip>
#include <testsuite_hooks.h>
void
test01()
{
bool test [[gnu::unused]] = true;
std::wostringstream ssx;
ssx << L"[" << std::left << std::setfill(L'x') << std::setw(20) << LR"("AB \"CD\" EF")" << L"]";
VERIFY( ssx.str() == LR"(["AB \"CD\" EF"xxxxxx])" );
std::wostringstream ssy;
ssy << L"[" << std::left << std::setfill(L'y') << std::setw(20) << std::quoted(LR"(GH "IJ" KL)") << L"]";
VERIFY( ssy.str() == LR"(["GH \"IJ\" KL"yyyyyy])" );
std::wostringstream ssz;
ssz << L"[" << std::right << std::setfill(L'z') << std::setw(20) << std::quoted(LR"(PQ "RS" TU)") << L"]";
VERIFY( ssz.str() == LR"([zzzzzz"PQ \"RS\" TU"])" );
}
int
main()
{
test01();
return 0;
}