361 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// result22// out(stateT& state,23// const internT* from, const internT* from_end, const internT*& from_next,24// externT* to, externT* to_end, externT*& 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 // Nothing to do, the conversion in unsupported45}46 47template <class CharT>48void TestHelper<CharT, 4>::test() {49 {50 typedef std::codecvt_utf16<CharT> C;51 C c;52 CharT w = 0x40003;53 char n[4] = {0};54 const CharT* wp = nullptr;55 std::mbstate_t m;56 char* np = nullptr;57 std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);58 assert(r == std::codecvt_base::ok);59 assert(wp == &w + 1);60 assert(np == n + 4);61 assert(n[0] == char(0xD8));62 assert(n[1] == char(0xC0));63 assert(n[2] == char(0xDC));64 assert(n[3] == char(0x03));65 66 w = 0x1005;67 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);68 assert(r == std::codecvt_base::ok);69 assert(wp == &w + 1);70 assert(np == n + 2);71 assert(n[0] == char(0x10));72 assert(n[1] == char(0x05));73 assert(n[2] == char(0xDC));74 assert(n[3] == char(0x03));75 76 w = 0x453;77 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);78 assert(r == std::codecvt_base::ok);79 assert(wp == &w + 1);80 assert(np == n + 2);81 assert(n[0] == char(0x04));82 assert(n[1] == char(0x53));83 assert(n[2] == char(0xDC));84 assert(n[3] == char(0x03));85 86 w = 0x56;87 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);88 assert(r == std::codecvt_base::ok);89 assert(wp == &w + 1);90 assert(np == n + 2);91 assert(n[0] == char(0x00));92 assert(n[1] == char(0x56));93 assert(n[2] == char(0xDC));94 assert(n[3] == char(0x03));95 }96 {97 typedef std::codecvt_utf16<CharT, 0x1000> C;98 C c;99 CharT w = 0x40003;100 char n[4] = {0};101 const CharT* wp = nullptr;102 std::mbstate_t m;103 char* np = nullptr;104 std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);105 assert(r == std::codecvt_base::error);106 assert(wp == &w);107 assert(np == n);108 assert(n[0] == char(0));109 assert(n[1] == char(0));110 assert(n[2] == char(0));111 assert(n[3] == char(0));112 113 w = 0x1005;114 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);115 assert(r == std::codecvt_base::error);116 assert(wp == &w);117 assert(np == n);118 assert(n[0] == char(0));119 assert(n[1] == char(0));120 assert(n[2] == char(0));121 assert(n[3] == char(0));122 123 w = 0x453;124 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);125 assert(r == std::codecvt_base::ok);126 assert(wp == &w + 1);127 assert(np == n + 2);128 assert(n[0] == char(0x04));129 assert(n[1] == char(0x53));130 assert(n[2] == char(0));131 assert(n[3] == char(0));132 133 w = 0x56;134 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);135 assert(r == std::codecvt_base::ok);136 assert(wp == &w + 1);137 assert(np == n + 2);138 assert(n[0] == char(0x00));139 assert(n[1] == char(0x56));140 assert(n[2] == char(0));141 assert(n[3] == char(0));142 }143 {144 typedef std::codecvt_utf16<CharT, 0x10ffff, std::generate_header> C;145 C c;146 CharT w = 0x40003;147 char n[6] = {0};148 const CharT* wp = nullptr;149 std::mbstate_t m;150 char* np = nullptr;151 std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 6, np);152 assert(r == std::codecvt_base::ok);153 assert(wp == &w + 1);154 assert(np == n + 6);155 assert(n[0] == char(0xFE));156 assert(n[1] == char(0xFF));157 assert(n[2] == char(0xD8));158 assert(n[3] == char(0xC0));159 assert(n[4] == char(0xDC));160 assert(n[5] == char(0x03));161 162 w = 0x1005;163 r = c.out(m, &w, &w + 1, wp, n, n + 6, np);164 assert(r == std::codecvt_base::ok);165 assert(wp == &w + 1);166 assert(np == n + 4);167 assert(n[0] == char(0xFE));168 assert(n[1] == char(0xFF));169 assert(n[2] == char(0x10));170 assert(n[3] == char(0x05));171 assert(n[4] == char(0xDC));172 assert(n[5] == char(0x03));173 174 w = 0x453;175 r = c.out(m, &w, &w + 1, wp, n, n + 6, np);176 assert(r == std::codecvt_base::ok);177 assert(wp == &w + 1);178 assert(np == n + 4);179 assert(n[0] == char(0xFE));180 assert(n[1] == char(0xFF));181 assert(n[2] == char(0x04));182 assert(n[3] == char(0x53));183 assert(n[4] == char(0xDC));184 assert(n[5] == char(0x03));185 186 w = 0x56;187 r = c.out(m, &w, &w + 1, wp, n, n + 6, np);188 assert(r == std::codecvt_base::ok);189 assert(wp == &w + 1);190 assert(np == n + 4);191 assert(n[0] == char(0xFE));192 assert(n[1] == char(0xFF));193 assert(n[2] == char(0x00));194 assert(n[3] == char(0x56));195 assert(n[4] == char(0xDC));196 assert(n[5] == char(0x03));197 }198 199 {200 typedef std::codecvt_utf16<CharT, 0x10FFFF, std::little_endian> C;201 C c;202 CharT w = 0x40003;203 char n[4] = {0};204 const CharT* wp = nullptr;205 std::mbstate_t m;206 char* np = nullptr;207 std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);208 assert(r == std::codecvt_base::ok);209 assert(wp == &w + 1);210 assert(np == n + 4);211 assert(n[1] == char(0xD8));212 assert(n[0] == char(0xC0));213 assert(n[3] == char(0xDC));214 assert(n[2] == char(0x03));215 216 w = 0x1005;217 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);218 assert(r == std::codecvt_base::ok);219 assert(wp == &w + 1);220 assert(np == n + 2);221 assert(n[1] == char(0x10));222 assert(n[0] == char(0x05));223 assert(n[3] == char(0xDC));224 assert(n[2] == char(0x03));225 226 w = 0x453;227 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);228 assert(r == std::codecvt_base::ok);229 assert(wp == &w + 1);230 assert(np == n + 2);231 assert(n[1] == char(0x04));232 assert(n[0] == char(0x53));233 assert(n[3] == char(0xDC));234 assert(n[2] == char(0x03));235 236 w = 0x56;237 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);238 assert(r == std::codecvt_base::ok);239 assert(wp == &w + 1);240 assert(np == n + 2);241 assert(n[1] == char(0x00));242 assert(n[0] == char(0x56));243 assert(n[3] == char(0xDC));244 assert(n[2] == char(0x03));245 }246 {247 typedef std::codecvt_utf16<CharT, 0x1000, std::little_endian> C;248 C c;249 CharT w = 0x40003;250 char n[4] = {0};251 const CharT* wp = nullptr;252 std::mbstate_t m;253 char* np = nullptr;254 std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);255 assert(r == std::codecvt_base::error);256 assert(wp == &w);257 assert(np == n);258 assert(n[1] == char(0));259 assert(n[0] == char(0));260 assert(n[3] == char(0));261 assert(n[2] == char(0));262 263 w = 0x1005;264 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);265 assert(r == std::codecvt_base::error);266 assert(wp == &w);267 assert(np == n);268 assert(n[1] == char(0));269 assert(n[0] == char(0));270 assert(n[3] == char(0));271 assert(n[2] == char(0));272 273 w = 0x453;274 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);275 assert(r == std::codecvt_base::ok);276 assert(wp == &w + 1);277 assert(np == n + 2);278 assert(n[1] == char(0x04));279 assert(n[0] == char(0x53));280 assert(n[3] == char(0));281 assert(n[2] == char(0));282 283 w = 0x56;284 r = c.out(m, &w, &w + 1, wp, n, n + 4, np);285 assert(r == std::codecvt_base::ok);286 assert(wp == &w + 1);287 assert(np == n + 2);288 assert(n[1] == char(0x00));289 assert(n[0] == char(0x56));290 assert(n[3] == char(0));291 assert(n[2] == char(0));292 }293 {294 typedef std::codecvt_utf16<CharT, 0x10ffff,295 std::codecvt_mode(std::generate_header |296 std::little_endian)>297 C;298 C c;299 CharT w = 0x40003;300 char n[6] = {0};301 const CharT* wp = nullptr;302 std::mbstate_t m;303 char* np = nullptr;304 std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 6, np);305 assert(r == std::codecvt_base::ok);306 assert(wp == &w + 1);307 assert(np == n + 6);308 assert(n[1] == char(0xFE));309 assert(n[0] == char(0xFF));310 assert(n[3] == char(0xD8));311 assert(n[2] == char(0xC0));312 assert(n[5] == char(0xDC));313 assert(n[4] == char(0x03));314 315 w = 0x1005;316 r = c.out(m, &w, &w + 1, wp, n, n + 6, np);317 assert(r == std::codecvt_base::ok);318 assert(wp == &w + 1);319 assert(np == n + 4);320 assert(n[1] == char(0xFE));321 assert(n[0] == char(0xFF));322 assert(n[3] == char(0x10));323 assert(n[2] == char(0x05));324 assert(n[5] == char(0xDC));325 assert(n[4] == char(0x03));326 327 w = 0x453;328 r = c.out(m, &w, &w + 1, wp, n, n + 6, np);329 assert(r == std::codecvt_base::ok);330 assert(wp == &w + 1);331 assert(np == n + 4);332 assert(n[1] == char(0xFE));333 assert(n[0] == char(0xFF));334 assert(n[3] == char(0x04));335 assert(n[2] == char(0x53));336 assert(n[5] == char(0xDC));337 assert(n[4] == char(0x03));338 339 w = 0x56;340 r = c.out(m, &w, &w + 1, wp, n, n + 6, np);341 assert(r == std::codecvt_base::ok);342 assert(wp == &w + 1);343 assert(np == n + 4);344 assert(n[1] == char(0xFE));345 assert(n[0] == char(0xFF));346 assert(n[3] == char(0x00));347 assert(n[2] == char(0x56));348 assert(n[5] == char(0xDC));349 assert(n[4] == char(0x03));350 }351}352 353int main(int, char**) {354 TestHelper<char32_t>::test();355#ifndef TEST_HAS_NO_WIDE_CHARACTERS356 TestHelper<wchar_t>::test();357#endif358 359 return 0;360}361