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_utf8_utf16
     15 //     : public codecvt<Elem, char, mbstate_t>
     16 // {
     17 //     // unspecified
     18 // };
     19 
     20 // result
     21 // out(stateT& state,
     22 //     const internT* from, const internT* from_end, const internT*& from_next,
     23 //     externT* to, externT* to_end, externT*& to_next) const;
     24 
     25 #include <codecvt>
     26 #include <cassert>
     27 
     28 int main()
     29 {
     30     {
     31         typedef std::codecvt_utf8_utf16<wchar_t> C;
     32         C c;
     33         wchar_t w[2] = {0xD8C0, 0xDC03};
     34         char n[4] = {0};
     35         const wchar_t* wp = nullptr;
     36         std::mbstate_t m;
     37         char* np = nullptr;
     38         std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+4, np);
     39         assert(r == std::codecvt_base::ok);
     40         assert(wp == w+2);
     41         assert(np == n+4);
     42         assert(n[0] == char(0xF1));
     43         assert(n[1] == char(0x80));
     44         assert(n[2] == char(0x80));
     45         assert(n[3] == char(0x83));
     46 
     47         w[0] = 0x1005;
     48         r = c.out(m, w, w+1, wp, n, n+4, np);
     49         assert(r == std::codecvt_base::ok);
     50         assert(wp == w+1);
     51         assert(np == n+3);
     52         assert(n[0] == char(0xE1));
     53         assert(n[1] == char(0x80));
     54         assert(n[2] == char(0x85));
     55 
     56         w[0] = 0x453;
     57         r = c.out(m, w, w+1, wp, n, n+4, np);
     58         assert(r == std::codecvt_base::ok);
     59         assert(wp == w+1);
     60         assert(np == n+2);
     61         assert(n[0] == char(0xD1));
     62         assert(n[1] == char(0x93));
     63 
     64         w[0] = 0x56;
     65         r = c.out(m, w, w+1, wp, n, n+4, np);
     66         assert(r == std::codecvt_base::ok);
     67         assert(wp == w+1);
     68         assert(np == n+1);
     69         assert(n[0] == char(0x56));
     70     }
     71     {
     72         typedef std::codecvt_utf8_utf16<wchar_t, 0x1000> C;
     73         C c;
     74         wchar_t w[2] = {0xD8C0, 0xDC03};
     75         char n[4] = {0};
     76         const wchar_t* wp = nullptr;
     77         std::mbstate_t m;
     78         char* np = nullptr;
     79         std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+4, np);
     80         assert(r == std::codecvt_base::error);
     81         assert(wp == w);
     82         assert(np == n);
     83 
     84         w[0] = 0x1005;
     85         r = c.out(m, w, w+1, wp, n, n+4, np);
     86         assert(r == std::codecvt_base::error);
     87         assert(wp == w);
     88         assert(np == n);
     89 
     90         w[0] = 0x453;
     91         r = c.out(m, w, w+1, wp, n, n+4, np);
     92         assert(r == std::codecvt_base::ok);
     93         assert(wp == w+1);
     94         assert(np == n+2);
     95         assert(n[0] == char(0xD1));
     96         assert(n[1] == char(0x93));
     97 
     98         w[0] = 0x56;
     99         r = c.out(m, w, w+1, wp, n, n+4, np);
    100         assert(r == std::codecvt_base::ok);
    101         assert(wp == w+1);
    102         assert(np == n+1);
    103         assert(n[0] == char(0x56));
    104     }
    105     {
    106         typedef std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::generate_header> C;
    107         C c;
    108         wchar_t w[2] = {0xD8C0, 0xDC03};
    109         char n[7] = {0};
    110         const wchar_t* wp = nullptr;
    111         std::mbstate_t m;
    112         char* np = nullptr;
    113         std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+7, np);
    114         assert(r == std::codecvt_base::ok);
    115         assert(wp == w+2);
    116         assert(np == n+7);
    117         assert(n[0] == char(0xEF));
    118         assert(n[1] == char(0xBB));
    119         assert(n[2] == char(0xBF));
    120         assert(n[3] == char(0xF1));
    121         assert(n[4] == char(0x80));
    122         assert(n[5] == char(0x80));
    123         assert(n[6] == char(0x83));
    124 
    125         w[0] = 0x1005;
    126         r = c.out(m, w, w+1, wp, n, n+7, np);
    127         assert(r == std::codecvt_base::ok);
    128         assert(wp == w+1);
    129         assert(np == n+6);
    130         assert(n[0] == char(0xEF));
    131         assert(n[1] == char(0xBB));
    132         assert(n[2] == char(0xBF));
    133         assert(n[3] == char(0xE1));
    134         assert(n[4] == char(0x80));
    135         assert(n[5] == char(0x85));
    136 
    137         w[0] = 0x453;
    138         r = c.out(m, w, w+1, wp, n, n+7, np);
    139         assert(r == std::codecvt_base::ok);
    140         assert(wp == w+1);
    141         assert(np == n+5);
    142         assert(n[0] == char(0xEF));
    143         assert(n[1] == char(0xBB));
    144         assert(n[2] == char(0xBF));
    145         assert(n[3] == char(0xD1));
    146         assert(n[4] == char(0x93));
    147 
    148         w[0] = 0x56;
    149         r = c.out(m, w, w+1, wp, n, n+7, np);
    150         assert(r == std::codecvt_base::ok);
    151         assert(wp == w+1);
    152         assert(np == n+4);
    153         assert(n[0] == char(0xEF));
    154         assert(n[1] == char(0xBB));
    155         assert(n[2] == char(0xBF));
    156         assert(n[3] == char(0x56));
    157     }
    158     {
    159         typedef std::codecvt_utf8_utf16<char32_t> C;
    160         C c;
    161         char32_t w[2] = {0xD8C0, 0xDC03};
    162         char n[4] = {0};
    163         const char32_t* wp = nullptr;
    164         std::mbstate_t m;
    165         char* np = nullptr;
    166         std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+4, np);
    167         assert(r == std::codecvt_base::ok);
    168         assert(wp == w+2);
    169         assert(np == n+4);
    170         assert(n[0] == char(0xF1));
    171         assert(n[1] == char(0x80));
    172         assert(n[2] == char(0x80));
    173         assert(n[3] == char(0x83));
    174 
    175         w[0] = 0x1005;
    176         r = c.out(m, w, w+1, wp, n, n+4, np);
    177         assert(r == std::codecvt_base::ok);
    178         assert(wp == w+1);
    179         assert(np == n+3);
    180         assert(n[0] == char(0xE1));
    181         assert(n[1] == char(0x80));
    182         assert(n[2] == char(0x85));
    183 
    184         w[0] = 0x453;
    185         r = c.out(m, w, w+1, wp, n, n+4, np);
    186         assert(r == std::codecvt_base::ok);
    187         assert(wp == w+1);
    188         assert(np == n+2);
    189         assert(n[0] == char(0xD1));
    190         assert(n[1] == char(0x93));
    191 
    192         w[0] = 0x56;
    193         r = c.out(m, w, w+1, wp, n, n+4, np);
    194         assert(r == std::codecvt_base::ok);
    195         assert(wp == w+1);
    196         assert(np == n+1);
    197         assert(n[0] == char(0x56));
    198     }
    199     {
    200         typedef std::codecvt_utf8_utf16<char32_t, 0x1000> C;
    201         C c;
    202         char32_t w[2] = {0xD8C0, 0xDC03};
    203         char n[4] = {0};
    204         const char32_t* wp = nullptr;
    205         std::mbstate_t m;
    206         char* np = nullptr;
    207         std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+4, np);
    208         assert(r == std::codecvt_base::error);
    209         assert(wp == w);
    210         assert(np == n);
    211 
    212         w[0] = 0x1005;
    213         r = c.out(m, w, w+1, wp, n, n+4, np);
    214         assert(r == std::codecvt_base::error);
    215         assert(wp == w);
    216         assert(np == n);
    217 
    218         w[0] = 0x453;
    219         r = c.out(m, w, w+1, wp, n, n+4, np);
    220         assert(r == std::codecvt_base::ok);
    221         assert(wp == w+1);
    222         assert(np == n+2);
    223         assert(n[0] == char(0xD1));
    224         assert(n[1] == char(0x93));
    225 
    226         w[0] = 0x56;
    227         r = c.out(m, w, w+1, wp, n, n+4, np);
    228         assert(r == std::codecvt_base::ok);
    229         assert(wp == w+1);
    230         assert(np == n+1);
    231         assert(n[0] == char(0x56));
    232     }
    233     {
    234         typedef std::codecvt_utf8_utf16<char32_t, 0x10ffff, std::generate_header> C;
    235         C c;
    236         char32_t w[2] = {0xD8C0, 0xDC03};
    237         char n[7] = {0};
    238         const char32_t* wp = nullptr;
    239         std::mbstate_t m;
    240         char* np = nullptr;
    241         std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+7, np);
    242         assert(r == std::codecvt_base::ok);
    243         assert(wp == w+2);
    244         assert(np == n+7);
    245         assert(n[0] == char(0xEF));
    246         assert(n[1] == char(0xBB));
    247         assert(n[2] == char(0xBF));
    248         assert(n[3] == char(0xF1));
    249         assert(n[4] == char(0x80));
    250         assert(n[5] == char(0x80));
    251         assert(n[6] == char(0x83));
    252 
    253         w[0] = 0x1005;
    254         r = c.out(m, w, w+1, wp, n, n+7, np);
    255         assert(r == std::codecvt_base::ok);
    256         assert(wp == w+1);
    257         assert(np == n+6);
    258         assert(n[0] == char(0xEF));
    259         assert(n[1] == char(0xBB));
    260         assert(n[2] == char(0xBF));
    261         assert(n[3] == char(0xE1));
    262         assert(n[4] == char(0x80));
    263         assert(n[5] == char(0x85));
    264 
    265         w[0] = 0x453;
    266         r = c.out(m, w, w+1, wp, n, n+7, np);
    267         assert(r == std::codecvt_base::ok);
    268         assert(wp == w+1);
    269         assert(np == n+5);
    270         assert(n[0] == char(0xEF));
    271         assert(n[1] == char(0xBB));
    272         assert(n[2] == char(0xBF));
    273         assert(n[3] == char(0xD1));
    274         assert(n[4] == char(0x93));
    275 
    276         w[0] = 0x56;
    277         r = c.out(m, w, w+1, wp, n, n+7, np);
    278         assert(r == std::codecvt_base::ok);
    279         assert(wp == w+1);
    280         assert(np == n+4);
    281         assert(n[0] == char(0xEF));
    282         assert(n[1] == char(0xBB));
    283         assert(n[2] == char(0xBF));
    284         assert(n[3] == char(0x56));
    285     }
    286 
    287     {
    288         typedef std::codecvt_utf8_utf16<char16_t> C;
    289         C c;
    290         char16_t w[2] = {0xD8C0, 0xDC03};
    291         char n[4] = {0};
    292         const char16_t* wp = nullptr;
    293         std::mbstate_t m;
    294         char* np = nullptr;
    295         std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+4, np);
    296         assert(r == std::codecvt_base::ok);
    297         assert(wp == w+2);
    298         assert(np == n+4);
    299         assert(n[0] == char(0xF1));
    300         assert(n[1] == char(0x80));
    301         assert(n[2] == char(0x80));
    302         assert(n[3] == char(0x83));
    303 
    304         w[0] = 0x1005;
    305         r = c.out(m, w, w+1, wp, n, n+4, np);
    306         assert(r == std::codecvt_base::ok);
    307         assert(wp == w+1);
    308         assert(np == n+3);
    309         assert(n[0] == char(0xE1));
    310         assert(n[1] == char(0x80));
    311         assert(n[2] == char(0x85));
    312 
    313         w[0] = 0x453;
    314         r = c.out(m, w, w+1, wp, n, n+4, np);
    315         assert(r == std::codecvt_base::ok);
    316         assert(wp == w+1);
    317         assert(np == n+2);
    318         assert(n[0] == char(0xD1));
    319         assert(n[1] == char(0x93));
    320 
    321         w[0] = 0x56;
    322         r = c.out(m, w, w+1, wp, n, n+4, np);
    323         assert(r == std::codecvt_base::ok);
    324         assert(wp == w+1);
    325         assert(np == n+1);
    326         assert(n[0] == char(0x56));
    327     }
    328     {
    329         typedef std::codecvt_utf8_utf16<char16_t, 0x1000> C;
    330         C c;
    331         char16_t w[2] = {0xD8C0, 0xDC03};
    332         char n[4] = {0};
    333         const char16_t* wp = nullptr;
    334         std::mbstate_t m;
    335         char* np = nullptr;
    336         std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+4, np);
    337         assert(r == std::codecvt_base::error);
    338         assert(wp == w);
    339         assert(np == n);
    340 
    341         w[0] = 0x1005;
    342         r = c.out(m, w, w+1, wp, n, n+4, np);
    343         assert(r == std::codecvt_base::error);
    344         assert(wp == w);
    345         assert(np == n);
    346 
    347         w[0] = 0x453;
    348         r = c.out(m, w, w+1, wp, n, n+4, np);
    349         assert(r == std::codecvt_base::ok);
    350         assert(wp == w+1);
    351         assert(np == n+2);
    352         assert(n[0] == char(0xD1));
    353         assert(n[1] == char(0x93));
    354 
    355         w[0] = 0x56;
    356         r = c.out(m, w, w+1, wp, n, n+4, np);
    357         assert(r == std::codecvt_base::ok);
    358         assert(wp == w+1);
    359         assert(np == n+1);
    360         assert(n[0] == char(0x56));
    361     }
    362     {
    363         typedef std::codecvt_utf8_utf16<char16_t, 0x10ffff, std::generate_header> C;
    364         C c;
    365         char16_t w[2] = {0xD8C0, 0xDC03};
    366         char n[7] = {0};
    367         const char16_t* wp = nullptr;
    368         std::mbstate_t m;
    369         char* np = nullptr;
    370         std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+7, np);
    371         assert(r == std::codecvt_base::ok);
    372         assert(wp == w+2);
    373         assert(np == n+7);
    374         assert(n[0] == char(0xEF));
    375         assert(n[1] == char(0xBB));
    376         assert(n[2] == char(0xBF));
    377         assert(n[3] == char(0xF1));
    378         assert(n[4] == char(0x80));
    379         assert(n[5] == char(0x80));
    380         assert(n[6] == char(0x83));
    381 
    382         w[0] = 0x1005;
    383         r = c.out(m, w, w+1, wp, n, n+7, np);
    384         assert(r == std::codecvt_base::ok);
    385         assert(wp == w+1);
    386         assert(np == n+6);
    387         assert(n[0] == char(0xEF));
    388         assert(n[1] == char(0xBB));
    389         assert(n[2] == char(0xBF));
    390         assert(n[3] == char(0xE1));
    391         assert(n[4] == char(0x80));
    392         assert(n[5] == char(0x85));
    393 
    394         w[0] = 0x453;
    395         r = c.out(m, w, w+1, wp, n, n+7, np);
    396         assert(r == std::codecvt_base::ok);
    397         assert(wp == w+1);
    398         assert(np == n+5);
    399         assert(n[0] == char(0xEF));
    400         assert(n[1] == char(0xBB));
    401         assert(n[2] == char(0xBF));
    402         assert(n[3] == char(0xD1));
    403         assert(n[4] == char(0x93));
    404 
    405         w[0] = 0x56;
    406         r = c.out(m, w, w+1, wp, n, n+7, np);
    407         assert(r == std::codecvt_base::ok);
    408         assert(wp == w+1);
    409         assert(np == n+4);
    410         assert(n[0] == char(0xEF));
    411         assert(n[1] == char(0xBB));
    412         assert(n[2] == char(0xBF));
    413         assert(n[3] == char(0x56));
    414     }
    415 }
    416