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