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