brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.3 KiB · f9dc6f0 Raw
745 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//     in(stateT& state,23//        const externT* from, const externT* from_end, const externT*& from_next,24//        internT* to, internT* to_end, internT*& to_next) const;25 26#include <codecvt>27#include <cassert>28 29#include "test_macros.h"30 31int main(int, char**)32{33    {34        typedef std::codecvt_utf16<char32_t> C;35        C c;36        char32_t w = 0;37        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};38        char32_t* wp = nullptr;39        std::mbstate_t m;40        const char* np = nullptr;41        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);42        assert(r == std::codecvt_base::ok);43        assert(wp == &w+1);44        assert(np == n+4);45        assert(w == 0x40003);46 47        n[0] = char(0x10);48        n[1] = char(0x05);49        r = c.in(m, n, n+2, np, &w, &w+1, wp);50        assert(r == std::codecvt_base::ok);51        assert(wp == &w+1);52        assert(np == n+2);53        assert(w == 0x1005);54 55        n[0] = char(0x04);56        n[1] = char(0x53);57        r = c.in(m, n, n+2, np, &w, &w+1, wp);58        assert(r == std::codecvt_base::ok);59        assert(wp == &w+1);60        assert(np == n+2);61        assert(w == 0x453);62 63        w = 0x56;64        n[0] = char(0x00);65        n[1] = char(0x56);66        r = c.in(m, n, n+2, np, &w, &w+1, wp);67        assert(r == std::codecvt_base::ok);68        assert(wp == &w+1);69        assert(np == n+2);70        assert(w == 0x56);71    }72    {73        typedef std::codecvt_utf16<char32_t, 0x1000> C;74        C c;75        char32_t w = 0;76        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};77        char32_t* wp = nullptr;78        std::mbstate_t m;79        const char* np = nullptr;80        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);81        assert(r == std::codecvt_base::error);82        assert(wp == &w);83        assert(np == n);84        assert(w == 0);85 86        n[0] = char(0x10);87        n[1] = char(0x05);88        r = c.in(m, n, n+2, np, &w, &w+1, wp);89        assert(r == std::codecvt_base::error);90        assert(wp == &w);91        assert(np == n);92        assert(w == 0);93 94        n[0] = char(0x04);95        n[1] = char(0x53);96        r = c.in(m, n, n+2, np, &w, &w+1, wp);97        assert(r == std::codecvt_base::ok);98        assert(wp == &w+1);99        assert(np == n+2);100        assert(w == 0x453);101 102        w = 0x56;103        n[0] = char(0x00);104        n[1] = char(0x56);105        r = c.in(m, n, n+2, np, &w, &w+1, wp);106        assert(r == std::codecvt_base::ok);107        assert(wp == &w+1);108        assert(np == n+2);109        assert(w == 0x56);110    }111    {112        typedef std::codecvt_utf16<char32_t, 0x10ffff, std::consume_header> C;113        C c;114        char32_t w = 0;115        char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};116        char32_t* wp = nullptr;117        std::mbstate_t m;118        const char* np = nullptr;119        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);120        assert(r == std::codecvt_base::ok);121        assert(wp == &w+1);122        assert(np == n+6);123        assert(w == 0x40003);124 125        n[0] = char(0x10);126        n[1] = char(0x05);127        r = c.in(m, n, n+2, np, &w, &w+1, wp);128        assert(r == std::codecvt_base::ok);129        assert(wp == &w+1);130        assert(np == n+2);131        assert(w == 0x1005);132 133        n[0] = char(0x04);134        n[1] = char(0x53);135        r = c.in(m, n, n+2, np, &w, &w+1, wp);136        assert(r == std::codecvt_base::ok);137        assert(wp == &w+1);138        assert(np == n+2);139        assert(w == 0x453);140 141        w = 0x56;142        n[0] = char(0x00);143        n[1] = char(0x56);144        r = c.in(m, n, n+2, np, &w, &w+1, wp);145        assert(r == std::codecvt_base::ok);146        assert(wp == &w+1);147        assert(np == n+2);148        assert(w == 0x56);149    }150    {151        typedef std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian> C;152        C c;153        char32_t w = 0;154        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};155        char32_t* wp = nullptr;156        std::mbstate_t m;157        const char* np = nullptr;158        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);159        assert(r == std::codecvt_base::ok);160        assert(wp == &w+1);161        assert(np == n+4);162        assert(w == 0x40003);163 164        n[1] = char(0x10);165        n[0] = char(0x05);166        r = c.in(m, n, n+2, np, &w, &w+1, wp);167        assert(r == std::codecvt_base::ok);168        assert(wp == &w+1);169        assert(np == n+2);170        assert(w == 0x1005);171 172        n[1] = char(0x04);173        n[0] = char(0x53);174        r = c.in(m, n, n+2, np, &w, &w+1, wp);175        assert(r == std::codecvt_base::ok);176        assert(wp == &w+1);177        assert(np == n+2);178        assert(w == 0x453);179 180        w = 0x56;181        n[1] = char(0x00);182        n[0] = char(0x56);183        r = c.in(m, n, n+2, np, &w, &w+1, wp);184        assert(r == std::codecvt_base::ok);185        assert(wp == &w+1);186        assert(np == n+2);187        assert(w == 0x56);188    }189    {190        typedef std::codecvt_utf16<char32_t, 0x1000, std::little_endian> C;191        C c;192        char32_t w = 0;193        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};194        char32_t* wp = nullptr;195        std::mbstate_t m;196        const char* np = nullptr;197        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);198        assert(r == std::codecvt_base::error);199        assert(wp == &w);200        assert(np == n);201        assert(w == 0);202 203        n[1] = char(0x10);204        n[0] = char(0x05);205        r = c.in(m, n, n+2, np, &w, &w+1, wp);206        assert(r == std::codecvt_base::error);207        assert(wp == &w);208        assert(np == n);209        assert(w == 0);210 211        n[1] = char(0x04);212        n[0] = char(0x53);213        r = c.in(m, n, n+2, np, &w, &w+1, wp);214        assert(r == std::codecvt_base::ok);215        assert(wp == &w+1);216        assert(np == n+2);217        assert(w == 0x453);218 219        w = 0x56;220        n[1] = char(0x00);221        n[0] = char(0x56);222        r = c.in(m, n, n+2, np, &w, &w+1, wp);223        assert(r == std::codecvt_base::ok);224        assert(wp == &w+1);225        assert(np == n+2);226        assert(w == 0x56);227    }228    {229        typedef std::codecvt_utf16<char32_t, 0x10ffff,230                                   std::codecvt_mode(std::consume_header | std::little_endian)> C;231 232        C c;233        char32_t w = 0;234        char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};235        char32_t* wp = nullptr;236        std::mbstate_t m;237        const char* np = nullptr;238        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);239        assert(r == std::codecvt_base::ok);240        assert(wp == &w+1);241        assert(np == n+6);242        assert(w == 0x40003);243 244        n[1] = char(0x10);245        n[0] = char(0x05);246        r = c.in(m, n, n+2, np, &w, &w+1, wp);247        assert(r == std::codecvt_base::ok);248        assert(wp == &w+1);249        assert(np == n+2);250        assert(w == 0x1005);251 252        n[1] = char(0x04);253        n[0] = char(0x53);254        r = c.in(m, n, n+2, np, &w, &w+1, wp);255        assert(r == std::codecvt_base::ok);256        assert(wp == &w+1);257        assert(np == n+2);258        assert(w == 0x453);259 260        w = 0x56;261        n[1] = char(0x00);262        n[0] = char(0x56);263        r = c.in(m, n, n+2, np, &w, &w+1, wp);264        assert(r == std::codecvt_base::ok);265        assert(wp == &w+1);266        assert(np == n+2);267        assert(w == 0x56);268    }269    {270        typedef std::codecvt_utf16<char32_t> C;271        C c;272        char32_t w = 0;273        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};274        char32_t* wp = nullptr;275        std::mbstate_t m;276        const char* np = nullptr;277        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);278        assert(r == std::codecvt_base::ok);279        assert(wp == &w+1);280        assert(np == n+4);281        assert(w == 0x40003);282 283        n[0] = char(0x10);284        n[1] = char(0x05);285        r = c.in(m, n, n+2, np, &w, &w+1, wp);286        assert(r == std::codecvt_base::ok);287        assert(wp == &w+1);288        assert(np == n+2);289        assert(w == 0x1005);290 291        n[0] = char(0x04);292        n[1] = char(0x53);293        r = c.in(m, n, n+2, np, &w, &w+1, wp);294        assert(r == std::codecvt_base::ok);295        assert(wp == &w+1);296        assert(np == n+2);297        assert(w == 0x453);298 299        w = 0x56;300        n[0] = char(0x00);301        n[1] = char(0x56);302        r = c.in(m, n, n+2, np, &w, &w+1, wp);303        assert(r == std::codecvt_base::ok);304        assert(wp == &w+1);305        assert(np == n+2);306        assert(w == 0x56);307    }308    {309        typedef std::codecvt_utf16<char32_t, 0x1000> C;310        C c;311        char32_t w = 0;312        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};313        char32_t* wp = nullptr;314        std::mbstate_t m;315        const char* np = nullptr;316        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);317        assert(r == std::codecvt_base::error);318        assert(wp == &w);319        assert(np == n);320        assert(w == 0);321 322        n[0] = char(0x10);323        n[1] = char(0x05);324        r = c.in(m, n, n+2, np, &w, &w+1, wp);325        assert(r == std::codecvt_base::error);326        assert(wp == &w);327        assert(np == n);328        assert(w == 0);329 330        n[0] = char(0x04);331        n[1] = char(0x53);332        r = c.in(m, n, n+2, np, &w, &w+1, wp);333        assert(r == std::codecvt_base::ok);334        assert(wp == &w+1);335        assert(np == n+2);336        assert(w == 0x453);337 338        w = 0x56;339        n[0] = char(0x00);340        n[1] = char(0x56);341        r = c.in(m, n, n+2, np, &w, &w+1, wp);342        assert(r == std::codecvt_base::ok);343        assert(wp == &w+1);344        assert(np == n+2);345        assert(w == 0x56);346    }347    {348        typedef std::codecvt_utf16<char32_t, 0x10ffff, std::consume_header> C;349        C c;350        char32_t w = 0;351        char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};352        char32_t* wp = nullptr;353        std::mbstate_t m;354        const char* np = nullptr;355        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);356        assert(r == std::codecvt_base::ok);357        assert(wp == &w+1);358        assert(np == n+6);359        assert(w == 0x40003);360 361        n[0] = char(0x10);362        n[1] = char(0x05);363        r = c.in(m, n, n+2, np, &w, &w+1, wp);364        assert(r == std::codecvt_base::ok);365        assert(wp == &w+1);366        assert(np == n+2);367        assert(w == 0x1005);368 369        n[0] = char(0x04);370        n[1] = char(0x53);371        r = c.in(m, n, n+2, np, &w, &w+1, wp);372        assert(r == std::codecvt_base::ok);373        assert(wp == &w+1);374        assert(np == n+2);375        assert(w == 0x453);376 377        w = 0x56;378        n[0] = char(0x00);379        n[1] = char(0x56);380        r = c.in(m, n, n+2, np, &w, &w+1, wp);381        assert(r == std::codecvt_base::ok);382        assert(wp == &w+1);383        assert(np == n+2);384        assert(w == 0x56);385    }386    {387        typedef std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian> C;388        C c;389        char32_t w = 0;390        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};391        char32_t* wp = nullptr;392        std::mbstate_t m;393        const char* np = nullptr;394        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);395        assert(r == std::codecvt_base::ok);396        assert(wp == &w+1);397        assert(np == n+4);398        assert(w == 0x40003);399 400        n[1] = char(0x10);401        n[0] = char(0x05);402        r = c.in(m, n, n+2, np, &w, &w+1, wp);403        assert(r == std::codecvt_base::ok);404        assert(wp == &w+1);405        assert(np == n+2);406        assert(w == 0x1005);407 408        n[1] = char(0x04);409        n[0] = char(0x53);410        r = c.in(m, n, n+2, np, &w, &w+1, wp);411        assert(r == std::codecvt_base::ok);412        assert(wp == &w+1);413        assert(np == n+2);414        assert(w == 0x453);415 416        w = 0x56;417        n[1] = char(0x00);418        n[0] = char(0x56);419        r = c.in(m, n, n+2, np, &w, &w+1, wp);420        assert(r == std::codecvt_base::ok);421        assert(wp == &w+1);422        assert(np == n+2);423        assert(w == 0x56);424    }425    {426        typedef std::codecvt_utf16<char32_t, 0x1000, std::little_endian> C;427        C c;428        char32_t w = 0;429        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};430        char32_t* wp = nullptr;431        std::mbstate_t m;432        const char* np = nullptr;433        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);434        assert(r == std::codecvt_base::error);435        assert(wp == &w);436        assert(np == n);437        assert(w == 0);438 439        n[1] = char(0x10);440        n[0] = char(0x05);441        r = c.in(m, n, n+2, np, &w, &w+1, wp);442        assert(r == std::codecvt_base::error);443        assert(wp == &w);444        assert(np == n);445        assert(w == 0);446 447        n[1] = char(0x04);448        n[0] = char(0x53);449        r = c.in(m, n, n+2, np, &w, &w+1, wp);450        assert(r == std::codecvt_base::ok);451        assert(wp == &w+1);452        assert(np == n+2);453        assert(w == 0x453);454 455        w = 0x56;456        n[1] = char(0x00);457        n[0] = char(0x56);458        r = c.in(m, n, n+2, np, &w, &w+1, wp);459        assert(r == std::codecvt_base::ok);460        assert(wp == &w+1);461        assert(np == n+2);462        assert(w == 0x56);463    }464    {465        typedef std::codecvt_utf16<char32_t, 0x10ffff, std::codecvt_mode(466                                                         std::consume_header |467                                                         std::little_endian)> C;468        C c;469        char32_t w = 0;470        char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};471        char32_t* wp = nullptr;472        std::mbstate_t m;473        const char* np = nullptr;474        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);475        assert(r == std::codecvt_base::ok);476        assert(wp == &w+1);477        assert(np == n+6);478        assert(w == 0x40003);479 480        n[1] = char(0x10);481        n[0] = char(0x05);482        r = c.in(m, n, n+2, np, &w, &w+1, wp);483        assert(r == std::codecvt_base::ok);484        assert(wp == &w+1);485        assert(np == n+2);486        assert(w == 0x1005);487 488        n[1] = char(0x04);489        n[0] = char(0x53);490        r = c.in(m, n, n+2, np, &w, &w+1, wp);491        assert(r == std::codecvt_base::ok);492        assert(wp == &w+1);493        assert(np == n+2);494        assert(w == 0x453);495 496        w = 0x56;497        n[1] = char(0x00);498        n[0] = char(0x56);499        r = c.in(m, n, n+2, np, &w, &w+1, wp);500        assert(r == std::codecvt_base::ok);501        assert(wp == &w+1);502        assert(np == n+2);503        assert(w == 0x56);504    }505 506    {507        typedef std::codecvt_utf16<char16_t> C;508        C c;509        char16_t w = 0;510        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};511        char16_t* wp = nullptr;512        std::mbstate_t m;513        const char* np = nullptr;514        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);515        assert(r == std::codecvt_base::error);516        assert(wp == &w);517        assert(np == n);518        assert(w == 0);519 520        n[0] = char(0x10);521        n[1] = char(0x05);522        r = c.in(m, n, n+2, np, &w, &w+1, wp);523        assert(r == std::codecvt_base::ok);524        assert(wp == &w+1);525        assert(np == n+2);526        assert(w == 0x1005);527 528        n[0] = char(0x04);529        n[1] = char(0x53);530        r = c.in(m, n, n+2, np, &w, &w+1, wp);531        assert(r == std::codecvt_base::ok);532        assert(wp == &w+1);533        assert(np == n+2);534        assert(w == 0x453);535 536        w = 0x56;537        n[0] = char(0x00);538        n[1] = char(0x56);539        r = c.in(m, n, n+2, np, &w, &w+1, wp);540        assert(r == std::codecvt_base::ok);541        assert(wp == &w+1);542        assert(np == n+2);543        assert(w == 0x56);544    }545    {546        typedef std::codecvt_utf16<char16_t, 0x1000> C;547        C c;548        char16_t w = 0;549        char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};550        char16_t* wp = nullptr;551        std::mbstate_t m;552        const char* np = nullptr;553        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);554        assert(r == std::codecvt_base::error);555        assert(wp == &w);556        assert(np == n);557        assert(w == 0);558 559        n[0] = char(0x10);560        n[1] = char(0x05);561        r = c.in(m, n, n+2, np, &w, &w+1, wp);562        assert(r == std::codecvt_base::error);563        assert(wp == &w);564        assert(np == n);565        assert(w == 0);566 567        n[0] = char(0x04);568        n[1] = char(0x53);569        r = c.in(m, n, n+2, np, &w, &w+1, wp);570        assert(r == std::codecvt_base::ok);571        assert(wp == &w+1);572        assert(np == n+2);573        assert(w == 0x453);574 575        w = 0x56;576        n[0] = char(0x00);577        n[1] = char(0x56);578        r = c.in(m, n, n+2, np, &w, &w+1, wp);579        assert(r == std::codecvt_base::ok);580        assert(wp == &w+1);581        assert(np == n+2);582        assert(w == 0x56);583    }584    {585        typedef std::codecvt_utf16<char16_t, 0x10ffff, std::consume_header> C;586        C c;587        char16_t w = 0;588        char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};589        char16_t* wp = nullptr;590        std::mbstate_t m;591        const char* np = nullptr;592        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);593        assert(r == std::codecvt_base::error);594        assert(wp == &w);595        assert(np == n+2);596        assert(w == 0);597 598        n[0] = char(0x10);599        n[1] = char(0x05);600        r = c.in(m, n, n+2, np, &w, &w+1, wp);601        assert(r == std::codecvt_base::ok);602        assert(wp == &w+1);603        assert(np == n+2);604        assert(w == 0x1005);605 606        n[0] = char(0x04);607        n[1] = char(0x53);608        r = c.in(m, n, n+2, np, &w, &w+1, wp);609        assert(r == std::codecvt_base::ok);610        assert(wp == &w+1);611        assert(np == n+2);612        assert(w == 0x453);613 614        w = 0x56;615        n[0] = char(0x00);616        n[1] = char(0x56);617        r = c.in(m, n, n+2, np, &w, &w+1, wp);618        assert(r == std::codecvt_base::ok);619        assert(wp == &w+1);620        assert(np == n+2);621        assert(w == 0x56);622    }623    {624        typedef std::codecvt_utf16<char16_t, 0x10ffff, std::little_endian> C;625        C c;626        char16_t w = 0;627        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};628        char16_t* wp = nullptr;629        std::mbstate_t m;630        const char* np = nullptr;631        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);632        assert(r == std::codecvt_base::error);633        assert(wp == &w);634        assert(np == n);635        assert(w == 0);636 637        n[1] = char(0x10);638        n[0] = char(0x05);639        r = c.in(m, n, n+2, np, &w, &w+1, wp);640        assert(r == std::codecvt_base::ok);641        assert(wp == &w+1);642        assert(np == n+2);643        assert(w == 0x1005);644 645        n[1] = char(0x04);646        n[0] = char(0x53);647        r = c.in(m, n, n+2, np, &w, &w+1, wp);648        assert(r == std::codecvt_base::ok);649        assert(wp == &w+1);650        assert(np == n+2);651        assert(w == 0x453);652 653        w = 0x56;654        n[1] = char(0x00);655        n[0] = char(0x56);656        r = c.in(m, n, n+2, np, &w, &w+1, wp);657        assert(r == std::codecvt_base::ok);658        assert(wp == &w+1);659        assert(np == n+2);660        assert(w == 0x56);661    }662    {663        typedef std::codecvt_utf16<char16_t, 0x1000, std::little_endian> C;664        C c;665        char16_t w = 0;666        char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};667        char16_t* wp = nullptr;668        std::mbstate_t m;669        const char* np = nullptr;670        std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);671        assert(r == std::codecvt_base::error);672        assert(wp == &w);673        assert(np == n);674        assert(w == 0);675 676        n[1] = char(0x10);677        n[0] = char(0x05);678        r = c.in(m, n, n+2, np, &w, &w+1, wp);679        assert(r == std::codecvt_base::error);680        assert(wp == &w);681        assert(np == n);682        assert(w == 0);683 684        n[1] = char(0x04);685        n[0] = char(0x53);686        r = c.in(m, n, n+2, np, &w, &w+1, wp);687        assert(r == std::codecvt_base::ok);688        assert(wp == &w+1);689        assert(np == n+2);690        assert(w == 0x453);691 692        w = 0x56;693        n[1] = char(0x00);694        n[0] = char(0x56);695        r = c.in(m, n, n+2, np, &w, &w+1, wp);696        assert(r == std::codecvt_base::ok);697        assert(wp == &w+1);698        assert(np == n+2);699        assert(w == 0x56);700    }701    {702        typedef std::codecvt_utf16<char16_t, 0x10ffff, std::codecvt_mode(703                                                         std::consume_header |704                                                         std::little_endian)> C;705        C c;706        char16_t w = 0;707        char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};708        char16_t* wp = nullptr;709        std::mbstate_t m;710        const char* np = nullptr;711        std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);712        assert(r == std::codecvt_base::error);713        assert(wp == &w);714        assert(np == n+2);715        assert(w == 0);716 717        n[1] = char(0x10);718        n[0] = char(0x05);719        r = c.in(m, n, n+2, np, &w, &w+1, wp);720        assert(r == std::codecvt_base::ok);721        assert(wp == &w+1);722        assert(np == n+2);723        assert(w == 0x1005);724 725        n[1] = char(0x04);726        n[0] = char(0x53);727        r = c.in(m, n, n+2, np, &w, &w+1, wp);728        assert(r == std::codecvt_base::ok);729        assert(wp == &w+1);730        assert(np == n+2);731        assert(w == 0x453);732 733        w = 0x56;734        n[1] = char(0x00);735        n[0] = char(0x56);736        r = c.in(m, n, n+2, np, &w, &w+1, wp);737        assert(r == std::codecvt_base::ok);738        assert(wp == &w+1);739        assert(np == n+2);740        assert(w == 0x56);741    }742 743  return 0;744}745