1// { dg-options "-std=gnu++11" } 2 3// Copyright (C) 2012 Free Software Foundation 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING3. If not see 18// <http://www.gnu.org/licenses/>. 19 20// 22.3.3.2.3 Buffer conversions 21 22#include <locale> 23#include <sstream> 24#include <testsuite_hooks.h> 25 26template<typename Elem> 27struct cvt : std::codecvt<Elem, char, std::mbstate_t> { }; 28 29template<typename Elem> 30using buf_conv = std::wbuffer_convert<cvt<Elem>, Elem>; 31 32using std::string; 33using std::stringstream; 34using std::wstring; 35using std::wstringstream; 36 37void test01() 38{ 39 buf_conv<wchar_t> buf; 40 std::stringbuf sbuf; 41 VERIFY( buf.rdbuf() == nullptr ); 42 VERIFY( buf.rdbuf(&sbuf) == nullptr ); 43 VERIFY( buf.rdbuf() == &sbuf ); 44 VERIFY( buf.rdbuf(nullptr) == &sbuf ); 45} 46 47void test02() 48{ 49 std::stringbuf sbuf; 50 buf_conv<char> buf(&sbuf); // noconv 51 52 stringstream ss; 53 ss.std::ios::rdbuf(&buf); 54 string input = "King for a day..."; 55 ss << input << std::flush; 56 string output = sbuf.str(); 57 VERIFY( input == output ); 58} 59 60void test03() 61{ 62 std::stringbuf sbuf; 63 buf_conv<wchar_t> buf(&sbuf); 64 65 wstringstream ss; 66 ss.std::wios::rdbuf(&buf); 67 wstring input = L"Fool for a lifetime"; 68 ss << input << std::flush; 69 string output = sbuf.str(); 70 VERIFY( output == "Fool for a lifetime" ); 71} 72 73int main() 74{ 75 test01(); 76 test02(); 77 test03(); 78} 79