brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.5 KiB · 006d983 Raw
315 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// 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  {45    typedef std::codecvt_utf8_utf16<CharT> C;46    C c;47    CharT w[2] = {0xD8C0, 0xDC03};48    char n[4] = {0};49    const CharT* wp = nullptr;50    std::mbstate_t m;51    char* np = nullptr;52    std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 4, np);53    assert(r == std::codecvt_base::ok);54    assert(wp == w + 2);55    assert(np == n + 4);56    assert(n[0] == char(0xF1));57    assert(n[1] == char(0x80));58    assert(n[2] == char(0x80));59    assert(n[3] == char(0x83));60 61    w[0] = 0x1005;62    r = c.out(m, w, w + 1, wp, n, n + 4, np);63    assert(r == std::codecvt_base::ok);64    assert(wp == w + 1);65    assert(np == n + 3);66    assert(n[0] == char(0xE1));67    assert(n[1] == char(0x80));68    assert(n[2] == char(0x85));69 70    w[0] = 0x453;71    r = c.out(m, w, w + 1, wp, n, n + 4, np);72    assert(r == std::codecvt_base::ok);73    assert(wp == w + 1);74    assert(np == n + 2);75    assert(n[0] == char(0xD1));76    assert(n[1] == char(0x93));77 78    w[0] = 0x56;79    r = c.out(m, w, w + 1, wp, n, n + 4, np);80    assert(r == std::codecvt_base::ok);81    assert(wp == w + 1);82    assert(np == n + 1);83    assert(n[0] == char(0x56));84  }85  {86    typedef std::codecvt_utf8_utf16<CharT, 0x1000> C;87    C c;88    CharT w[2] = {0xD8C0, 0xDC03};89    char n[4] = {0};90    const CharT* wp = nullptr;91    std::mbstate_t m;92    char* np = nullptr;93    std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 4, np);94    assert(r == std::codecvt_base::error);95    assert(wp == w);96    assert(np == n);97 98    w[0] = 0x1005;99    r = c.out(m, w, w + 1, wp, n, n + 4, np);100    assert(r == std::codecvt_base::error);101    assert(wp == w);102    assert(np == n);103 104    w[0] = 0x453;105    r = c.out(m, w, w + 1, wp, n, n + 4, np);106    assert(r == std::codecvt_base::ok);107    assert(wp == w + 1);108    assert(np == n + 2);109    assert(n[0] == char(0xD1));110    assert(n[1] == char(0x93));111 112    w[0] = 0x56;113    r = c.out(m, w, w + 1, wp, n, n + 4, np);114    assert(r == std::codecvt_base::ok);115    assert(wp == w + 1);116    assert(np == n + 1);117    assert(n[0] == char(0x56));118  }119  {120    typedef std::codecvt_utf8_utf16<CharT, 0x10ffff, std::generate_header> C;121    C c;122    CharT w[2] = {0xD8C0, 0xDC03};123    char n[7] = {0};124    const CharT* wp = nullptr;125    std::mbstate_t m;126    char* np = nullptr;127    std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 7, np);128    assert(r == std::codecvt_base::ok);129    assert(wp == w + 2);130    assert(np == n + 7);131    assert(n[0] == char(0xEF));132    assert(n[1] == char(0xBB));133    assert(n[2] == char(0xBF));134    assert(n[3] == char(0xF1));135    assert(n[4] == char(0x80));136    assert(n[5] == char(0x80));137    assert(n[6] == char(0x83));138 139    w[0] = 0x1005;140    r = c.out(m, w, w + 1, wp, n, n + 7, np);141    assert(r == std::codecvt_base::ok);142    assert(wp == w + 1);143    assert(np == n + 6);144    assert(n[0] == char(0xEF));145    assert(n[1] == char(0xBB));146    assert(n[2] == char(0xBF));147    assert(n[3] == char(0xE1));148    assert(n[4] == char(0x80));149    assert(n[5] == char(0x85));150 151    w[0] = 0x453;152    r = c.out(m, w, w + 1, wp, n, n + 7, np);153    assert(r == std::codecvt_base::ok);154    assert(wp == w + 1);155    assert(np == n + 5);156    assert(n[0] == char(0xEF));157    assert(n[1] == char(0xBB));158    assert(n[2] == char(0xBF));159    assert(n[3] == char(0xD1));160    assert(n[4] == char(0x93));161 162    w[0] = 0x56;163    r = c.out(m, w, w + 1, wp, n, n + 7, np);164    assert(r == std::codecvt_base::ok);165    assert(wp == w + 1);166    assert(np == n + 4);167    assert(n[0] == char(0xEF));168    assert(n[1] == char(0xBB));169    assert(n[2] == char(0xBF));170    assert(n[3] == char(0x56));171  }172}173 174template <class CharT>175void TestHelper<CharT, 4>::test() {176  {177    typedef std::codecvt_utf8_utf16<CharT> C;178    C c;179    CharT w[2] = {0xD8C0, 0xDC03};180    char n[4] = {0};181    const CharT* wp = nullptr;182    std::mbstate_t m;183    char* np = nullptr;184    std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 4, np);185    assert(r == std::codecvt_base::ok);186    assert(wp == w + 2);187    assert(np == n + 4);188    assert(n[0] == char(0xF1));189    assert(n[1] == char(0x80));190    assert(n[2] == char(0x80));191    assert(n[3] == char(0x83));192 193    w[0] = 0x1005;194    r = c.out(m, w, w + 1, wp, n, n + 4, np);195    assert(r == std::codecvt_base::ok);196    assert(wp == w + 1);197    assert(np == n + 3);198    assert(n[0] == char(0xE1));199    assert(n[1] == char(0x80));200    assert(n[2] == char(0x85));201 202    w[0] = 0x453;203    r = c.out(m, w, w + 1, wp, n, n + 4, np);204    assert(r == std::codecvt_base::ok);205    assert(wp == w + 1);206    assert(np == n + 2);207    assert(n[0] == char(0xD1));208    assert(n[1] == char(0x93));209 210    w[0] = 0x56;211    r = c.out(m, w, w + 1, wp, n, n + 4, np);212    assert(r == std::codecvt_base::ok);213    assert(wp == w + 1);214    assert(np == n + 1);215    assert(n[0] == char(0x56));216  }217  {218    typedef std::codecvt_utf8_utf16<CharT, 0x1000> C;219    C c;220    CharT w[2] = {0xD8C0, 0xDC03};221    char n[4] = {0};222    const CharT* wp = nullptr;223    std::mbstate_t m;224    char* np = nullptr;225    std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 4, np);226    assert(r == std::codecvt_base::error);227    assert(wp == w);228    assert(np == n);229 230    w[0] = 0x1005;231    r = c.out(m, w, w + 1, wp, n, n + 4, np);232    assert(r == std::codecvt_base::error);233    assert(wp == w);234    assert(np == n);235 236    w[0] = 0x453;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[0] == char(0xD1));242    assert(n[1] == char(0x93));243 244    w[0] = 0x56;245    r = c.out(m, w, w + 1, wp, n, n + 4, np);246    assert(r == std::codecvt_base::ok);247    assert(wp == w + 1);248    assert(np == n + 1);249    assert(n[0] == char(0x56));250  }251  {252    typedef std::codecvt_utf8_utf16<CharT, 0x10ffff, std::generate_header> C;253    C c;254    CharT w[2] = {0xD8C0, 0xDC03};255    char n[7] = {0};256    const CharT* wp = nullptr;257    std::mbstate_t m;258    char* np = nullptr;259    std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 7, np);260    assert(r == std::codecvt_base::ok);261    assert(wp == w + 2);262    assert(np == n + 7);263    assert(n[0] == char(0xEF));264    assert(n[1] == char(0xBB));265    assert(n[2] == char(0xBF));266    assert(n[3] == char(0xF1));267    assert(n[4] == char(0x80));268    assert(n[5] == char(0x80));269    assert(n[6] == char(0x83));270 271    w[0] = 0x1005;272    r = c.out(m, w, w + 1, wp, n, n + 7, np);273    assert(r == std::codecvt_base::ok);274    assert(wp == w + 1);275    assert(np == n + 6);276    assert(n[0] == char(0xEF));277    assert(n[1] == char(0xBB));278    assert(n[2] == char(0xBF));279    assert(n[3] == char(0xE1));280    assert(n[4] == char(0x80));281    assert(n[5] == char(0x85));282 283    w[0] = 0x453;284    r = c.out(m, w, w + 1, wp, n, n + 7, np);285    assert(r == std::codecvt_base::ok);286    assert(wp == w + 1);287    assert(np == n + 5);288    assert(n[0] == char(0xEF));289    assert(n[1] == char(0xBB));290    assert(n[2] == char(0xBF));291    assert(n[3] == char(0xD1));292    assert(n[4] == char(0x93));293 294    w[0] = 0x56;295    r = c.out(m, w, w + 1, wp, n, n + 7, np);296    assert(r == std::codecvt_base::ok);297    assert(wp == w + 1);298    assert(np == n + 4);299    assert(n[0] == char(0xEF));300    assert(n[1] == char(0xBB));301    assert(n[2] == char(0xBF));302    assert(n[3] == char(0x56));303  }304}305 306int main(int, char**) {307#if !defined(_WIN32) && !defined(TEST_HAS_NO_WIDE_CHARACTERS)308  TestHelper<wchar_t>::test();309#endif310  TestHelper<char32_t>::test();311  TestHelper<char16_t>::test();312 313  return 0;314}315