From b90686c1ec584d2e9dc91b32384d8782f99a9fd9 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Fri, 7 Mar 2014 21:45:32 +0000 Subject: [PATCH] Implement LWG #2344: quoted()'s interaction with padding is unclear. I think that anyone using quoted with padding is really confused, but it should work the way the rest of iostreams works. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@203290 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/iomanip | 11 +++++---- .../quoted.manip/quoted.pass.cpp | 23 +++++++++++++++---- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/include/iomanip b/include/iomanip index e334c7de9..a5042c7df 100644 --- a/include/iomanip +++ b/include/iomanip @@ -519,15 +519,16 @@ std::basic_ostream<_CharT, _Traits> & __quoted_output ( basic_ostream<_CharT, _Traits> &__os, _ForwardIterator __first, _ForwardIterator __last, _CharT __delim, _CharT __escape ) { - __os << __delim; + _VSTD::basic_string<_CharT, _Traits> __str; + __str.push_back(__delim); for ( ; __first != __last; ++ __first ) { if (_Traits::eq (*__first, __escape) || _Traits::eq (*__first, __delim)) - __os << __escape; - __os << *__first; + __str.push_back(__escape); + __str.push_back(*__first); } - __os << __delim; - return __os; + __str.push_back(__delim); + return __put_character_sequence(__os, __str.data(), __str.size()); } template diff --git a/test/input.output/iostream.format/quoted.manip/quoted.pass.cpp b/test/input.output/iostream.format/quoted.manip/quoted.pass.cpp index 1f6b12674..d09b3cae4 100644 --- a/test/input.output/iostream.format/quoted.manip/quoted.pass.cpp +++ b/test/input.output/iostream.format/quoted.manip/quoted.pass.cpp @@ -28,13 +28,13 @@ bool is_skipws ( const std::wistream *is ) { } void both_ways ( const char *p ) { - std::string str(p); - auto q = std::quoted(str); + std::string str(p); + auto q = std::quoted(str); std::stringstream ss; bool skippingws = is_skipws ( &ss ); - ss << q; - ss >> q; + ss << q; + ss >> q; } void round_trip ( const char *p ) { @@ -92,6 +92,20 @@ std::string unquote ( const char *p, char delim='"', char escape='\\' ) { return s; } +void test_padding () { + { + std::stringstream ss; + ss << std::left << std::setw(10) << std::setfill('!') << std::quoted("abc", '`'); + assert ( ss.str() == "`abc`!!!!!" ); + } + + { + std::stringstream ss; + ss << std::right << std::setw(10) << std::setfill('!') << std::quoted("abc", '`'); + assert ( ss.str() == "!!!!!`abc`" ); + } +} + void round_trip ( const wchar_t *p ) { std::wstringstream ss; @@ -197,6 +211,7 @@ int main() assert ( unquote ( "" ) == "" ); // nothing there assert ( unquote ( L"" ) == L"" ); // nothing there + test_padding (); } #else