1// Copyright (C) 2015 Free Software Foundation, Inc. 2// 3// This file is part of the GNU ISO C++ Library. This library is free 4// software; you can redistribute it and/or modify it under the 5// terms of the GNU General Public License as published by the 6// Free Software Foundation; either version 3, or (at your option) 7// any later version. 8 9// This library is distributed in the hope that it will be useful, 10// but WITHOUT ANY WARRANTY; without even the implied warranty of 11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12// GNU General Public License for more details. 13 14// You should have received a copy of the GNU General Public License along 15// with this library; see the file COPYING3. If not see 16// <http://www.gnu.org/licenses/>. 17 18// { dg-require-cstdint "" } 19// { dg-options "-std=gnu++11" } 20 21#include <locale> 22#include <iterator> 23#include <string> 24#include <testsuite_hooks.h> 25 26const char expected[] = u8"�������"; 27const std::size_t expected_len = std::char_traits<char>::length(expected); 28 29template<typename C> 30void test(const C* from) 31{ 32 auto len = std::char_traits<C>::length(from); 33 std::mbstate_t state{}; 34 char buf[16] = { }; 35 using test_type = std::codecvt<C, char, std::mbstate_t>; 36 const test_type& cvt = std::use_facet<test_type>(std::locale::classic()); 37 auto from_end = from + len; 38 auto from_next = from; 39 auto buf_end = std::end(buf); 40 auto buf_next = buf; 41 auto res = cvt.out(state, from, from_end, from_next, buf, buf_end, buf_next); 42 VERIFY( res == std::codecvt_base::ok ); 43 VERIFY( from_next == from_end ); 44 VERIFY( (buf_next - buf) == expected_len ); 45 VERIFY( 0 == std::char_traits<char>::compare(buf, expected, expected_len) ); 46 47 C buf2[16]; 48 auto exp_end = expected + expected_len; 49 auto exp_next = expected; 50 auto buf2_end = std::end(buf2); 51 auto buf2_next = buf2; 52 res = cvt.in(state, expected, exp_end, exp_next, buf2, buf2_end, buf2_next); 53 VERIFY( res == std::codecvt_base::ok ); 54 VERIFY( exp_next == exp_end ); 55 VERIFY( (buf2_next - buf2) == len ); 56 VERIFY( 0 == std::char_traits<C>::compare(buf2, from, len) ); 57} 58 59void 60test01() 61{ 62 test(u"�������"); 63} 64 65void 66test02() 67{ 68 test(U"�������"); 69} 70 71int 72main() 73{ 74 test01(); 75 test02(); 76} 77