brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.7 KiB · 0cf6290 Raw
250 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// <codecvt>10 11// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT12 13// template <class Elem, unsigned long Maxcode = 0x10ffff,14//           codecvt_mode Mode = (codecvt_mode)0>15// class codecvt_utf8_utf1616//     : public codecvt<Elem, char, mbstate_t>17// {18//     // unspecified19// };20 21// result22//     in(stateT& state,23//        const externT* from, const externT* from_end, const externT*& from_next,24//        internT* to, internT* to_end, internT*& to_next) const;25 26#include <codecvt>27#include <cassert>28 29#include "test_macros.h"30 31template <class CharT, std::size_t = sizeof(CharT)>32struct TestHelper;33template <class CharT>34struct TestHelper<CharT, 2> {35  static void test();36};37template <class CharT>38struct TestHelper<CharT, 4> {39  static void test();40};41 42template <class CharT>43void TestHelper<CharT, 2>::test() {44  {45    typedef std::codecvt_utf8_utf16<CharT, 0x1000> C;46    C c;47    CharT w[2] = {0};48    char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};49    CharT* wp = nullptr;50    std::mbstate_t m;51    const char* np = nullptr;52    std::codecvt_base::result r = c.in(m, n, n + 4, np, w, w + 2, wp);53    assert(r == std::codecvt_base::error);54    assert(wp == w);55    assert(np == n);56 57    n[0] = char(0xE1);58    n[1] = char(0x80);59    n[2] = char(0x85);60    r = c.in(m, n, n + 3, np, w, w + 2, wp);61    assert(r == std::codecvt_base::error);62    assert(wp == w);63    assert(np == n);64 65    n[0] = char(0xD1);66    n[1] = char(0x93);67    r = c.in(m, n, n + 2, np, w, w + 2, wp);68    assert(r == std::codecvt_base::ok);69    assert(wp == w + 1);70    assert(np == n + 2);71    assert(w[0] == 0x0453);72 73    n[0] = char(0x56);74    r = c.in(m, n, n + 1, np, w, w + 2, wp);75    assert(r == std::codecvt_base::ok);76    assert(wp == w + 1);77    assert(np == n + 1);78    assert(w[0] == 0x0056);79  }80  {81    typedef std::codecvt_utf8_utf16<CharT, 0x10ffff, std::consume_header> C;82    C c;83    CharT w[2] = {0};84    char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1),85                 char(0x80), char(0x80), char(0x83)};86    CharT* wp = nullptr;87    std::mbstate_t m;88    const char* np = nullptr;89    std::codecvt_base::result r = c.in(m, n, n + 7, np, w, w + 2, wp);90    assert(r == std::codecvt_base::ok);91    assert(wp == w + 2);92    assert(np == n + 7);93    assert(w[0] == 0xD8C0);94    assert(w[1] == 0xDC03);95 96    n[0] = char(0xE1);97    n[1] = char(0x80);98    n[2] = char(0x85);99    r = c.in(m, n, n + 3, np, w, w + 2, wp);100    assert(r == std::codecvt_base::ok);101    assert(wp == w + 1);102    assert(np == n + 3);103    assert(w[0] == 0x1005);104 105    n[0] = char(0xD1);106    n[1] = char(0x93);107    r = c.in(m, n, n + 2, np, w, w + 2, wp);108    assert(r == std::codecvt_base::ok);109    assert(wp == w + 1);110    assert(np == n + 2);111    assert(w[0] == 0x0453);112 113    n[0] = char(0x56);114    r = c.in(m, n, n + 1, np, w, w + 2, wp);115    assert(r == std::codecvt_base::ok);116    assert(wp == w + 1);117    assert(np == n + 1);118    assert(w[0] == 0x0056);119  }120}121 122template <class CharT>123void TestHelper<CharT, 4>::test() {124  {125    typedef std::codecvt_utf8_utf16<CharT> C;126    C c;127    CharT w[2] = {0};128    char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};129    CharT* wp = nullptr;130    std::mbstate_t m;131    const char* np = nullptr;132    std::codecvt_base::result r = c.in(m, n, n + 4, np, w, w + 2, wp);133    assert(r == std::codecvt_base::ok);134    assert(wp == w + 2);135    assert(np == n + 4);136    assert(w[0] == 0xD8C0);137    assert(w[1] == 0xDC03);138 139    n[0] = char(0xE1);140    n[1] = char(0x80);141    n[2] = char(0x85);142    r = c.in(m, n, n + 3, np, w, w + 2, wp);143    assert(r == std::codecvt_base::ok);144    assert(wp == w + 1);145    assert(np == n + 3);146    assert(w[0] == 0x1005);147 148    n[0] = char(0xD1);149    n[1] = char(0x93);150    r = c.in(m, n, n + 2, np, w, w + 2, wp);151    assert(r == std::codecvt_base::ok);152    assert(wp == w + 1);153    assert(np == n + 2);154    assert(w[0] == 0x0453);155 156    n[0] = char(0x56);157    r = c.in(m, n, n + 1, np, w, w + 2, wp);158    assert(r == std::codecvt_base::ok);159    assert(wp == w + 1);160    assert(np == n + 1);161    assert(w[0] == 0x0056);162  }163  {164    typedef std::codecvt_utf8_utf16<CharT, 0x1000> C;165    C c;166    CharT w[2] = {0};167    char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};168    CharT* wp = nullptr;169    std::mbstate_t m;170    const char* np = nullptr;171    std::codecvt_base::result r = c.in(m, n, n + 4, np, w, w + 2, wp);172    assert(r == std::codecvt_base::error);173    assert(wp == w);174    assert(np == n);175 176    n[0] = char(0xE1);177    n[1] = char(0x80);178    n[2] = char(0x85);179    r = c.in(m, n, n + 3, np, w, w + 2, wp);180    assert(r == std::codecvt_base::error);181    assert(wp == w);182    assert(np == n);183 184    n[0] = char(0xD1);185    n[1] = char(0x93);186    r = c.in(m, n, n + 2, np, w, w + 2, wp);187    assert(r == std::codecvt_base::ok);188    assert(wp == w + 1);189    assert(np == n + 2);190    assert(w[0] == 0x0453);191 192    n[0] = char(0x56);193    r = c.in(m, n, n + 1, np, w, w + 2, wp);194    assert(r == std::codecvt_base::ok);195    assert(wp == w + 1);196    assert(np == n + 1);197    assert(w[0] == 0x0056);198  }199  {200    typedef std::codecvt_utf8_utf16<CharT, 0x10ffff, std::consume_header> C;201    C c;202    CharT w[2] = {0};203    char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1),204                 char(0x80), char(0x80), char(0x83)};205    CharT* wp = nullptr;206    std::mbstate_t m;207    const char* np = nullptr;208    std::codecvt_base::result r = c.in(m, n, n + 7, np, w, w + 2, wp);209    assert(r == std::codecvt_base::ok);210    assert(wp == w + 2);211    assert(np == n + 7);212    assert(w[0] == 0xD8C0);213    assert(w[1] == 0xDC03);214 215    n[0] = char(0xE1);216    n[1] = char(0x80);217    n[2] = char(0x85);218    r = c.in(m, n, n + 3, np, w, w + 2, wp);219    assert(r == std::codecvt_base::ok);220    assert(wp == w + 1);221    assert(np == n + 3);222    assert(w[0] == 0x1005);223 224    n[0] = char(0xD1);225    n[1] = char(0x93);226    r = c.in(m, n, n + 2, np, w, w + 2, wp);227    assert(r == std::codecvt_base::ok);228    assert(wp == w + 1);229    assert(np == n + 2);230    assert(w[0] == 0x0453);231 232    n[0] = char(0x56);233    r = c.in(m, n, n + 1, np, w, w + 2, wp);234    assert(r == std::codecvt_base::ok);235    assert(wp == w + 1);236    assert(np == n + 1);237    assert(w[0] == 0x0056);238  }239}240 241int main(int, char**) {242#if !defined(_WIN32) && !defined(TEST_HAS_NO_WIDE_CHARACTERS)243  TestHelper<wchar_t>::test();244#endif245  TestHelper<char32_t>::test();246  TestHelper<char16_t>::test();247 248  return 0;249}250