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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <codecvt> 10 11 // template <class Elem, unsigned long Maxcode = 0x10ffff, 12 // codecvt_mode Mode = (codecvt_mode)0> 13 // class codecvt_utf8 14 // : public codecvt<Elem, char, mbstate_t> 15 // { 16 // // unspecified 17 // }; 18 19 // int length(stateT& state, const externT* from, const externT* from_end, 20 // size_t max) const; 21 22 #include <codecvt> 23 #include <cassert> 24 25 #include "test_macros.h" 26 27 template <class CharT, size_t = sizeof(CharT)> 28 struct TestHelper; 29 30 template <class CharT> 31 struct TestHelper<CharT, 2> { 32 static void test(); 33 }; 34 35 template <class CharT> 36 struct TestHelper<CharT, 4> { 37 static void test(); 38 }; 39 40 template <class CharT> 41 void TestHelper<CharT, 2>::test() { 42 { 43 typedef std::codecvt_utf8<CharT> C; 44 C c; 45 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 46 std::mbstate_t m; 47 int r = c.length(m, n, n + 4, 1); 48 assert(r == 0); 49 50 n[0] = char(0xE1); 51 n[1] = char(0x80); 52 n[2] = char(0x85); 53 r = c.length(m, n, n + 3, 2); 54 assert(r == 3); 55 56 n[0] = char(0xD1); 57 n[1] = char(0x93); 58 r = c.length(m, n, n + 2, 3); 59 assert(r == 2); 60 61 n[0] = char(0x56); 62 r = c.length(m, n, n + 1, 3); 63 assert(r == 1); 64 } 65 { 66 typedef std::codecvt_utf8<CharT, 0x1000> C; 67 C c; 68 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 69 std::mbstate_t m; 70 int r = c.length(m, n, n + 4, 1); 71 assert(r == 0); 72 73 n[0] = char(0xE1); 74 n[1] = char(0x80); 75 n[2] = char(0x85); 76 r = c.length(m, n, n + 3, 2); 77 assert(r == 0); 78 79 n[0] = char(0xD1); 80 n[1] = char(0x93); 81 r = c.length(m, n, n + 2, 3); 82 assert(r == 2); 83 84 n[0] = char(0x56); 85 r = c.length(m, n, n + 1, 3); 86 assert(r == 1); 87 } 88 { 89 typedef std::codecvt_utf8<CharT, 0xFFFFFFFF, std::consume_header> C; 90 C c; 91 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)}; 92 std::mbstate_t m; 93 int r = c.length(m, n, n + 7, 1); 94 assert(r == 3); 95 96 n[0] = char(0xE1); 97 n[1] = char(0x80); 98 n[2] = char(0x85); 99 r = c.length(m, n, n + 3, 2); 100 assert(r == 3); 101 102 n[0] = char(0xEF); 103 n[1] = char(0xBB); 104 n[2] = char(0xBF); 105 n[3] = char(0xD1); 106 n[4] = char(0x93); 107 r = c.length(m, n, n + 5, 3); 108 assert(r == 5); 109 110 n[0] = char(0x56); 111 r = c.length(m, n, n + 1, 3); 112 assert(r == 1); 113 } 114 } 115 116 template <class CharT> 117 void TestHelper<CharT, 4>::test() { 118 { 119 typedef std::codecvt_utf8<CharT> C; 120 C c; 121 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 122 std::mbstate_t m; 123 int r = c.length(m, n, n + 4, 1); 124 assert(r == 4); 125 126 n[0] = char(0xE1); 127 n[1] = char(0x80); 128 n[2] = char(0x85); 129 r = c.length(m, n, n + 3, 2); 130 assert(r == 3); 131 132 n[0] = char(0xD1); 133 n[1] = char(0x93); 134 r = c.length(m, n, n + 2, 3); 135 assert(r == 2); 136 137 n[0] = char(0x56); 138 r = c.length(m, n, n + 1, 3); 139 assert(r == 1); 140 } 141 { 142 typedef std::codecvt_utf8<CharT, 0x1000> C; 143 C c; 144 char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; 145 std::mbstate_t m; 146 int r = c.length(m, n, n + 4, 1); 147 assert(r == 0); 148 149 n[0] = char(0xE1); 150 n[1] = char(0x80); 151 n[2] = char(0x85); 152 r = c.length(m, n, n + 3, 2); 153 assert(r == 0); 154 155 n[0] = char(0xD1); 156 n[1] = char(0x93); 157 r = c.length(m, n, n + 2, 3); 158 assert(r == 2); 159 160 n[0] = char(0x56); 161 r = c.length(m, n, n + 1, 3); 162 assert(r == 1); 163 } 164 { 165 typedef std::codecvt_utf8<CharT, 0xFFFFFFFF, std::consume_header> C; 166 C c; 167 char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)}; 168 std::mbstate_t m; 169 int r = c.length(m, n, n + 7, 1); 170 assert(r == 7); 171 172 n[0] = char(0xE1); 173 n[1] = char(0x80); 174 n[2] = char(0x85); 175 r = c.length(m, n, n + 3, 2); 176 assert(r == 3); 177 178 n[0] = char(0xEF); 179 n[1] = char(0xBB); 180 n[2] = char(0xBF); 181 n[3] = char(0xD1); 182 n[4] = char(0x93); 183 r = c.length(m, n, n + 5, 3); 184 assert(r == 5); 185 186 n[0] = char(0x56); 187 r = c.length(m, n, n + 1, 3); 188 assert(r == 1); 189 } 190 } 191 192 int main(int, char**) { 193 #ifndef TEST_HAS_NO_WIDE_CHARACTERS 194 TestHelper<wchar_t>::test(); 195 #endif 196 TestHelper<char32_t>::test(); 197 TestHelper<char16_t>::test(); 198 return 0; 199 } 200