brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.7 KiB · 6889895 Raw
332 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_utf1616//     : public codecvt<Elem, char, mbstate_t>17// {18//     // unspecified19// };20 21// int length(stateT& state, const externT* from, const externT* from_end,22//            size_t max) const;23 24#include <codecvt>25#include <cassert>26 27#include "test_macros.h"28 29template <class CharT, std::size_t = sizeof(CharT)>30struct TestHelper;31 32template <class CharT>33struct TestHelper<CharT, 2> {34  static void test();35};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_utf16<char16_t> C;46    C c;47    char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};48    std::mbstate_t m;49    int r = c.length(m, n, n + 4, 2);50    assert(r == 0);51 52    n[0] = char(0x10);53    n[1] = char(0x05);54    r = c.length(m, n, n + 2, 2);55    assert(r == 2);56 57    n[0] = char(0x04);58    n[1] = char(0x53);59    r = c.length(m, n, n + 2, 2);60    assert(r == 2);61 62    n[0] = char(0x00);63    n[1] = char(0x56);64    r = c.length(m, n, n + 2, 2);65    assert(r == 2);66  }67  {68    typedef std::codecvt_utf16<char16_t, 0x1000> C;69    C c;70    char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};71    std::mbstate_t m;72    int r = c.length(m, n, n + 4, 2);73    assert(r == 0);74 75    n[0] = char(0x10);76    n[1] = char(0x05);77    r = c.length(m, n, n + 2, 2);78    assert(r == 0);79 80    n[0] = char(0x04);81    n[1] = char(0x53);82    r = c.length(m, n, n + 2, 2);83    assert(r == 2);84 85    n[0] = char(0x00);86    n[1] = char(0x56);87    r = c.length(m, n, n + 2, 2);88    assert(r == 2);89  }90  {91    typedef std::codecvt_utf16<char16_t, 0x10ffff, std::consume_header> C;92    C c;93    char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};94    std::mbstate_t m;95    int r = c.length(m, n, n + 6, 2);96    assert(r == 2);97 98    n[0] = char(0x10);99    n[1] = char(0x05);100    r = c.length(m, n, n + 2, 2);101    assert(r == 2);102 103    n[0] = char(0x04);104    n[1] = char(0x53);105    r = c.length(m, n, n + 2, 2);106    assert(r == 2);107 108    n[0] = char(0x00);109    n[1] = char(0x56);110    r = c.length(m, n, n + 2, 2);111    assert(r == 2);112  }113  {114    typedef std::codecvt_utf16<char16_t, 0x10ffff, std::little_endian> C;115    C c;116    char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};117    std::mbstate_t m;118    int r = c.length(m, n, n + 4, 2);119    assert(r == 0);120 121    n[1] = char(0x10);122    n[0] = char(0x05);123    r = c.length(m, n, n + 2, 2);124    assert(r == 2);125 126    n[1] = char(0x04);127    n[0] = char(0x53);128    r = c.length(m, n, n + 2, 2);129    assert(r == 2);130 131    n[1] = char(0x00);132    n[0] = char(0x56);133    r = c.length(m, n, n + 2, 2);134    assert(r == 2);135  }136  {137    typedef std::codecvt_utf16<char16_t, 0x1000, std::little_endian> C;138    C c;139    char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};140    std::mbstate_t m;141    int r = c.length(m, n, n + 4, 2);142    assert(r == 0);143 144    n[1] = char(0x10);145    n[0] = char(0x05);146    r = c.length(m, n, n + 2, 2);147    assert(r == 0);148 149    n[1] = char(0x04);150    n[0] = char(0x53);151    r = c.length(m, n, n + 2, 2);152    assert(r == 2);153 154    n[1] = char(0x00);155    n[0] = char(0x56);156    r = c.length(m, n, n + 2, 2);157    assert(r == 2);158  }159  {160    typedef std::codecvt_utf16<char16_t, 0x10ffff, std::codecvt_mode(std::consume_header | std::little_endian)> C;161    C c;162    char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};163    std::mbstate_t m;164    int r = c.length(m, n, n + 6, 2);165    assert(r == 2);166 167    n[1] = char(0x10);168    n[0] = char(0x05);169    r = c.length(m, n, n + 2, 2);170    assert(r == 2);171 172    n[1] = char(0x04);173    n[0] = char(0x53);174    r = c.length(m, n, n + 2, 2);175    assert(r == 2);176 177    n[1] = char(0x00);178    n[0] = char(0x56);179    r = c.length(m, n, n + 2, 2);180    assert(r == 2);181  }182}183 184template <class CharT>185void TestHelper<CharT, 4>::test() {186  {187    typedef std::codecvt_utf16<char32_t> C;188    C c;189    char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};190    std::mbstate_t m;191    int r = c.length(m, n, n + 4, 2);192    assert(r == 4);193 194    n[0] = char(0x10);195    n[1] = char(0x05);196    r = c.length(m, n, n + 2, 2);197    assert(r == 2);198 199    n[0] = char(0x04);200    n[1] = char(0x53);201    r = c.length(m, n, n + 2, 2);202    assert(r == 2);203 204    n[0] = char(0x00);205    n[1] = char(0x56);206    r = c.length(m, n, n + 2, 2);207    assert(r == 2);208  }209  {210    typedef std::codecvt_utf16<char32_t, 0x1000> C;211    C c;212    char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};213    std::mbstate_t m;214    int r = c.length(m, n, n + 4, 2);215    assert(r == 0);216 217    n[0] = char(0x10);218    n[1] = char(0x05);219    r = c.length(m, n, n + 2, 2);220    assert(r == 0);221 222    n[0] = char(0x04);223    n[1] = char(0x53);224    r = c.length(m, n, n + 2, 2);225    assert(r == 2);226 227    n[0] = char(0x00);228    n[1] = char(0x56);229    r = c.length(m, n, n + 2, 2);230    assert(r == 2);231  }232  {233    typedef std::codecvt_utf16<char32_t, 0x10ffff, std::consume_header> C;234    C c;235    char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};236    std::mbstate_t m;237    int r = c.length(m, n, n + 6, 2);238    assert(r == 6);239 240    n[0] = char(0x10);241    n[1] = char(0x05);242    r = c.length(m, n, n + 2, 2);243    assert(r == 2);244 245    n[0] = char(0x04);246    n[1] = char(0x53);247    r = c.length(m, n, n + 2, 2);248    assert(r == 2);249 250    n[0] = char(0x00);251    n[1] = char(0x56);252    r = c.length(m, n, n + 2, 2);253    assert(r == 2);254  }255  {256    typedef std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian> C;257    C c;258    char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};259    std::mbstate_t m;260    int r = c.length(m, n, n + 4, 2);261    assert(r == 4);262 263    n[1] = char(0x10);264    n[0] = char(0x05);265    r = c.length(m, n, n + 2, 2);266    assert(r == 2);267 268    n[1] = char(0x04);269    n[0] = char(0x53);270    r = c.length(m, n, n + 2, 2);271    assert(r == 2);272 273    n[1] = char(0x00);274    n[0] = char(0x56);275    r = c.length(m, n, n + 2, 2);276    assert(r == 2);277  }278  {279    typedef std::codecvt_utf16<char32_t, 0x1000, std::little_endian> C;280    C c;281    char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};282    std::mbstate_t m;283    int r = c.length(m, n, n + 4, 2);284    assert(r == 0);285 286    n[1] = char(0x10);287    n[0] = char(0x05);288    r = c.length(m, n, n + 2, 2);289    assert(r == 0);290 291    n[1] = char(0x04);292    n[0] = char(0x53);293    r = c.length(m, n, n + 2, 2);294    assert(r == 2);295 296    n[1] = char(0x00);297    n[0] = char(0x56);298    r = c.length(m, n, n + 2, 2);299    assert(r == 2);300  }301  {302    typedef std::codecvt_utf16<char32_t, 0x10ffff, std::codecvt_mode(std::consume_header | std::little_endian)> C;303    C c;304    char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};305    std::mbstate_t m;306    int r = c.length(m, n, n + 6, 2);307    assert(r == 6);308 309    n[1] = char(0x10);310    n[0] = char(0x05);311    r = c.length(m, n, n + 2, 2);312    assert(r == 2);313 314    n[1] = char(0x04);315    n[0] = char(0x53);316    r = c.length(m, n, n + 2, 2);317    assert(r == 2);318 319    n[1] = char(0x00);320    n[0] = char(0x56);321    r = c.length(m, n, n + 2, 2);322    assert(r == 2);323  }324}325 326int main(int, char**) {327  TestHelper<wchar_t>::test();328  TestHelper<char16_t>::test();329  TestHelper<char32_t>::test();330  return 0;331}332