81 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <locale>10 11// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT12 13// wstring_convert<Codecvt, Elem, Wide_alloc, Byte_alloc>14 15// wide_string from_bytes(char byte);16// wide_string from_bytes(const char* ptr);17// wide_string from_bytes(const byte_string& str);18// wide_string from_bytes(const char* first, const char* last);19 20// XFAIL: no-wide-characters21 22#include <locale>23#include <codecvt>24#include <cassert>25 26#include "test_macros.h"27 28template <class CharT, std::size_t = sizeof(CharT)>29struct TestHelper;30template <class CharT>31struct TestHelper<CharT, 2> {32 static void test();33};34template <class CharT>35struct TestHelper<CharT, 4> {36 static void test();37};38 39template <class CharT>40void TestHelper<CharT, 2>::test() {41 static_assert((std::is_same<CharT, wchar_t>::value), "");42 {43 std::wstring_convert<std::codecvt_utf8<CharT> > myconv;44 std::string bs("\xE1\x80\x85");45 std::wstring ws = myconv.from_bytes('a');46 assert(ws == L"a");47 ws = myconv.from_bytes(bs.c_str());48 assert(ws == L"\u1005");49 ws = myconv.from_bytes(bs);50 assert(ws == L"\u1005");51 ws = myconv.from_bytes(bs.data(), bs.data() + bs.size());52 assert(ws == L"\u1005");53 ws = myconv.from_bytes("");54 assert(ws.size() == 0);55 }56}57 58template <class CharT>59void TestHelper<CharT, 4>::test() {60 static_assert((std::is_same<CharT, wchar_t>::value), "");61 {62 std::wstring_convert<std::codecvt_utf8<CharT> > myconv;63 std::string bs("\xF1\x80\x80\x83");64 std::wstring ws = myconv.from_bytes('a');65 assert(ws == L"a");66 ws = myconv.from_bytes(bs.c_str());67 assert(ws == L"\U00040003");68 ws = myconv.from_bytes(bs);69 assert(ws == L"\U00040003");70 ws = myconv.from_bytes(bs.data(), bs.data() + bs.size());71 assert(ws == L"\U00040003");72 ws = myconv.from_bytes("");73 assert(ws.size() == 0);74 }75}76 77int main(int, char**) {78 TestHelper<wchar_t>::test();79 return 0;80}81