brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · bea2ba3 Raw
202 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_utf816//     : 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_utf8<CharT> C;46    C c;47    char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};48    std::mbstate_t m;49    int r = c.length(m, n, n + 4, 1);50    assert(r == 0);51 52    n[0] = char(0xE1);53    n[1] = char(0x80);54    n[2] = char(0x85);55    r = c.length(m, n, n + 3, 2);56    assert(r == 3);57 58    n[0] = char(0xD1);59    n[1] = char(0x93);60    r = c.length(m, n, n + 2, 3);61    assert(r == 2);62 63    n[0] = char(0x56);64    r = c.length(m, n, n + 1, 3);65    assert(r == 1);66  }67  {68    typedef std::codecvt_utf8<CharT, 0x1000> C;69    C c;70    char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};71    std::mbstate_t m;72    int r = c.length(m, n, n + 4, 1);73    assert(r == 0);74 75    n[0] = char(0xE1);76    n[1] = char(0x80);77    n[2] = char(0x85);78    r = c.length(m, n, n + 3, 2);79    assert(r == 0);80 81    n[0] = char(0xD1);82    n[1] = char(0x93);83    r = c.length(m, n, n + 2, 3);84    assert(r == 2);85 86    n[0] = char(0x56);87    r = c.length(m, n, n + 1, 3);88    assert(r == 1);89  }90  {91    typedef std::codecvt_utf8<CharT, 0xFFFFFFFF, std::consume_header> C;92    C c;93    char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};94    std::mbstate_t m;95    int r = c.length(m, n, n + 7, 1);96    assert(r == 3);97 98    n[0] = char(0xE1);99    n[1] = char(0x80);100    n[2] = char(0x85);101    r = c.length(m, n, n + 3, 2);102    assert(r == 3);103 104    n[0] = char(0xEF);105    n[1] = char(0xBB);106    n[2] = char(0xBF);107    n[3] = char(0xD1);108    n[4] = char(0x93);109    r = c.length(m, n, n + 5, 3);110    assert(r == 5);111 112    n[0] = char(0x56);113    r = c.length(m, n, n + 1, 3);114    assert(r == 1);115  }116}117 118template <class CharT>119void TestHelper<CharT, 4>::test() {120  {121    typedef std::codecvt_utf8<CharT> C;122    C c;123    char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};124    std::mbstate_t m;125    int r = c.length(m, n, n + 4, 1);126    assert(r == 4);127 128    n[0] = char(0xE1);129    n[1] = char(0x80);130    n[2] = char(0x85);131    r = c.length(m, n, n + 3, 2);132    assert(r == 3);133 134    n[0] = char(0xD1);135    n[1] = char(0x93);136    r = c.length(m, n, n + 2, 3);137    assert(r == 2);138 139    n[0] = char(0x56);140    r = c.length(m, n, n + 1, 3);141    assert(r == 1);142  }143  {144    typedef std::codecvt_utf8<CharT, 0x1000> C;145    C c;146    char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};147    std::mbstate_t m;148    int r = c.length(m, n, n + 4, 1);149    assert(r == 0);150 151    n[0] = char(0xE1);152    n[1] = char(0x80);153    n[2] = char(0x85);154    r = c.length(m, n, n + 3, 2);155    assert(r == 0);156 157    n[0] = char(0xD1);158    n[1] = char(0x93);159    r = c.length(m, n, n + 2, 3);160    assert(r == 2);161 162    n[0] = char(0x56);163    r = c.length(m, n, n + 1, 3);164    assert(r == 1);165  }166  {167    typedef std::codecvt_utf8<CharT, 0xFFFFFFFF, std::consume_header> C;168    C c;169    char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};170    std::mbstate_t m;171    int r = c.length(m, n, n + 7, 1);172    assert(r == 7);173 174    n[0] = char(0xE1);175    n[1] = char(0x80);176    n[2] = char(0x85);177    r = c.length(m, n, n + 3, 2);178    assert(r == 3);179 180    n[0] = char(0xEF);181    n[1] = char(0xBB);182    n[2] = char(0xBF);183    n[3] = char(0xD1);184    n[4] = char(0x93);185    r = c.length(m, n, n + 5, 3);186    assert(r == 5);187 188    n[0] = char(0x56);189    r = c.length(m, n, n + 1, 3);190    assert(r == 1);191  }192}193 194int main(int, char**) {195#ifndef TEST_HAS_NO_WIDE_CHARACTERS196  TestHelper<wchar_t>::test();197#endif198  TestHelper<char32_t>::test();199  TestHelper<char16_t>::test();200  return 0;201}202