1// { dg-options "-std=gnu++11" } 2 3// Copyright (C) 2014-2015 Free Software Foundation, Inc. 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// 27.8.4.2 Assign and swap [ostringstream.assign] 21 22#include <sstream> 23#include <string> 24#include <testsuite_hooks.h> 25 26const std::string strings[] = { 27 "one could carry out the description of a machine, ", 28 "no matter how complicated, ", 29 "in characters which would be merely the letters of the alphabet, and so ", 30 "provide the mind with a method of knowing the machine and all its parts" 31}; 32 33void 34append(std::ostringstream& ss, std::string& s, const std::string& t) 35{ 36 ss << t; 37 s += t; 38} 39 40// assign 41void 42test01() 43{ 44 std::string exp; 45 std::ostringstream s1; 46 append(s1, exp, strings[0]); 47 48 std::ostringstream s2; 49 s2 = std::move(s1); 50 VERIFY( s2.str() == exp ); 51 append(s2, exp, strings[1]); 52 VERIFY( s2.str() == exp ); 53 54 std::ostringstream s3; 55 s3 = std::move(s2); 56 VERIFY( s3.str() == exp ); 57 append(s3, exp, strings[2]); 58 VERIFY( s3.str() == exp ); 59 60 s1.setstate(std::ios::failbit); 61 s1 = std::move(s3); 62 VERIFY( s1.good() ); 63 VERIFY( s1.str() == exp ); 64 append(s1, exp, strings[3]); 65 VERIFY( s1.str() == exp ); 66} 67 68// swap 69void 70test02() 71{ 72 std::string exp; 73 std::ostringstream s1; 74 append(s1, exp, strings[0]); 75 76 std::ostringstream s2; 77 s2.swap(s1); 78 VERIFY( s1.str().empty() ); 79 VERIFY( s2.str() == exp ); 80 append(s2, exp, strings[1]); 81 VERIFY( s2.str() == exp ); 82 83 std::ostringstream s3; 84 swap(s3, s2); 85 VERIFY( s2.str().empty() ); 86 VERIFY( s3.str() == exp ); 87 append(s3, exp, strings[2]); 88 VERIFY( s3.str() == exp ); 89 90 s1.setstate(std::ios::failbit); 91 swap(s1, s3); 92 VERIFY( s1.good() ); 93 VERIFY( s3.fail() ); 94 VERIFY( s2.str().empty() ); 95 VERIFY( s1.str() == exp ); 96 append(s1, exp, strings[3]); 97 VERIFY( s1.str() == exp ); 98} 99 100void 101test03() 102{ 103#ifdef _GLIBCXX_USE_WCHAR_T 104 std::wistringstream s0, s; 105 s = std::move(s0); 106 s.swap(s0); 107 swap(s, s0); 108#endif 109} 110 111int 112main() 113{ 114 test01(); 115 test02(); 116 test03(); 117} 118