1// 1999-08-16 bkoz 2 3// Copyright (C) 1999, 2000, 2002, 2003, 2009 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// 27.6.2.5.4 basic_ostream character inserters 21 22#include <string> 23#include <ostream> 24#include <sstream> 25#include <locale> 26#include <testsuite_hooks.h> 27 28// Global counter, needs to be reset after use. 29bool used; 30 31class gnu_ctype : public std::ctype<wchar_t> 32{ 33protected: 34 char_type 35 do_widen(char c) const 36 { 37 used = true; 38 return std::ctype<wchar_t>::do_widen(c); 39 } 40 41 const char* 42 do_widen(const char* low, const char* high, char_type* dest) const 43 { 44 used = true; 45 return std::ctype<wchar_t>::do_widen(low, high, dest); 46 } 47}; 48 49// 27.6.2.5.4 - Character inserter template functions 50// [lib.ostream.inserters.character] 51void test07() 52{ 53 using namespace std; 54 bool test __attribute__((unused)) = true; 55 56 const char* buffer = "SFPL 5th floor, outside carrol, the Asian side"; 57 58 wostringstream oss; 59 oss.imbue(locale(locale::classic(), new gnu_ctype)); 60 61 // 1 62 // template<class charT, class traits> 63 // basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& out, 64 // const char* s); 65 used = false; 66 oss << buffer; 67 VERIFY( used ); // Only required for char_type != char 68 wstring str = oss.str(); 69 wchar_t c1 = oss.widen(buffer[0]); 70 VERIFY( str[0] == c1 ); 71 wchar_t c2 = oss.widen(buffer[1]); 72 VERIFY( str[1] == c2 ); 73 74 // 2 75 // template<class charT, class traits> 76 // basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& out, 77 // char c); 78 used = false; 79 oss.str(wstring()); 80 oss << 'b'; 81 VERIFY( used ); // Only required for char_type != char 82 str = oss.str(); 83 wchar_t c3 = oss.widen('b'); 84 VERIFY( str[0] == c3 ); 85} 86 87int main() 88{ 89 test07(); 90 return 0; 91} 92