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