243 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// 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 29int main(int, char**)30{31#ifndef TEST_HAS_NO_WIDE_CHARACTERS32 {33 typedef std::codecvt_utf8_utf16<wchar_t> C;34 C c;35 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};36 std::mbstate_t m;37 int r = c.length(m, n, n+4, 2);38 assert(r == 4);39 40 n[0] = char(0xE1);41 n[1] = char(0x80);42 n[2] = char(0x85);43 r = c.length(m, n, n+3, 2);44 assert(r == 3);45 46 n[0] = char(0xD1);47 n[1] = char(0x93);48 r = c.length(m, n, n+2, 2);49 assert(r == 2);50 51 n[0] = char(0x56);52 r = c.length(m, n, n+1, 2);53 assert(r == 1);54 }55 {56 typedef std::codecvt_utf8_utf16<wchar_t, 0x1000> C;57 C c;58 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};59 std::mbstate_t m;60 int r = c.length(m, n, n+4, 2);61 assert(r == 0);62 63 n[0] = char(0xE1);64 n[1] = char(0x80);65 n[2] = char(0x85);66 r = c.length(m, n, n+3, 2);67 assert(r == 0);68 69 n[0] = char(0xD1);70 n[1] = char(0x93);71 r = c.length(m, n, n+2, 2);72 assert(r == 2);73 74 n[0] = char(0x56);75 r = c.length(m, n, n+1, 2);76 assert(r == 1);77 }78 {79 typedef std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::consume_header> C;80 C c;81 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};82 std::mbstate_t m;83 int r = c.length(m, n, n+7, 2);84 assert(r == 7);85 86 n[0] = char(0xE1);87 n[1] = char(0x80);88 n[2] = char(0x85);89 r = c.length(m, n, n+3, 2);90 assert(r == 3);91 92 n[0] = char(0xD1);93 n[1] = char(0x93);94 r = c.length(m, n, n+2, 2);95 assert(r == 2);96 97 n[0] = char(0x56);98 r = c.length(m, n, n+1, 2);99 assert(r == 1);100 }101#endif // TEST_HAS_NO_WIDE_CHARACTERS102 {103 typedef std::codecvt_utf8_utf16<char32_t> C;104 C c;105 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};106 std::mbstate_t m;107 int r = c.length(m, n, n+4, 2);108 assert(r == 4);109 110 n[0] = char(0xE1);111 n[1] = char(0x80);112 n[2] = char(0x85);113 r = c.length(m, n, n+3, 2);114 assert(r == 3);115 116 n[0] = char(0xD1);117 n[1] = char(0x93);118 r = c.length(m, n, n+2, 2);119 assert(r == 2);120 121 n[0] = char(0x56);122 r = c.length(m, n, n+1, 2);123 assert(r == 1);124 }125 {126 typedef std::codecvt_utf8_utf16<char32_t, 0x1000> C;127 C c;128 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};129 std::mbstate_t m;130 int r = c.length(m, n, n+4, 2);131 assert(r == 0);132 133 n[0] = char(0xE1);134 n[1] = char(0x80);135 n[2] = char(0x85);136 r = c.length(m, n, n+3, 2);137 assert(r == 0);138 139 n[0] = char(0xD1);140 n[1] = char(0x93);141 r = c.length(m, n, n+2, 2);142 assert(r == 2);143 144 n[0] = char(0x56);145 r = c.length(m, n, n+1, 2);146 assert(r == 1);147 }148 {149 typedef std::codecvt_utf8_utf16<char32_t, 0x10ffff, std::consume_header> C;150 C c;151 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};152 std::mbstate_t m;153 int r = c.length(m, n, n+7, 2);154 assert(r == 7);155 156 n[0] = char(0xE1);157 n[1] = char(0x80);158 n[2] = char(0x85);159 r = c.length(m, n, n+3, 2);160 assert(r == 3);161 162 n[0] = char(0xD1);163 n[1] = char(0x93);164 r = c.length(m, n, n+2, 2);165 assert(r == 2);166 167 n[0] = char(0x56);168 r = c.length(m, n, n+1, 2);169 assert(r == 1);170 }171 {172 typedef std::codecvt_utf8_utf16<char16_t> C;173 C c;174 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};175 std::mbstate_t m;176 int r = c.length(m, n, n+4, 2);177 assert(r == 4);178 179 n[0] = char(0xE1);180 n[1] = char(0x80);181 n[2] = char(0x85);182 r = c.length(m, n, n+3, 2);183 assert(r == 3);184 185 n[0] = char(0xD1);186 n[1] = char(0x93);187 r = c.length(m, n, n+2, 2);188 assert(r == 2);189 190 n[0] = char(0x56);191 r = c.length(m, n, n+1, 2);192 assert(r == 1);193 }194 {195 typedef std::codecvt_utf8_utf16<char16_t, 0x1000> C;196 C c;197 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};198 std::mbstate_t m;199 int r = c.length(m, n, n+4, 2);200 assert(r == 0);201 202 n[0] = char(0xE1);203 n[1] = char(0x80);204 n[2] = char(0x85);205 r = c.length(m, n, n+3, 2);206 assert(r == 0);207 208 n[0] = char(0xD1);209 n[1] = char(0x93);210 r = c.length(m, n, n+2, 2);211 assert(r == 2);212 213 n[0] = char(0x56);214 r = c.length(m, n, n+1, 2);215 assert(r == 1);216 }217 {218 typedef std::codecvt_utf8_utf16<char16_t, 0x10ffff, std::consume_header> C;219 C c;220 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};221 std::mbstate_t m;222 int r = c.length(m, n, n+7, 2);223 assert(r == 7);224 225 n[0] = char(0xE1);226 n[1] = char(0x80);227 n[2] = char(0x85);228 r = c.length(m, n, n+3, 2);229 assert(r == 3);230 231 n[0] = char(0xD1);232 n[1] = char(0x93);233 r = c.length(m, n, n+2, 2);234 assert(r == 2);235 236 n[0] = char(0x56);237 r = c.length(m, n, n+1, 2);238 assert(r == 1);239 }240 241 return 0;242}243