1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <codecvt> 11 12 // template <class Elem, unsigned long Maxcode = 0x10ffff, 13 // codecvt_mode Mode = (codecvt_mode)0> 14 // class codecvt_utf16 15 // : public codecvt<Elem, char, mbstate_t> 16 // { 17 // // unspecified 18 // }; 19 20 // int length(stateT& state, const externT* from, const externT* from_end, 21 // size_t max) const; 22 23 #include <codecvt> 24 #include <cassert> 25 26 int main() 27 { 28 { 29 typedef std::codecvt_utf16<wchar_t> C; 30 C c; 31 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 32 std::mbstate_t m; 33 int r = c.length(m, n, n+4, 2); 34 assert(r == 4); 35 36 n[0] = char(0x10); 37 n[1] = char(0x05); 38 r = c.length(m, n, n+2, 2); 39 assert(r == 2); 40 41 n[0] = char(0x04); 42 n[1] = char(0x53); 43 r = c.length(m, n, n+2, 2); 44 assert(r == 2); 45 46 n[0] = char(0x00); 47 n[1] = char(0x56); 48 r = c.length(m, n, n+2, 2); 49 assert(r == 2); 50 } 51 { 52 typedef std::codecvt_utf16<wchar_t, 0x1000> C; 53 C c; 54 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 55 std::mbstate_t m; 56 int r = c.length(m, n, n+4, 2); 57 assert(r == 0); 58 59 n[0] = char(0x10); 60 n[1] = char(0x05); 61 r = c.length(m, n, n+2, 2); 62 assert(r == 0); 63 64 n[0] = char(0x04); 65 n[1] = char(0x53); 66 r = c.length(m, n, n+2, 2); 67 assert(r == 2); 68 69 n[0] = char(0x00); 70 n[1] = char(0x56); 71 r = c.length(m, n, n+2, 2); 72 assert(r == 2); 73 } 74 { 75 typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header> C; 76 C c; 77 char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 78 std::mbstate_t m; 79 int r = c.length(m, n, n+6, 2); 80 assert(r == 6); 81 82 n[0] = char(0x10); 83 n[1] = char(0x05); 84 r = c.length(m, n, n+2, 2); 85 assert(r == 2); 86 87 n[0] = char(0x04); 88 n[1] = char(0x53); 89 r = c.length(m, n, n+2, 2); 90 assert(r == 2); 91 92 n[0] = char(0x00); 93 n[1] = char(0x56); 94 r = c.length(m, n, n+2, 2); 95 assert(r == 2); 96 } 97 { 98 typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian> C; 99 C c; 100 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 101 std::mbstate_t m; 102 int r = c.length(m, n, n+4, 2); 103 assert(r == 4); 104 105 n[1] = char(0x10); 106 n[0] = char(0x05); 107 r = c.length(m, n, n+2, 2); 108 assert(r == 2); 109 110 n[1] = char(0x04); 111 n[0] = char(0x53); 112 r = c.length(m, n, n+2, 2); 113 assert(r == 2); 114 115 n[1] = char(0x00); 116 n[0] = char(0x56); 117 r = c.length(m, n, n+2, 2); 118 assert(r == 2); 119 } 120 { 121 typedef std::codecvt_utf16<wchar_t, 0x1000, std::little_endian> C; 122 C c; 123 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 124 std::mbstate_t m; 125 int r = c.length(m, n, n+4, 2); 126 assert(r == 0); 127 128 n[1] = char(0x10); 129 n[0] = char(0x05); 130 r = c.length(m, n, n+2, 2); 131 assert(r == 0); 132 133 n[1] = char(0x04); 134 n[0] = char(0x53); 135 r = c.length(m, n, n+2, 2); 136 assert(r == 2); 137 138 n[1] = char(0x00); 139 n[0] = char(0x56); 140 r = c.length(m, n, n+2, 2); 141 assert(r == 2); 142 } 143 { 144 typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::codecvt_mode( 145 std::consume_header | 146 std::little_endian)> C; 147 C c; 148 char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 149 std::mbstate_t m; 150 int r = c.length(m, n, n+6, 2); 151 assert(r == 6); 152 153 n[1] = char(0x10); 154 n[0] = char(0x05); 155 r = c.length(m, n, n+2, 2); 156 assert(r == 2); 157 158 n[1] = char(0x04); 159 n[0] = char(0x53); 160 r = c.length(m, n, n+2, 2); 161 assert(r == 2); 162 163 n[1] = char(0x00); 164 n[0] = char(0x56); 165 r = c.length(m, n, n+2, 2); 166 assert(r == 2); 167 } 168 { 169 typedef std::codecvt_utf16<char32_t> C; 170 C c; 171 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 172 std::mbstate_t m; 173 int r = c.length(m, n, n+4, 2); 174 assert(r == 4); 175 176 n[0] = char(0x10); 177 n[1] = char(0x05); 178 r = c.length(m, n, n+2, 2); 179 assert(r == 2); 180 181 n[0] = char(0x04); 182 n[1] = char(0x53); 183 r = c.length(m, n, n+2, 2); 184 assert(r == 2); 185 186 n[0] = char(0x00); 187 n[1] = char(0x56); 188 r = c.length(m, n, n+2, 2); 189 assert(r == 2); 190 } 191 { 192 typedef std::codecvt_utf16<char32_t, 0x1000> C; 193 C c; 194 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 195 std::mbstate_t m; 196 int r = c.length(m, n, n+4, 2); 197 assert(r == 0); 198 199 n[0] = char(0x10); 200 n[1] = char(0x05); 201 r = c.length(m, n, n+2, 2); 202 assert(r == 0); 203 204 n[0] = char(0x04); 205 n[1] = char(0x53); 206 r = c.length(m, n, n+2, 2); 207 assert(r == 2); 208 209 n[0] = char(0x00); 210 n[1] = char(0x56); 211 r = c.length(m, n, n+2, 2); 212 assert(r == 2); 213 } 214 { 215 typedef std::codecvt_utf16<char32_t, 0x10ffff, std::consume_header> C; 216 C c; 217 char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 218 std::mbstate_t m; 219 int r = c.length(m, n, n+6, 2); 220 assert(r == 6); 221 222 n[0] = char(0x10); 223 n[1] = char(0x05); 224 r = c.length(m, n, n+2, 2); 225 assert(r == 2); 226 227 n[0] = char(0x04); 228 n[1] = char(0x53); 229 r = c.length(m, n, n+2, 2); 230 assert(r == 2); 231 232 n[0] = char(0x00); 233 n[1] = char(0x56); 234 r = c.length(m, n, n+2, 2); 235 assert(r == 2); 236 } 237 { 238 typedef std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian> C; 239 C c; 240 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 241 std::mbstate_t m; 242 int r = c.length(m, n, n+4, 2); 243 assert(r == 4); 244 245 n[1] = char(0x10); 246 n[0] = char(0x05); 247 r = c.length(m, n, n+2, 2); 248 assert(r == 2); 249 250 n[1] = char(0x04); 251 n[0] = char(0x53); 252 r = c.length(m, n, n+2, 2); 253 assert(r == 2); 254 255 n[1] = char(0x00); 256 n[0] = char(0x56); 257 r = c.length(m, n, n+2, 2); 258 assert(r == 2); 259 } 260 { 261 typedef std::codecvt_utf16<char32_t, 0x1000, std::little_endian> C; 262 C c; 263 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 264 std::mbstate_t m; 265 int r = c.length(m, n, n+4, 2); 266 assert(r == 0); 267 268 n[1] = char(0x10); 269 n[0] = char(0x05); 270 r = c.length(m, n, n+2, 2); 271 assert(r == 0); 272 273 n[1] = char(0x04); 274 n[0] = char(0x53); 275 r = c.length(m, n, n+2, 2); 276 assert(r == 2); 277 278 n[1] = char(0x00); 279 n[0] = char(0x56); 280 r = c.length(m, n, n+2, 2); 281 assert(r == 2); 282 } 283 { 284 typedef std::codecvt_utf16<char32_t, 0x10ffff, std::codecvt_mode( 285 std::consume_header | 286 std::little_endian)> C; 287 C c; 288 char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 289 std::mbstate_t m; 290 int r = c.length(m, n, n+6, 2); 291 assert(r == 6); 292 293 n[1] = char(0x10); 294 n[0] = char(0x05); 295 r = c.length(m, n, n+2, 2); 296 assert(r == 2); 297 298 n[1] = char(0x04); 299 n[0] = char(0x53); 300 r = c.length(m, n, n+2, 2); 301 assert(r == 2); 302 303 n[1] = char(0x00); 304 n[0] = char(0x56); 305 r = c.length(m, n, n+2, 2); 306 assert(r == 2); 307 } 308 309 { 310 typedef std::codecvt_utf16<char16_t> C; 311 C c; 312 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 313 std::mbstate_t m; 314 int r = c.length(m, n, n+4, 2); 315 assert(r == 0); 316 317 n[0] = char(0x10); 318 n[1] = char(0x05); 319 r = c.length(m, n, n+2, 2); 320 assert(r == 2); 321 322 n[0] = char(0x04); 323 n[1] = char(0x53); 324 r = c.length(m, n, n+2, 2); 325 assert(r == 2); 326 327 n[0] = char(0x00); 328 n[1] = char(0x56); 329 r = c.length(m, n, n+2, 2); 330 assert(r == 2); 331 } 332 { 333 typedef std::codecvt_utf16<char16_t, 0x1000> C; 334 C c; 335 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 336 std::mbstate_t m; 337 int r = c.length(m, n, n+4, 2); 338 assert(r == 0); 339 340 n[0] = char(0x10); 341 n[1] = char(0x05); 342 r = c.length(m, n, n+2, 2); 343 assert(r == 0); 344 345 n[0] = char(0x04); 346 n[1] = char(0x53); 347 r = c.length(m, n, n+2, 2); 348 assert(r == 2); 349 350 n[0] = char(0x00); 351 n[1] = char(0x56); 352 r = c.length(m, n, n+2, 2); 353 assert(r == 2); 354 } 355 { 356 typedef std::codecvt_utf16<char16_t, 0x10ffff, std::consume_header> C; 357 C c; 358 char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)}; 359 std::mbstate_t m; 360 int r = c.length(m, n, n+6, 2); 361 assert(r == 2); 362 363 n[0] = char(0x10); 364 n[1] = char(0x05); 365 r = c.length(m, n, n+2, 2); 366 assert(r == 2); 367 368 n[0] = char(0x04); 369 n[1] = char(0x53); 370 r = c.length(m, n, n+2, 2); 371 assert(r == 2); 372 373 n[0] = char(0x00); 374 n[1] = char(0x56); 375 r = c.length(m, n, n+2, 2); 376 assert(r == 2); 377 } 378 { 379 typedef std::codecvt_utf16<char16_t, 0x10ffff, std::little_endian> C; 380 C c; 381 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 382 std::mbstate_t m; 383 int r = c.length(m, n, n+4, 2); 384 assert(r == 0); 385 386 n[1] = char(0x10); 387 n[0] = char(0x05); 388 r = c.length(m, n, n+2, 2); 389 assert(r == 2); 390 391 n[1] = char(0x04); 392 n[0] = char(0x53); 393 r = c.length(m, n, n+2, 2); 394 assert(r == 2); 395 396 n[1] = char(0x00); 397 n[0] = char(0x56); 398 r = c.length(m, n, n+2, 2); 399 assert(r == 2); 400 } 401 { 402 typedef std::codecvt_utf16<char16_t, 0x1000, std::little_endian> C; 403 C c; 404 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 405 std::mbstate_t m; 406 int r = c.length(m, n, n+4, 2); 407 assert(r == 0); 408 409 n[1] = char(0x10); 410 n[0] = char(0x05); 411 r = c.length(m, n, n+2, 2); 412 assert(r == 0); 413 414 n[1] = char(0x04); 415 n[0] = char(0x53); 416 r = c.length(m, n, n+2, 2); 417 assert(r == 2); 418 419 n[1] = char(0x00); 420 n[0] = char(0x56); 421 r = c.length(m, n, n+2, 2); 422 assert(r == 2); 423 } 424 { 425 typedef std::codecvt_utf16<char16_t, 0x10ffff, std::codecvt_mode( 426 std::consume_header | 427 std::little_endian)> C; 428 C c; 429 char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)}; 430 std::mbstate_t m; 431 int r = c.length(m, n, n+6, 2); 432 assert(r == 2); 433 434 n[1] = char(0x10); 435 n[0] = char(0x05); 436 r = c.length(m, n, n+2, 2); 437 assert(r == 2); 438 439 n[1] = char(0x04); 440 n[0] = char(0x53); 441 r = c.length(m, n, n+2, 2); 442 assert(r == 2); 443 444 n[1] = char(0x00); 445 n[0] = char(0x56); 446 r = c.length(m, n, n+2, 2); 447 assert(r == 2); 448 } 449 } 450