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