// { dg-options "-std=gnu++11" } // Copyright (C) 2012 Free Software Foundation // // 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 // . // 22.3.3.2.2 String conversions #include #include #include template struct cvt : std::codecvt { }; template using str_conv = std::wstring_convert, Elem>; using std::string; using std::u16string; using std::u32string; // test construction with state, for partial conversions void test01() { typedef str_conv wsc; wsc c; string input = u8"\u00a3 shillings pence"; string woutput = c.from_bytes(input.substr(0, 1)); auto partial_state = c.state(); auto partial_count = c.converted(); auto woutput2 = c.from_bytes(u8"state reset on next conversion"); VERIFY( woutput2 == u8"state reset on next conversion" ); wsc c2(new cvt, partial_state); woutput += c2.from_bytes(input.substr(partial_count)); VERIFY( u8"\u00a3 shillings pence" == woutput ); string roundtrip = c2.to_bytes(woutput); VERIFY( input == roundtrip ); } void test02() { typedef str_conv wsc; wsc c; string input = u8"\u00a3 shillings pence"; u16string woutput = c.from_bytes(input.substr(0, 1)); auto partial_state = c.state(); auto partial_count = c.converted(); auto woutput2 = c.from_bytes(u8"state reset on next conversion"); VERIFY( woutput2 == u"state reset on next conversion" ); wsc c2(new cvt, partial_state); woutput += c2.from_bytes(input.substr(partial_count)); VERIFY( u"\u00a3 shillings pence" == woutput ); string roundtrip = c2.to_bytes(woutput); VERIFY( input == roundtrip ); } void test03() { typedef str_conv wsc; wsc c; string input = u8"\u00a3 shillings pence"; u32string woutput = c.from_bytes(input.substr(0, 1)); auto partial_state = c.state(); auto partial_count = c.converted(); auto woutput2 = c.from_bytes(u8"state reset on next conversion"); VERIFY( woutput2 == U"state reset on next conversion" ); wsc c2(new cvt, partial_state); woutput += c2.from_bytes(input.substr(partial_count)); VERIFY( U"\u00a3 shillings pence" == woutput ); string roundtrip = c2.to_bytes(woutput); VERIFY( input == roundtrip ); } int main() { test01(); test02(); test03(); }